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.listworkerの名前を定義します。
    worker.*.portTomcatの待ち受けPortを指定します
    worker.*.hostTomcatサーバの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>

動作確認

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);
    }
    %>

動作確認

チューニング

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

    設定項目説明
    KeepAliveKeepAliveの有効、無効を設定する
    MaxKeepAliveRequests1つのTCP接続で処理できるリクエスト数
    KeepAliveTimeout1つの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メモリ最大使用量
トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-09-06 (月) 01:36:22 (8h)