MASUDAQ Blog

NO DEVELOPMENT NO LIFE.

CentOS 5.4 で Apach Tomcat 6 をデーモンとして起動する。

CentOS 5.4 へ Apach Tomcat 6 をインストールし、デーモンにする。

前回は、CentOS 5.4 への Apach Tomcat 6 を紹介した。今回は、開発環境ではなく、運用環境として、Tomcat 6 をセットアップする方法を紹介する。

ここで、紹介する運用環境とは、以下の通り。

  • Tomcat をデーモンとして起動する。

  • Tomcat プロセスを専用のユーザーコンテキストで起動する。

デーモンとして起動するのは、Windows ユーザーであれば、サービスとして起動するとすれば分かりやすいだろいう。次のデーモン専用のユーザーコンテキストで起動するのは、これもまた、Windows であれば、サービスアカウントで起動するとできる。

Tomcat をデーモンとして起動するためには、commons-daemon プロジェクトの "jsvc tool" を利用する。Tomcat 6 のバイナリモジュール内には、この "jsvc" のソースコードが含まれている。このソースファイルを運用環境上でコンパイルし、jsvc をビルドする。jsvc をビルドするには、以下の環境が必要となる。

  • GCC (C コンパイラ)
  • GNU Autoconf
  • JDK

GCC がインストールされていない場合は、以下のようにインストールする。

>yum install gcc

GNU Autoconf がインストールされていない場合は、以下のようにインストールする。

>yum install autoconf

JDK は、http://developers.sun.com/ -> [Downloads] -> [Java SE] -> [Download JDK] から、[Platform] ドロップダウンから、"Linux" を選択し、最新の JDK をダウンロードする。今回は、RPM パッケージである "jdk-6u18-linux-i586-rpm.bin" をダウンロードし、インストールする。ここで注意すべきことは、jsvc のコンパイルには、JDK が必要だが、Tomcat 6 の実行には、JRE があれば良い。ここでは、jsvc をコンパイルするためだけに JDK をインストーする。

ダウンロードした "jdk-6u18-linux-i586-rpm.bin" を適当な場所にコピーする。ここでは、/tmp にコピーした。"jdk-6u18-linux-i586-rpm.bin" に実行権限を付与する。

>su
>chmod +x /tmp/jdk-6u18-linux-i586-rpm.bin

インストールを開始する。

>/tmp/jdk-6u18-linux-i586-rpm.bin
Sun Microsystems, Inc. Binary Code License Agreement

...

Please enter "yes" or "no".
Do you agree to the above license terms? [yes or no] y
Unpacking...
Checksumming...
Extracting...
UnZipSFX 5.50 of 17 February 2002, by Info-ZIP (Zip-Bugs@lists.wku.edu).
 inflating: jdk-6u18-linux-i586.rpm
inflating: sun-javadb-common-10.5.3-0.2.i386.rpm
inflating: sun-javadb-core-10.5.3-0.2.i386.rpm
inflating: sun-javadb-client-10.5.3-0.2.i386.rpm
inflating: sun-javadb-demo-10.5.3-0.2.i386.rpm
inflating: sun-javadb-docs-10.5.3-0.2.i386.rpm
inflating: sun-javadb-javadoc-10.5.3-0.2.i386.rpm
準備中... ########################################### [100%]
1:jdk ########################################### [100%]
Unpacking JAR files...
rt.jar...
jsse.jar...
charsets.jar...
tools.jar...
localedata.jar...
plugin.jar...
javaws.jar...
deploy.jar...
Installing JavaDB
準備中... ########################################### [100%]
1:sun-javadb-common ########################################### [ 17%]
2:sun-javadb-core ########################################### [ 33%]
3:sun-javadb-client ########################################### [ 50%]
4:sun-javadb-demo ########################################### [ 67%]
5:sun-javadb-docs ########################################### [ 83%]
6:sun-javadb-javadoc ########################################### [100%]

Java(TM) SE Development Kit 6 successfully installed.

