Apache 2.4.29 event + PHP-FPM + mod_fcgid

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