apache2.2.3+tomcat6.0.26 (目次) †
はじめに †
apache+tomcatの環境を構築します。データベースはPostgreSQLの利用を前提として
JDBCをインストールします。
尚、PostgreSQL(IP 192.168.11.101)は下記を前提に構築済とします。
環境 †
- ホスト名(IP)
- serv202(192.168.11.202)
- OS
- CentOS 5.4 (kernel 2.6.18-164.11.1.el5)
- パッケージ
- httpd-2.2.3-31.el5.centos.2
- httpd-devel-2.2.3-31.el5.centos.2
- mod_ssl-2.2.3-31.el5.centos.2
- tomcat 5.3.2
- mod_jk 1.2.30
- JDK 1.6.0_18
- postgresql-8.4-701.jdbc4.jar
パッケージのインストール †
apacheのインストール †
- apacheのインストール(openldap-develもインストールされます)
# yum install httpd # yum install httpd-devel
- apache用のSSLモジュールをインストール
# yum install mod_ssl
mod_jkのインストール †
- apacheとtomcatを連携させるためmod_jkをインストールします。
# wget http://ftp.kddilabs.jp/infosystems/apache/tomcat/tomcat-connectors/jk/source/jk-1.2.30/tomcat-connectors-1.2.30-src.tar.gz # tar zxvf tomcat-connectors-1.2.30-src.tar.gz # cd tomcat-connectors-1.2.30-src/native # ./configure --with-apxs # make # make install
JDKのインストール †
- 以下のサイトからJDKをダウンロードします。
http://java.sun.com/javase/downloads/index.jsp
- JDKをインストールします。
# chmod u+x jdk-6u13-linux-i586-rpm.bin # ./jdk-6u18-linux-i586-rpm.bin Do you agree to the above license terms? [yes or no] yes
- 確認のためJDKのバージョンを表示させます。
# java -version java version "1.6.0_18" Java(TM) SE Runtime Environment (build 1.6.0_18-b07) Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)
JDBCのインストール †
- PostgreSQLと接続するためにJDBCをインストールします。
# wget http://jdbc.postgresql.org/download/postgresql-8.4-701.jdbc4.jar # cp postgresql-8.4-701.jdbc4.jar /usr/local/tomcat/lib/
tomcatのインストール †
- tomcatは最新版をソースからインストールします。
# wget http://ftp.riken.jp/net/apache/tomcat/tomcat-6/v6.0.26/bin/apache-tomcat-6.0.26.tar.gz # tar zxvf apache-tomcat-6.0.26.tar.gz # mv apache-tomcat-6.0.26 /usr/local/tomcat # useradd tomcat -d /usr/local/tomcat # chown -R tomcat:tomcat /usr/local/tomcat
設定 †
tomcatの設定 †
環境変数の設定 †
- Tomcat関連の環境変数を設定します。
クラスパスにはJDBCとサーブレット用の設定を追加しています。# vi /etc/profile JAVA_HOME=/usr/java/jdk1.6.0_18 CATALINA_HOME=/usr/local/tomcat PATH=$PATH:$JAVA_HOME/bin CLASSPATH=.:$CATALINA_HOME/lib/postgresql-8.4-701.jdbc4.jar:$CATALINA_HOME/lib/servlet-api.jar export JAVA_HOME CLASSPATH PATH
- 環境変数を反映します。
# source /etc/profile
server.xmlの編集 †
- ポート8080番はapacheとtomcatの連携で不要になるため、コメントにして無効にします。
ポート8009番はapacheとの連携に利用するため、デフォルトの設定内容を確認しておきます。# vi /usr/local/tomcat/conf/server.xml <!-- <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> --> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
ログ設定 †
- /var/log配下にログが保存されるよう変更します。
# mv /usr/local/tomcat/logs/ /var/log/tomcat # ln -s /var/log/tomcat /usr/local/tomcat/logs
- logrotateの設定を行います。
tomcat用のlogrotateファイルを作成します。
# vi /etc/logrotate.d/tomcat /var/log/tomcat/catalina.out { copytruncate weekly rotate 52 compress missingok }
logrotateファイルの確認を行います。errorで始まる行がなければ問題ありません。# logrotate -d /etc/logrotate.d/tomcat
最後にsyslogを再起動します。# /etc/init.d/syslog restart
apacheの設定 †
workers.propertiesの作成 †
- server.xmlに合わせてworkers.propertiesを作成します。
# vi /etc/httpd/conf/workers.properties worker.list=tomcat worker.tomcat.port=8009 worker.tomcat.host=localhost worker.tomcat.type=ajp13
設定項目 説明 worker.list workerの名前を定義します。 worker.*.port Tomcatの待ち受けPortを指定します worker.*.host TomcatサーバのIPを指定します worker.*.type 「ajp12」or「ajp13」を指定します。
httpd.confの編集 †
- apacheの設定ファイル「/etc/httpd/conf/httpd.conf」を編集します。
行数はあくまで目安です。
# vi /etc/httpd/conf/httpd.conf #44行目 ヘッダ情報にapacheのパージョンなどを含めないよう制限します ServerTokens Prod #266行目 サーバ名を設定します ServerName www.oss-d.net:80 #329行目「/var/www/html」以下のディレクトリでhtaccessを有効にします AllowOverride All #526行目 エラーページの設定(サーバのバージョンやホスト名を出力しない) ServerSignature Off #749行目 デフォルトの文字コードを指定します AddDefaultCharset UTF-8 #最終行 mod_jkに対するの設定を行います LoadModule jk_module modules/mod_jk.so <IfModule mod_jk.c> JkWorkersFile /etc/httpd/conf/workers.properties JkLogFile /var/log/httpd/mod_jk.log JkMount /* tomcat </IfModule>
ssl.confの編集 †
- apacheのSSL設定ファイル(/etc/httpd/conf.d/ssl.conf)を編集します
# vi /etc/httpd/conf.d/ssl.conf #112行目 httpsdの使用する公開鍵の場所(基本的にデフォルト) SSLCertificateFile /etc/pki/tls/certs/localhost.crt #119行目 httpsd の使用する秘密鍵の場所(基本的にデフォルト) SSLCertificateKeyFile /etc/pki/tls/private/localhost.key #134行目 中間証明書の場所を指定します。利用するCAによっては設定が必要になります。 # 今回はCAを利用せず、自己証明書を利用するため設定しません。 #SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt #227行目 ログの出力形式 CustomLog logs/ssl_access_log combined #230行目 mod_jkの設定 JkMount /usr/local/tomcat/webapps/ROOT/* tomcat
秘密鍵と証明書の作成 †
下記を前提に秘密鍵「localhost.key」と証明書「localhost.crt」を作成します。
- カレントディレクトリを変更します。
# cd /etc/pki/tls
- 秘密鍵を生成します。
# openssl genrsa -des3 2048 -rand /var/log/ > private/localhost.key
「Enter PEM pass phrase:」と表示されるので、パスフレーズを入力すると暗号化のための秘密鍵(localhost.key)が生成されます。
- 秘密鍵からパスフレーズを削除します。削除しないとApache起動時に毎回パスフレーズを入力する必要があります。
# openssl rsa -in private/localhost.key -out private/localhost.key Enter pass phrase for private/localhost.key: writing RSA key 「Enter pass phrase for private/localhost.key:」と表示されるので、先ほどのパスフレーズを入力します。
- 生成された秘密鍵を使ってサイト証明書を発行します(Common NameはURLでのホスト名を入力)
# openssl req -new -x509 -key private/localhost.key -out certs/localhost.crt -days 3650 ----- Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:www.oss-d.net Email Address []:
マルチプロセッシングモジュール(MPM)の設定 †
- MPMをデフォルトのprefork MPMでなく、worker MPMで起動するよう設定を変更します。
# vi /etc/sysconfig/httpd HTTPD=/usr/sbin/httpd.worker
自動起動の設定 †
Tomcatの起動設定 †
自動起動の設定 †
- 自動起動用のスクリプトを「/etc/init.d/tomcat」として作成します。
下記サンプルは「/etc/init.d/functions」を利用するため、RedHat系以外のLinuxでは動作しない可能性があります。
# vi /etc/init.d/tomcat #!/bin/bash # # tomcat This shell script takes care of starting and stopping Tomcat # # chkconfig: - 80 20 # description: tomcat # Source function library. . /etc/rc.d/init.d/functions # Define the tomcat username prog="tomcat" TOMCAT_USER="tomcat" TOMCAT_PATH="/usr/local/tomcat" TOMCAT_PID="/var/run/tomcat.pid" start() { echo $"Starting $prog: " if [ -r ${TOMCAT_PID} ] ; then echo_failure echo "$prog process already running" return -1 else runuser ${TOMCAT_USER} -c ${TOMCAT_PATH}/bin/startup.sh RETVAL=$? [ ${RETVAL} = 0 ] && pgrep -u ${TOMCAT_USER} java > ${TOMCAT_PID} echo_success echo return ${RETVAL} fi } stop() { echo -n $"Stopping $prog: " if [ -r ${TOMCAT_PID} ] ; then runuser ${TOMCAT_USER} -c ${TOMCAT_PATH}/bin/shutdown.sh > /dev/null RETVAL=$? [ ${RETVAL} = 0 ] && rm -f ${TOMCAT_PID} echo_success echo return ${RETVAL} else echo_failure echo "$prog process not running" return -1 fi } # See how we were called. case "$1" in start) start ;; stop) stop ;; restart) stop sleep 2 start ;; *) echo $"Usage: $prog {start|stop|restart}" exit 1 esac exit ${RETVAL}「. /etc/rc.d/init.d/functions」「echo_failure」「echo_success」の行をコメントにすれば 他のディストリビューションでも動作すると思います。
- 自動起動スクリプトに実行権限を付与します。
# chmod +x /etc/init.d/tomcat
- chkconfigコマンドでtomcatをリストに追加し、自動起動をONにします。
# chkconfig --add tomcat # chkconfig tomcat on
- chkconfigコマンドで自動起動の確認をします。
LUNレベル3,4,5がonになっていれば問題ありません。
# chkconfig --list tomcat tomcat 0:off 1:off 2:off 3:on 4:on 5:on 6:off
起動確認 †
- tomcatを起動します。
# /etc/init.d/tomcat start tomcat を起動中: Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/java/jdk1.6.0_18 Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar [ OK ] - netstatコマンドでプロセスの確認します。
# netstat -lntp |grep java tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 6346/java tcp 0 0 :::8009 :::* LISTEN 6346/java tcp 0 0 :::8080 :::* LISTEN 6346/java
apacheの起動設定 †
自動起動の設定 †
- chkconfigコマンドで自動起動をONにします
# chkconfig httpd on
起動確認 †
- apacheを起動します。
# /etc/init.d/httpd start
- netstatコマンドでプロセスの確認します。
# netstat -lntp |grep http tcp 0 0 :::80 :::* LISTEN 529/httpd.worker tcp 0 0 :::443 :::* LISTEN 529/httpd.worker
動作確認 †
JDBCの確認(サーブレット) †
確認用スクリプトの作成 †
- classファイルを設置するためのディレクトリを作成します。
# mkdir /usr/local/tomcat/webapps/ROOT/WEB-INF/classes
- サーブレット確認用のjavaファイルを作成します。
# cd /usr/local/tomcat/webapps/ROOT/WEB-INF/classes # vi JDBC_Servlet.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.sql.*; public class JDBC_Servlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ PrintWriter out = response.getWriter(); try{ Class.forName("org.postgresql.Driver"); // PostgreSQL 接続 String db = "jdbc:postgresql://192.168.11.101:5432/template1"; String user = "postgres"; String pass = ""; Connection conn = DriverManager.getConnection(db,user,pass); //out.println(conn); // SQL実行 Statement st = conn.createStatement(); String sql = "SELECT usename FROM pg_user"; ResultSet rs = st.executeQuery(sql); // SQL実行結果を出力 while (rs.next()) { out.println(rs.getString(1)); } // PostgreSQL 切断 st.close(); rs.close(); conn.close(); }catch(Exception e){ out.println(e); } } }
- コンパイルします。
# javac JDBC_Servlet.java
servletの設定 †
- ブラウザから閲覧できるようservletの設定を変更します。
# vi /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml ... <servlet> <servlet-name>JDBC_Servlet</servlet-name> <servlet-class>JDBC_Servlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>JDBC_Servlet</servlet-name> <url-pattern>/servlet/JDBC_Servlet</url-pattern> </servlet-mapping> </web-app>
動作確認 †
- ブラウザで動作確認を行います
http://192.168.11.202/servlet/JDBC_Servlet
JDBCの確認(JSP) †
確認用スクリプトの作成 †
- JSP確認用のjavaファイルを作成します。
# cd /usr/local/tomcat/webapps/ROOT/WEB-INF/classes # vi JDBC.jsp <%@ page language="java" %> <%@ page contentType="text/html; charset=UTF-8" %> <%@ page import="java.sql.*" %> <% try{ Class.forName("org.postgresql.Driver"); // PostgreSQL 接続 String db = "jdbc:postgresql://192.168.11.101:5432/template1"; String user = "postgres"; String pass = ""; Connection conn = DriverManager.getConnection(db,user,pass); //out.println(conn); // SQL実行 Statement st = conn.createStatement(); String sql = "SELECT usename FROM pg_user"; ResultSet rs = st.executeQuery(sql); // 実行結果を出力 while (rs.next()) { out.println(rs.getString(1)); } // PostgreSQL 切断 st.close(); rs.close(); conn.close(); }catch(Exception e){ out.println(e); } %>
動作確認 †
- ブラウザで動作確認を行います
http://192.168.11.202/JDBC.jsp
チューニング †
apacheのチューニング †
Apache マルチプロセッシングモジュール(MPM)の設定 †
- MPMをデフォルトのprefork MPMでなく、worker MPMにする事で大幅なパフォーマンス向上が期待できます。
# vi /etc/sysconfig/httpd HTTPD=/usr/sbin/httpd.worker
設定変更後はapacheを再起動します。# /etc/init.d/httpd restart
プロセスの設定 †
- 多数のリクエストを同時処理できるよう、待ち受けプロセスに関する設定を見直します。
一般的にプロセス数が多いほど性能はあがりますが、その分メモリを多く消費します。
# vi /etc/httpd/conf/httpd.conf <IfModule worker.c> StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule>
設定項目 説明 StartServers 起動時のプロセス数。起動直後から多数のアクセスがある場合はプロセス数を増やします。 MaxClients 処理可能な同時リクエスト数。worker MPM ではクライアントに応答できるスレッドの総数となります。待機スレッドはこの中に含まれない。 MinSpareThreads 待機スレッドの最小数。下回った場合は待機スレッドを起動させます。 MaxSpareThreads 待機スレッドの最大数。上回った場合は待機スレッドを終了させます。 ThreadsPerChild 子プロセスで生成される スレッド数を設定します MaxRequestsPerChild 個々の子サーバプロセスが扱うことのできるリクエストの制限数。偶発的なメモリーリークが起こった場合にプロセスが消費するメモリの総量を制限できます。
KeepAliveの設定 †
- Apacheはリクエスト単位でTCP接続のオープン/クローズを行いますがKeepAliveを有効にすると、
1つのTCP接続で複数の要求を処理する事が可能になり、TCP接続を確立のオーバヘッドが削減されます。
# vi /etc/httpd/conf/httpd.conf KeepAlive On MaxKeepAliveRequests 10 KeepAliveTimeout 15
設定項目 説明 KeepAlive KeepAliveの有効、無効を設定する MaxKeepAliveRequests 1つのTCP接続で処理できるリクエスト数 KeepAliveTimeout 1つのTCP接続が保持される時間。時間を超えると切断される。
不要モジュールの削除 †
- 不要なモジュールは性能低下に繋がるため、httpd.confのLoadModuleで読み込まないようにします。
# vi /etc/httpd/conf/httpd.conf ##不要なモジュールはコメントにします。 LoadModule auth_basic_module modules/mod_auth_basic.so LoadModule auth_digest_module modules/mod_auth_digest.so : : LoadModule version_module modules/mod_version.so
tomcatのチューニング †
プロセスの設定 †
- 多数のリクエストを同時処理できるよう、待ち受けプロセスに関する設定を見直します。
一般的にプロセス数が多いほど性能はあがりますが、その分メモリを多く消費します。
# vi /usr/local/tomcat/conf/server.xml <Connector port="8009" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" acceptCount="100" enableLookups="false" connectionTimeout="20000" protocol="AJP/1.3" redirectPort="8443" />
メモリ(ヒープ)サイズの設定 †
- 起動時に環境変数 CATALINA_OPTS でメモリの割り当てを増やします。
# /usr/local/tomcat/bin/catalina.sh CATALINA_OPTS="-Xms128M -Xmx256M"
設定項目 説明 -Xms メモリ初期使用量 -Xmx メモリ最大使用量
Last-modified: 2010-09-06 (月) 01:36:22 (8h)