...

Done.

"/usr/java/jdk1.6.0_18" に JDK がインストールされたことを確認する。

>ls /usr/java/jdk1.6.0_18/
COPYRIGHT THIRDPARTYLICENSEREADME.txt lib
sample LICENSE bin man
src.zip README.html demo register.html
README_ja.html include register_ja.html README_zh_CN.html
jre register_zh_CN.html

"JAVA_HOME" 環境変数にインストールした JDK のパスを定義する。前述にもある通り、JDK は、jsvc のコンパイルに必要なだけなので、以下のコマンドを起動プロファイルに定義し、ログイン毎に定義する必要はない。"JAVA_HOME" 環境変数は、jsvc のコンパイル時だけに必要だ。

>export JAVA_HOME=/usr/java/jdk1.6.0_18/

正しく、設定されたかを確認する。

>printenv
...
JAVA_HOME=/usr/java/jdk1.6.0_18/
...

Tomcat のインストール先の bin に移動する。前回の手順では、Tomcat を、"/usr/local/apache-tomcat-6.0.26" にインストールした。また、Tomcat のインストール先は、"CATALINA_HOME" 環境変数として知られているが、jsvc のコンパイルには、"CATALINA_HOME" 環境変数の定義は必要ない。

>cd /usr/local/apache-tomcat-6.0.26/bin

"/usr/local/apache-tomcat-6.0.26/bin" に "jsvc.tar.gz" があることを確認する。

>ls
bootstrap.jar digest.bat shutdown.sh
tool-wrapper.sh catalina-tasks.xml digest.sh
startup.bat version.bat catalina.bat
jsvc.tar.gz startup.sh version.sh
catalina.sh setclasspath.bat tomcat-juli.jar
commons-daemon.jar setclasspath.sh tomcat-native.tar.gz
cpappend.bat shutdown.bat tool-wrapper.bat

ファイルを展開し、ソースコードディレクトリ "/usr/local/apache-tomcat-6.0.26/bin/jsvc-src" へ移動。

>tar xvfz jsvc.tar.gz
>cd jsvc-src

"configure" ファイルに実行権限を付与。

>chmod +x configure

スクリプトを作成する。

>autoconf

configure スクリプトを実行する。

