Contents
はじめに
WordPressをApache 2.4 preforkで構築しましたが、MPMをeventに変更したいと思います。
サーバ環境(ConoHa VPS)
対象のサーバは以下のような環境になっております。
バージョン | 参照 | |
CentOS 7 | 7.4.1708 | |
OpenSSL | 1.1.0g | OpenSSL 1.1.0 導入 |
Apache(prefork) | 2.4.29 | Apache 2.4.29 導入 |
MySQL | 5.7.21 | MySQL 5.7.21 導入 |
PHP | 7.2.1 | PHP 7.2.1 導入 |
WordPress | 4.9.2 | WordPress ダウンロードと設定 |
必要なこと
調べたところ、PHP-FPMとFastCGIの導入が必要であることがわかりました。
対象 | 説明 |
PHP-FPM | PHPのオプション設定(--enable-fpm)でApacheと別で起動する必要がある。 |
FastCGI | Apache側の設定でmod_fcgidモジュールを入れる。 |
PHP-FPMとかFastCGIとか…なんか何度調べてもすぐ忘れる。そんな私のような人間には以下のサイトがすごく分かりやすいです。
PHP-FPM
ソースからインストールしたPHP 7.2 に--enable-fpmを有効にするため、再コンパイルしてインストールします。
- 一度こちらの作業をしてあることを前提とした手順になります。
- 公式を見ると--with-fpm-systemdというオプションもありますが、"configure: error: Your system does not support systemd."と表示されてうまくいきませんでした。
PHPソースディレクトリに移動
# cd /usr/local/src/php-7.2.1/
前回分のコンパイルデータ削除
# make clean (以下は表示されるメッセージ内容) find . -name \*.gcno -o -name \*.gcda | xargs rm -f find . -name \*.lo -o -name \*.o | xargs rm -f find . -name \*.la -o -name \*.a | xargs rm -f find . -name \*.so | xargs rm -f find . -name .libs -a -type d|xargs rm -rf rm -f libphp7.la sapi/cli/php sapi/cgi/php-cgi libphp7.la modules/* libs/*
ビルド・インストール
# ./configure \
--prefix=/usr/local/php-7.2.1 \
--enable-mbstring \
--enable-zip \
--enable-bcmath \
--with-gettext \
--enable-intl \
--enable-sockets \
--with-gd \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib-dir \
--with-curl \
--with-libzip \
--with-apxs2=/usr/local/httpd/bin/apxs \
--with-openssl=/usr/local/openssl \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-mysql-sock=/usr/local/mysql/mysql.sock \
--enable-fpm
# make
# make install
php-fpm設定ファイルの編集
# cd /usr/local/php-7.2.1/etc # cp php-fpm.conf.default php-fpm.conf # vi php-fpm.conf # 有効化 pid = run/php-fpm.pid # cp php-fpm.d/www.conf.default php-fpm.d/www.conf # vi php-fpm.d/www.conf user = apache group = apache
ソースディレクトリから起動ファイルをsystemdに登録する。
# cp /usr/local/src/php-7.2.1/sapi/fpm/php-fpm.service /etc/systemd/system/ # vi /etc/systemd/system/php-fpm.service [Unit] Description=The PHP FastCGI Process Manager After=network.target [Service] Type=simple PIDFile=/usr/local/php-7.2.1/var/run/php-fpm.pid ExecStart=/usr/local/php-7.2.1/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php-7.2.1/etc/php-fpm.conf ExecReload=/bin/kill -USR2 $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
systemdに反映
# systemctl daemon-reload
systemdに反映されたことを確認
# systemctl list-unit-files --type service | grep php-fpm php-fpm.service disabled
php-fpm起動
# systemctl start php-fpm.service # systemctl status php-fpm.service ● php-fpm.service - The PHP FastCGI Process Manager Loaded: loaded (/etc/systemd/system/php-fpm.service; disabled; vendor preset: disabled) Active: active (running) since Fri 2018-02-23 10:00:46 JST; 8s ago Main PID: 28061 (php-fpm) CGroup: /system.slice/php-fpm.service ├─28061 php-fpm: master process (/usr/local/php-7.2.1/etc/php-fpm.conf) ├─28062 php-fpm: pool www └─28063 php-fpm: pool www
自動起動の設定
# systemctl enable php-fpm.service Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /etc/systemd/system/php-fpm.service.
確認
# systemctl is-enabled php-fpm.service enabled
mod_fcgid
Apacheで使えるFastCGIのモジュールはmod_fastCGIとmod_fcgidがあるようですが、今後の更新を考えるとApacheプロジェクトでメンテナンスされているmod_fcgidの方が良さそうなので、こちらを採用しました。以下2つのサイトを参考にさせていただきました。
対象バージョン
バージョン | |
mod_fcgid | 2.3.9 |
最新バージョンは公式HPで確認してください。
ディレクトリ移動
# cd /usr/local/src/
ダウンロード
# wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache//httpd/mod_fcgid/mod_fcgid-2.3.9.tar.gz
展開
# tar zxvf mod_fcgid-2.3.9.tar.gz
ディレクトリ移動
# cd mod_fcgid-2.3.9/
ビルド・インストール
# ./configure.apxs # make # make install
モジュール確認
# grep mod_fcgid /usr/local/httpd/conf/httpd.conf LoadModule fcgid_module modules/mod_fcgid.so # ls /usr/local/httpd/modules/ | grep mod_fcgid.so mod_fcgid.so
Apacheで.phpがFastCGIで呼ばれるようにする。
# vi /usr/local/httpd/conf/httpd.conf <Directory "/var/www/html"> # # Possible values for the Options directive are "None", "All", # or any combination of: # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews # # Note that "MultiViews" must be named *explicitly* --- "Options All" # doesn't give it to you. # # The Options directive is both complicated and important. Please see # http://httpd.apache.org/docs/2.4/mod/core.html#options # for more information. # #Options Indexes FollowSymLinks #Options FollowSymLinks Options FollowSymLinks ExecCGI AddHandler fcgid-script .php FcgidWrapper /usr/local/php/bin/php-wrapper .php # # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # AllowOverride FileInfo AuthConfig Limit # #AllowOverride None AllowOverride FileInfo # # Controls who can get stuff from this server. # Require all granted </Directory>
ラッパースクリプト作成します。
※ 公式とこちらを参考にしました。
# vi /usr/local/php/bin/php-wrapper #!/bin/sh # Set desired PHP_FCGI_* environment variables. # Example: # PHP FastCGI processes exit after 500 requests by default. export PHP_FCGI_MAX_REQUESTS=10000 export PHP_FCGI_CHILDREN=0 # Replace with the path to your FastCGI-enabled PHP executable exec /usr/local/php/bin/php-cgi # chmod 755 /usr/local/php/bin/php-wrapper
Apacheのmod_phpを無効にする
# vi /usr/local/httpd/conf/httpd.conf #LoadModule php7_module modules/libphp7.so #<FilesMatch \.php$> # SetHandler application/x-httpd-php #</FilesMatch>
Apache再起動
# systemctl reload httpd.service
Apacheでモジュールの確認
# apachectl -M | grep fcgid fcgid_module (shared) # apachectl -M | grep php (表示なし)
ドキュメントルート直下等にphpinfoファイルを作成。
# echo "<?php phpinfo(); ?>" > phpinfo.php
ブラウザからPHP画面を確認。Server APIの項目がCGI/FastCGIになっていることを確認する。
確認が終わったらphpinfo.phpは削除しておく
# rm -f phpinfo.php
MPM変更
ApacheのMPMをeventに変更します。
変更前のMPM確認
# apachectl -M | grep mpm mpm_prefork_module (shared)
httpd.confでpreforkをコメントアウト、eventをアンコメントする
LoadModule mpm_event_module modules/mod_mpm_event.so #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
Apache再起動
※reloadだと反映されないのでstop/startする
# systemctl stop httpd.service # systemctl start httpd.service
変更後のMPM確認
# apachectl -M | grep mpm mpm_event_module (shared)
以上です。
参考
http://yomon.hatenablog.com/entry/2016/11/19/214806
http://php.net/manual/ja/install.fpm.php
http://norikone.hatenablog.com/entry/2016/02/07/Apache2_4_prefork%2Bmod_php%E3%81%8B%E3%82%89event%2Bphp-fpm%2Bmod_proxy_fcgi%E3%81%B8
https://www.softel.co.jp/blogs/tech/archives/2100