CentOS 7.1 (1503)でApache 2.4 Event MPM(suEXEC)とsuEXECもどきのPHP-FPMとMemcachedを組み合わせて動かす

2015年9月5日(土)

さくらのVPSにCentOS 7をセットアップした時の備忘録です。
Apache 2.4 Event MPMとPHP-FPMを組み合わせて使います。
CGIはsuEXECで動きます。PHPはsuEXECみたいに動きます。
PHPのセッション管理はmemcachedを使用します。

PHP-FPMだとnginxの情報が多くて、同じ構成はググっても出てきませんでした。
いろんな情報を参考にまとめました。
ユーザー名は”user”として書いてあります。

以前はremiやrpmforgeレポジトリを使用していましたが、サポート期間の不安や、パッケージの依存関係で問題が出るとどうにもならなくなるので、基本的に標準レポジトリしか使いません。
どうしてもパッケージがない場合にEPELのみ使用します。

yumでhttpd php-cli php-fpm memcached php-pecl-memcacheあたりをインストールします。
モジュール版のphpは不要です。

PHPのsuEXECもどきの設定をします。
併せてMemcachedを使用する設定をします。

# vi /etc/php.d/memcache.ini
下の方にあるsession.save_handlerとsession.save_pathのコメントを取ります。

; Use memcache as a session handler
session.save_handler=memcache
; Defines a comma separated of server urls to use for session storage
session.save_path="tcp://localhost:11211?persistent=1&weight=1&timeout=1&retry_interval=15"

# vi /etc/php.ini
コメントアウトします。

;session.save_handler = files

PHP-FPMの設定をします。
ユーザーごとに設定ファイルを作成します。
ログも分けます。
PHP-FPMはunix socketで動かします。
標準の/etc/php-fpm.d/www.confが不要であれば削除するかリネームします。

# vi /etc/php-fpm.d/user.conf

[user]
listen = /var/run/php-fpm/php-fpm-user.sock
user = user
group = user

pm = dynamic
pm.max_children = 5
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4

php_admin_value[error_log] = /var/log/php-fpm/user.log
php_admin_flag[log_errors] = on

ログファイルを作成します。
# touch /var/log/php-fpm/user.log
# chown user:user /var/log/php-fpm/user.log

/var/log/php-fpmのアクセス権が770なのでそのままだとログが書き込みできません。
書き込みできるようにログディレクトリのアクセス権を変更します。
# chmod 775 /var/log/php-fpm

PHP-FPMのunix socketをバーチャルホストごとに変更すれば、PHPの実行ユーザーを変えられます。

次に、CGIのsuEXECです。

CentOS 7のsuEXECは/var/www/…./public_htmlというディレクトリでないと動作しないので、suEXECが動作する環境を作ります。
/var/wwwの下にユーザーディレクトリを持ってくるのは微妙です。
SSHのchrootも有効にしているので、ユーザーディレクトリからのシンボリックも使えません。
/var/wwwの下からシンボリックリンクを作成しても、今度はsuEXECがシンボリックリンクで動作しません。
シンボリックリンクではなく、mountのbindオプションを使用します。

/home/userの下に、public_htmlを作成し、バーチャルホストの公開ディレクトリにします。

# mkdir /home/user/public_html
# chown user:user /home/user/public_html
# chmod 701 /home/user/public_html(Apacheの動作にXX1が必要です)

mount –bindでマウントします。
# mkdir /var/www/home
# mount –bind /home /var/www/home
これで、/var/www/homeが/homeと同じ内容になります。

起動時からマウントするように、/etc/fstabに追加します
# echo “/home /var/www/home none bind 0 0” >> /etc/fstab

これで、Apache以外の準備はできました。

Apacheの設定です。

# vi /etc/httpd/conf.modules.d/00-mpm.conf
Event MPMに変更。

#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule mpm_event_module modules/mod_mpm_event.so

# vi /etc/httpd/conf.modules.d/00-proxy.conf
proxy_fcgi_moduleはPHP-FPMで使用する。

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

バーチャルホストごとに、CGIとPHPの実行ユーザーを実際のユーザーにします。
# vi /etc/httpd/conf/httpd.conf

<VirtualHost *:80>
    SuexecUserGroup user user
    DocumentRoot "/var/www/home/user/public_html"
    ServerName virtual.example.com
    <FilesMatch "\.php$">
        SetHandler "proxy:unix:/var/run/php-fpm/php-fpm-user.sock|fcgi://localhost/"
    </FilesMatch>
</VirtualHost>

<Directory "/var/www/home/user/public_html">
    Options ExecCGI
    AllowOverride None
    Require all granted
</Directory>

CGIはSuexecUserGroupでユーザーを指定します。
PHPはfcgi proxyを使用して、ユーザーごとに作成したPHP-FPMのunix socketを使用します。

これでおしまいです。