>./configure
*** Current host ***
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking cached host system type... ok
*** C-Language compilation tools ***
cchecking for gcc... gcc
checking for C compiler default output file name... a.out checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed checking for ranlib... ranlib *** Host support ***
checking C flags dependant on host system type... ok
*** Java compilation tools ***
checking for javac... /usr/java/jdk1.6.0_18//bin/javac
checking wether the Java compiler (/usr/java/jdk1.6.0_18//bin/javac) works... yes
checking for jar... /usr/java/jdk1.6.0_18//bin/jar gcc flags added
*** Writing output files ***
configure: creating ./config.status
config.status:
creating Makefile
config.status: creating Makedefs
config.status: creating native/Makefile
*** All done ***
Now you can issue "make"

"make" でビルドする。

>make
make -C native all
make[1]: ディレクトリ `/usr/local/apache-tomcat-6.0.26/bin/jsvc-src/native' に入ります
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/jdk1.6.0_18//include -I/usr/java/jdk1.6.0_18//include/linux -Wall -Wstrict-prototypes -c jsvc-unix.c -o jsvc-unix.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/jdk1.6.0_18//include -I/usr/java/jdk1.6.0_18//include/linux -Wall -Wstrict-prototypes -c
arguments.c -o arguments.o arguments.c: In function 'arguments':
arguments.c:251: 警告: unused variable 'temp'
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/jdk1.6.0_18//include -I/usr/java/jdk1.6.0_18//include/linux -Wall -Wstrict-prototypes -c debug.c -o debug.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/jdk1.6.0_18//include -I/usr/java/jdk1.6.0_18//include/linux -Wall -Wstrict-prototypes -c dso-dlfcn.c -o dso-dlfcn.o
dso-dlfcn.c:51: 警告: function declaration isn't a prototype
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/jdk1.6.0_18//include -I/usr/java/jdk1.6.0_18//include/linux -Wall -Wstrict-prototypes -c dso-dyld.c -o dso-dyld.o
ggcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/jdk1.6.0_18//include -I/usr/java/jdk1.6.0_18//include/linux -Wall -Wstrict-prototypes -c help.c -o help.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/jdk1.6.0_18//include -I/usr/java/jdk1.6.0_18//include/linux -Wall -Wstrict-prototypes -c home.c -o home.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/jdk1.6.0_18//include -I/usr/java/jdk1.6.0_18//include/linux -Wall -Wstrict-prototypes -c java.c -o java.o
java.c:49: 警告: function declaration isn't a prototype
java.c: In function 'java_init':
java.c:122: 警告: implicit declaration of function 'dso_error'
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/jdk1.6.0_18//include -I/usr/java/jdk1.6.0_18//include/linux -Wall -Wstrict-prototypes -c location.c -o location.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/jdk1.6.0_18//include -I/usr/java/jdk1.6.0_18//include/linux -Wall -Wstrict-prototypes -c replace.c -o replace.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/jdk1.6.0_18//include -I/usr/java/jdk1.6.0_18//include/linux -Wall -Wstrict-prototypes -c signals.c -o signals.o
ar cr libservice.a arguments.o debug.o dso-dlfcn.o dso-dyld.o help.o home.o java.o location.o replace.o signals.o
ranlib libservice.a
gcc -ldl -lpthread jsvc-unix.o libservice.a -o ../jsvc
make[1]: ディレクトリ `/usr/local/apache-tomcat-6.0.26/bin/jsvc-src/native' から出ます

"jsvc" がビルドされたことを確認する。

>ls
CHANGES.txt Makedefs.in autom4te.cache configure
man INSTALL.txt Makefile config.log configure.in
native Makedefs Makefile.in config.status
jsvc support

"jsvc" を上位のディレクトリ (/usr/local/apache-tomcat-6.0.26/bin/) にコピーする。

>cp jsvc ..

次に、Tomcat プロセスを起動するユーザー "tommy " を作成する。

>su
>/usr/sbin/useradd -d /usr/local/apache-tomcat-6.0.26/ -s /sbin/nologin tommy
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.

パスワードの設定

>su
>passwd tommy
Changing password for user tommy.
New UNIX password:
Retype new UNIX password: passwd:
all authentication tokens updated successfully.

ユユユーザー "tommy" に "/usr/local/apache-tomcat-6.0.26/"  の所有権を付与する。

>su
>chown -R tommy /usr/local/apache-tomcat-6.0.26/

"$CATALINA_HOME" へ移動する。

>cd /usr/local/apache-tomcat-6.0.26/

Tomcat をデーモンとして起動する。

>su
>./bin/jsvc -cp ./bin/bootstrap.jar -user tommy -home /usr/java/jre1.6.0_18/ -outfile ./logs/catalina.out -errfile ./logs/catalina.err org.apache.catalina.startup.Bootstrap

"-user" オプションは、デーモンを起動するユーザーを指定する。"-home" オプションは、JRE の場所を指定する。JDK の場所でも良い。このオプションを指定しない場合は、"JAVA_HOME" 環境変数が参照される。

"-outfile"、"-errfile" は、ログ、エラーログファイルを指定する。起動に失敗する場合は、これらのファイルを参照してトラブルシュートに役立てるといいだろう。

http://localhost:8080/  にアクセスして、Tomcat が起動していることを確認する。

Tomcat を停止する。

>./bin/jsvc -stop org.apache.catalina.startup.Bootstrap

http://localhost:8080/  にアクセスして、Tomcat が停止していることを確認する。ブラウザを更新し、キャッシュでなく、Tomcat が正しく停止していることを確認する。

次回は、デーモン起動スクリプトの作成方法について紹介する。

 

このエントリーをはてなブックマークに追加