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)の設定 +
- MPMをデフォルトのprefork MPMでなく、worker MPMにする事で大幅なパフォーマンス向上が期待できます。
- マルチプロセッシングモジュール (MPM)
http://httpd.apache.org/docs/2.2/mpm.html
しかし、PHPではApache2 の worker MPM(マルチスレッドモード)を実運用環境で利用する事は以下の通り推奨されないため、 今回は利用しません。
http://www.php.net/manual/ja/faq.installation.php#faq.installation.apache2
- マルチプロセッシングモジュール (MPM)
プロセスの設定 +
- 多数のリクエストを同時処理できるよう、待ち受けプロセスに関する設定を見直します。
一般的にプロセス数が多いほど性能はあがりますが、その分メモリを多く消費します。
# vi /etc/httpd/conf/httpd.conf <IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 256 MaxRequestsPerChild 4000 </IfModule>
※prefork MPM での最大プロセス数は「MaxClients」+「MaxSpareServers」となる。設定項目 説明 StartServers 起動時のプロセス数。起動直後から多数のアクセスがある場合はプロセス数を増やします。 MinSpareServers 待機プロセスの最小数。下回った場合は待機プロセスを起動させます。 MaxSpareServers 待機プロセスの最大数。上回った場合は待機プロセスを終了させます。 ServerLimit MaxClientsの最大値。MaxClientsと同じ値を設定します。(prefork MPM の場合は「同時クライアント数 = サーバプロセス数」のため) MaxClients 処理可能な同時リクエスト数。prefork MPM では処理可能な最大プロセス数となる。待機プロセスはこの中に含まれない。 MaxRequestsPerChild 1プロセスが処理するリクエスト数。メモリリーク対策のためリクエスト数を超えたプロセスは終了します。
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
PHPのチューニング +
PHPスクリプトでなくphp.iniでのチューニングを紹介します。
php.iniの設定見直し +
- php.iniで下記項目を見直す事でパフォーマンスの向上が期待できます。
- realpath_cache_size = "16K"
PHP が使用する realpath キャッシュの大きさを設定します。 PHP で大量にファイルをオープンする際に、 この値を大きくすることによってファイル操作のパフォーマンスを 向上させます。
- realpath_cache_ttl = "120"
与えられたファイルやディレクトリについての realpath 情報キャッシュの有効期限を (秒単位で) 設定します。 ファイルを変更することがほとんどない場合は、 この値を大きくすることを検討してください。