環境はAmazon EC2のUbuntu 12.10です。Apache 2.4.6を使ってみます。Apache 2.4系列を使うからには、やっぱりEvent MPMを使いたいところです。
ところがPHPのマニュアルにはPreforkを使えと書いてあります。
PHP: インストール – Manual
http://www.php.net/manual/ja/faq.installation.php#faq.installation.apache2
マルチスレッドMPMを使いたい場合はFastCGIを使うようにも書いてあるので、PHPをFastCGIで動かすようにします。
Apacheのインストールまでは以下のサイトを参考にしています。
http://edin.no-ip.com/blog/hswong3i/apache-2-4-php-5-4-pdo-oci-ubuntu-12-04-howto
今見たら上記ページが真っ白だったので、キャッシュURLも載せておきます。
まずはApacheとPHPをビルドするための準備です。
# aptitude update && \ # aptitude -y full-upgrade && \ # aptitude -y install git vim libmcrypt-dev && \ # apt-get -y build-dep apache2 php5
Apache 2.4.6のインストール
Apacheはgithubからcloneしてくるのが便利です。
# cd /usr/local/src # git clone --branch 2.4.x https://github.com/apache/httpd.git httpd-2.4.x # cd httpd-2.4.x # git clone https://github.com/apache/apr.git srclib/apr
clone後に、現時点で最新である2.4.6をチェックアウトします。
# git checkout refs/tags/2.4.6
ビルド&インストールします。SuExecも有効にしておきます。
# ./buildconf # ./configure -enable-modules=all --with-included-apr --enable-mpm=event --enable-suexec --enable-rewrite # make # make install
今回は/usr/localの下にインストールしました。
# vi /usr/local/apache2/conf/httpd.conf
以下の項目を書き換えます。
Apache 2.4なので、Allow from allなどの定義はRequire all grantedを使って指定することに注意します。
User www-data Group www-data ServerAdmin root@localhost.localdomain DocumentRoot "/var/www" <Directory "/var/www"> Options Indexes FollowSymLinks AllowOverride all Require all granted </Directory>
最終的にはバーチャルホストにするので使いませんが、/var/www以下のオーナーを設定しておきます。
# chown -Rf www-data:www-data /var/www
シンボリックリンクを作成します。
# ln -s /usr/local/apache2/bin/* /usr/local/bin/ # rm -rf /etc/init.d/apache2 # ln -s /usr/local/bin/apachectl /etc/init.d/apache2
自動起動を設定します。
# update-rc.d -f apache2 remove # update-rc.d -f apache2 defaults 91 09
起動を確認します。
# /etc/init.d/apache2 stop # /etc/init.d/apache2 start
PHP 5.4のインストール
PHPもgithubからcloneしてインストールします。
# cd /usr/local/src/ # git clone --branch PHP-5.4 https://github.com/php/php-src.git php-5.4.x # cd /usr/local/src/php-5.4.x/ # git checkout refs/tags/php-5.4.17 # cd /usr/local/src/php-5.4.x/ext/ # wget http://pecl.php.net/get/APC-3.1.13.tgz # gzip -d < APC-3.1.13.tgz | tar -xvf - # mv APC-3.1.13 apc # cd /usr/local/src/php-5.4.x/ # rm -rf configure # ./buildconf --force
fpm(fastCGI process manager)を使うので、PHPのconfigure時にenable-fpmを忘れずに指定しておきます。
PHP: インストール – Manual
http://www.php.net/manual/ja/install.fpm.install.php
PHP-FPM – Httpd Wiki
http://wiki.apache.org/httpd/PHP-FPM
# ./configure \ --enable-apc \ --enable-bcmath \ --enable-calendar \ --enable-dba \ --enable-exif \ --enable-fpm \ --enable-ftp \ --enable-mbstring \ --enable-shmop \ --enable-sigchild \ --enable-soap \ --enable-sockets \ --enable-sysvmsg \ --enable-wddx \ --enable-zip \ --with-apxs2=/usr/local/apache2/bin/apxs \ --with-bz2 \ --with-config-file-path=/usr/local/apache2/conf \ --with-curl \ --with-gd \ --with-gettext \ --with-mcrypt \ --with-mysql-sock=/tmp/mysql.sock \ --with-mysqli \ --with-openssl \ --with-pdo-mysql \ --with-pdo-pgsql \ --with-xmlrpc \ --with-zlib # make # make test # make install
オプションは適宜変更してください。
php.iniファイルが入っていないので、コピーして作成します。
# cp /usr/local/src/php-5.4.x/php.ini-production /usr/local/apache2/conf/php.ini # sed -i 's/^;\(date\.timezone\) =\s*$/\1 = "Asia\/Tokyo"/g' /usr/local/apache2/conf/php.ini # sed -i 's/^\(memory_limit\) = .*$/\1 = 256M/g' /usr/local/apache2/conf/php.ini # sed -i 's/^\(post_max_size\) = .*$/\1 = 32M/g' /usr/local/apache2/conf/php.ini # sed -i 's/^\(upload_max_filesize\) = .*$/\1 = 32M/g' /usr/local/apache2/conf/php.ini # sed -i 's/^\(max_execution_time\) = .*$/\1 = 3600/g' /usr/local/apache2/conf/php.ini # sed -i 's/^\(max_input_time\) = .*$/\1 = 7200/g' /usr/local/apache2/conf/php.ini
パラメータは自由に調整してください。
php.iniファイルを設置するパスについては、以下のコマンドで調べられます。
# php -i |grep \\.ini Configuration File (php.ini) Path => /usr/local/apache2/conf Scan this dir for additional .ini files => (none) Additional .ini files parsed => (none) user_ini.filename => .user.ini => .user.ini
PHP-FPMの設定
php-fpmを設定します。
Apache2.4+PHP-FPMのhttpd.confの個人的メモ – Qiita [キータ]
http://qiita.com/Hiraku/items/60ef1ff9801fa9945d43
まずはデフォルトの設定ファイルをコピーします。
# cp /usr/local/etc/php-fpm.conf.default /usr/local/etc/php-fpm.conf
設定を編集します。以下の項目を変更しました。ソケットの方が高速らしいので、listenにはソケットファイルのパスを指定します。
# vi /usr/local/etc/php-fpm.conf
[global] pid = run/php-fpm.pid error_log = /var/log/php-fpm.log [www] user = www-data group = www-data listen = /usr/local/etc/php-fpm/www-data.sock listen.owner = www-data listen.group = www-data listen.mode = 0666
各パラメータについて、日本語の詳しい設定はこちらにあります。
PHP: 設定 – Manual
http://www.php.net/manual/ja/install.fpm.configuration.php
init.d用のスクリプトがあるので、シンボリックリンクを作ります。
# ln -s /usr/local/src/php-5.4.x/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm # chmod +x /etc/init.d/php-fpm
自動起動するように設定します。
簡単な説明は以下のドキュメントにも書いてあります。
Documentation
http://php-fpm.org/wiki/Documentation
# update-rc.d -f php-fpm defaults Adding system startup for /etc/init.d/php-fpm ... /etc/rc0.d/K20php-fpm -> ../init.d/php-fpm /etc/rc1.d/K20php-fpm -> ../init.d/php-fpm /etc/rc6.d/K20php-fpm -> ../init.d/php-fpm /etc/rc2.d/S20php-fpm -> ../init.d/php-fpm /etc/rc3.d/S20php-fpm -> ../init.d/php-fpm /etc/rc4.d/S20php-fpm -> ../init.d/php-fpm /etc/rc5.d/S20php-fpm -> ../init.d/php-fpm
では、起動します。
# /etc/init.d/php-fpm start Starting php-fpm done
これでPHP-FPMが起動できました。
もしfailedになる場合はこちらを確認してみてください。
PHP-FPMの起動時にエラーになる&終了できない問題 – digital matter
mod_fastcgiのインストール
Apacheには公式のmod_proxy_fcgiがあるのですが、ソケットでの通信やSuExecができないようなので、サードパーティ製のmod_fastcgiを使います。
ところがmod_fastcgiは最近更新されていないので、Apache 2.4の環境でビルドできません。
Byte Internetという会社が各種パッチを適用した新バージョンをgithubに公開しているので、こちらを使います。
ByteInternet/libapache-mod-fastcgi
https://github.com/ByteInternet/libapache-mod-fastcgi
# cd /usr/local/src # git clone https://github.com/ByteInternet/libapache-mod-fastcgi.git # cd libapache-mod-fastcgi/ # cp Makefile.AP2 Makefile
パッチが充たっていない状態なので、/usr/local/src/libapache-mod-fastcgi/debian/patches/seriesを見ながら順にパッチを充てます。
# patch -p1 < debian/patches/doc-misc-typo-fix.diff # patch -p1 < debian/patches/byte-new-packet-type-byte_acc.diff # patch -p1 < debian/patches/byte-compile-against-apache24.diff # patch -p1 < debian/patches/byte-fix-cast-warning-in-fcgi_config.diff
これで、make & make installします。
# make top_dir=/usr/local/apache2 # make install top_dir=/usr/local/apache2
FastCGIのIPCに使うディレクトリが必要なので作成しておきます。
# mkdir -p /usr/local/etc/php-fpm/dynamic # chown -R www-data:www-data /usr/local/etc/php-fpm
Apacheの設定
# vi /usr/local/apache2/conf/httpd.conf
mod_fastcgi.soをロードするようにhttpd.confの各種LoadModule行の下に追記します。
LoadModule fastcgi_module modules/mod_fastcgi.so
併せて、以下のモジュールのコメントも外してロードするようにします。
LoadModule rewrite_module modules/mod_rewrite.so LoadModule actions_module modules/mod_actions.so LoadModule suexec_module modules/mod_suexec.so LoadModule proxy_module modules/mod_proxy.so
それと、php5_moduleが有効になっている場合はコメントアウトします。
#LoadModule php5_module modules/libphp5.so
バーチャルホストを使うので、Includeのコメントも解除します。
Include conf/extra/httpd-vhosts.conf
続いて、同じくhttpd.confのLoadModule群の下あたりにFastCGIモジュールの設定を記述します。
<IfModule fastcgi_module> FastCgiIpcDir /usr/local/etc/php-fpm/ FastCgiConfig -autoUpdate -singleThreshold 100 -killInterval 300 -idle-timeout 240 -maxClassProcesses 1 -pass-header Authorization FastCgiWrapper /usr/local/apache2/bin/suexec FastCGIExternalServer /usr/local/sbin/php-fpm -socket /usr/local/etc/php-fpm/www-data.sock -user www-data -group www-data AddHandler php-fastcgi .php Action php-fastcgi /usr/local/sbin/php-fpm.fcgi ScriptAlias /usr/local/sbin/php-fpm.fcgi /usr/local/sbin/php-fpm <Directory /usr/local/sbin> Options ExecCGI FollowSymLinks SetHandler fastcgi-script Require env REDIRECT_STATUS </Directory> </IfModule>
ちなみに、/usr/local/sbin/php-fpm.fcgiはエイリアス定義しているだけなので、実体は不要です。
/usr/local/sbin/php-fpmは必要ですが、すでにインストールされているはずです。
バーチャルホストの設定をします。
SuexecUserGroupの設定が必要です。
Symfonyを使うので、RewriteRuleの設定もしています。
# vi /usr/local/apache2/conf/extra/httpd-vhosts.conf
<VirtualHost *:80> ServerAdmin root@example.com ServerName example.com.dev SuexecUserGroup www-data www-data AddDefaultCharset UTF-8 DocumentRoot /home/www-data/sites/example.com.dev/public <Location /> RewriteEngine On RewriteRule ^$ index.html [QSA] RewriteRule ^([^.]+)$ $1.html [QSA] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [QSA,L] </Location> <Directory "/home/www-data/sites/example.com.dev/public"> Options +FollowSymLinks +ExecCGI AllowOverride All Require all granted </Directory> LogLevel warn ErrorLog /var/log/apache2/example.com.dev.error.log CustomLog /var/log/apache2/example.com.dev.access.log combined </VirtualHost>
以上です!
# /etc/init.d/apache2 restart
でApacheを再起動して動作確認してください。
[…] 参考(っていうかほぼそのまま)サイト:digital matter […]