UbuntuでApache 2.4.6(Event MPM)+PHP 5.4(FastCGI)を使う

環境は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も載せておきます。

http://webcache.googleusercontent.com/search?q=cache:Ply5NHzRV-IJ:edin.no-ip.com/blog/hswong3i/apache-2-4-php-5-4-pdo-oci-ubuntu-12-04-howto+&cd=1&hl=ja&ct=clnk&gl=jp

まずは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を使います。

FastCGI | 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を再起動して動作確認してください。


タグ: , , , , ,

新しく会社作りました!

コメント / トラックバック 1 件

  1. […] 参考(っていうかほぼそのまま)サイト:digital matter […]

コメントをどうぞ