apache2.2.3+PHP5.3.2 (目次) +



はじめに +

apache+phpの環境を構築します。データベースはPostgreSQLの利用を前提とします。

尚、PostgreSQL(IP 192.168.11.101)は下記を前提に構築済とします。

環境 +

  • 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
    • php-5.3.2.tar.gz
    • postgresql-devel-8.4.3-1PGDG.el5
    • postgresql-libs-8.4.3-1PGDG.el5
    • postgresql-8.4.3-1PGDG.el5
    • compat-postgresql-libs-4-1PGDG.rhel5
    • openldap-2.3.43-3.el5
    • openldap-devel-2.3.43-3.el5

パッケージのインストール +

apacheのインストール +

  • apacheのインストール(openldap-develもインストールされます)
    # yum install httpd
    # yum install httpd-devel
  • apache用のSSLモジュールをインストール
    # yum install mod_ssl

PHPのインストール +

  • PHPでPG関数を有効にするため、postgresql-develをインストールします。 postgresqlは8.4系を利用するためリポジトリを追加してインストールします。
    # rpm -ivh http://yum.pgsqlrpms.org/reporpms/8.4/pgdg-centos-8.4-2.noarch.rpm
    # yum install postgresql-devel
  • PHPは最新版をソースからインストールします。
    # wget http://us3.php.net/get/php-5.3.2.tar.gz/from/jp.php.net/mirror
    # tar zxvf php-5.3.2.tar.gz
    # cd php-5.3.2
    # ./configure \
    --with-config-file-path=/usr/local/lib \
    --with-apxs2 \
    --with-pgsql \
    --with-ldap \
    --enable-mbstring \
    --enable-mbregex \
    > config_log.txt
    # make
    # make install
  • 設定ファイルの雛形をコピーします。
    # cp php.ini-production /usr/local/lib/php.ini

apacheの設定 +

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
    
    #206行目 PHPモジュールの確認
    LoadModule php5_module        /usr/lib/httpd/modules/libphp5.so
    
    #386行目 インデックスファイルの指定 (index.phpを追加)
    DirectoryIndex index.html index.html.var index.php
    
    #526行目 エラーページの設定(サーバのバージョンやホスト名を出力しない)
    ServerSignature Off
    
    #749行目 デフォルトの文字コードを指定します
    AddDefaultCharset UTF-8
    
    #756行目 PHPの拡張子に対する処理を設定します
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps

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

秘密鍵と証明書の作成 +

秘密鍵「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起動時に毎回パスフレーズを入力する必要があります。
    「Enter pass phrase for private/localhost.key:」と表示されるので、先ほどのパスフレーズを入力します。
    # openssl rsa -in private/localhost.key -out private/localhost.key
    Enter pass phrase for private/localhost.key:
    writing RSA 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 []:

PHPの設定 +

php.iniの編集 +

  • php.iniでPHPの設定を行います。セキュリティ関連と文字コードの設定がほとんどです。
    尚、文字コードはUTF-8のスクリプトをUTF-8表示する設定です。(文字コード設定についてはこちら
    # vi /etc/php.ini
    
    ;; 出力のバッファリングを無効とする
    output_buffering = Off
    
    ;; HTTP charsetヘッダを設定
    default_charset = "UTF-8"
    
    ;; httpヘッダでPHPに関する情報を出力しない
    expose_php = Off
    
    ;; ブラウザにエラーを表示しない(デフォルト)
    display_errors = Off
    
    ;;  エラーログを記録する
    log_errors = On
    
    ;;  エラーログの記録先
    error_log = syslog
    
    ;; 変数(Environment, GET, POST, Cookie, Server)を グローバル変数に登録しない(デフォルト)
    register_globals = Off 
    
    ;; $HTTP_*_VARS のような古い長い 定義済みの変数 を登録しない(デフォルト)
    register_long_arrays = Off
    
    ;; GET,POST,COOKIEの値を自動的にエスケープしない(デフォルト)
    magic_quotes_gpc = Off
    
    ;; デフォルトの文字コードを指定
    default_charset = “UTF-8″
    
    ;; 動的モジュールのロードしない(デフォルト)
    enable_dl = Off
    
    ;; 外部ファイルを読み込まない
    allow_url_fopen = Off
    
    ;;  外部のPHPを読み込まない(デフォルト)
    allow_url_include = Off
    
    ;; セッションの処理を Cookie のみに限定 (デフォルト)
    session.use_only_cookies = 1
    
    ;; セッションIDにMD5(128bit)でなくSHA-1(160bit)を利用する。
    session.hash_function = 1
    
    ;; デフォルトの内部エンコーディングを設定
    mbstring.language = Japanese
    
    ;; デフォルトの内部エンコーディングを設定
    mbstring.internal_encoding = UTF-8
    
    ;; デフォルトのHTTP入力文字エンコーディングを設定
    mbstring.http_input = auto
    
    ;; デフォルトのHTTP出力文字エンコーディングを設定
    mbstring.http_output = UTF-8
    
    ;; HTTP入力エンコーディング変換を有効にする
    mbstring.encoding_translation = On
    
    ;; デフォルトの文字エンコーディング検出順序を設定
    mbstring.detect_order = auto
    
    ;; 代替文字のデフォルト値を設定
    mbstring.substitute_character = none;

起動確認 +

自動起動の設定 +

  • chkconfigコマンドで自動起動をONにします
    # chkconfig  httpd on

起動確認 +

  • apacheを起動します。
    # /etc/init.d/httpd start


  • psコマンドでプロセスの確認します。/usr/sbin/httpdがあれば問題ありません。
    # ps ax|grep http
     1747 ?        S      0:00 /usr/sbin/httpd
     1900 ?        S      0:00 /usr/sbin/httpd
     1923 ?        Ss     0:00 /usr/sbin/httpd

動作確認 +

  • phpのスクリプトを用意します。
    # echo "<?php phpinfo(); ?>" >/var/www/html/index.php
  • ブラウザで以下にアクセスしてページが表示されればapacheのインストールは完了です。
    (www.oss-d.netの部分は環境に合わせて変更して下さい)
    https://www.oss-d.net

チューニング +

apacheのチューニング +

Apache マルチプロセッシングモジュール(MPM)の設定 +

プロセスの設定 +

  • 多数のリクエストを同時処理できるよう、待ち受けプロセスに関する設定を見直します。

    一般的にプロセス数が多いほど性能はあがりますが、その分メモリを多く消費します。

    # vi /etc/httpd/conf/httpd.conf
    
    <IfModule prefork.c>
    StartServers       8
    MinSpareServers    5
    MaxSpareServers   20
    ServerLimit      256
    MaxClients       256
    MaxRequestsPerChild  4000
    </IfModule>

    設定項目説明
    StartServers起動時のプロセス数。起動直後から多数のアクセスがある場合はプロセス数を増やします。
    MinSpareServers待機プロセスの最小数。下回った場合は待機プロセスを起動させます。
    MaxSpareServers待機プロセスの最大数。上回った場合は待機プロセスを終了させます。
    ServerLimitMaxClientsの最大値。MaxClientsと同じ値を設定します。(prefork MPM の場合は「同時クライアント数 = サーバプロセス数」のため)
    MaxClients処理可能な同時リクエスト数。prefork MPM では処理可能な最大プロセス数となる。待機プロセスはこの中に含まれない。
    MaxRequestsPerChild1プロセスが処理するリクエスト数。メモリリーク対策のためリクエスト数を超えたプロセスは終了します。
    ※prefork MPM での最大プロセス数は「MaxClients」+「MaxSpareServers」となる。

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

PHPのチューニング +

PHPスクリプトでなくphp.iniでのチューニングを紹介します。

php.iniの設定見直し +

  • php.iniで下記項目を見直す事でパフォーマンスの向上が期待できます。
  • realpath_cache_size = "16K"
    PHP が使用する realpath キャッシュの大きさを設定します。 PHP で大量にファイルをオープンする際に、 この値を大きくすることによってファイル操作のパフォーマンスを 向上させます。

  • realpath_cache_ttl = "120"
    与えられたファイルやディレクトリについての realpath 情報キャッシュの有効期限を (秒単位で) 設定します。 ファイルを変更することがほとんどない場合は、 この値を大きくすることを検討してください。
このエントリーをはてなブックマークに追加
Last-modified: 2010-10-02 (土) 11:09:21 (508d)   最終更新のRSS