PHP 実行環境を fcgid + php-cgi から PHP-FPM に変更

以前に公開したエントリ、「mod_fcgid 設定」で紹介した様に、本サイトの php 実行環境は fcgid + php-cgi で行っていました。
が、今回興味があって、PHP-FPM で実行する様に変更したので、その備忘録です。

ちなみに変更前の環境は Debian GNU/Linux 9 + Apache 2.4 + fcgid + php-cgi (PHP 7.0) で動作する設定で、今回はこれを fcgid + php-cgi 部分について fgcid + PHP-FPM (PHP7.0) で実行する様変更したものです。

なお、設定内容はあくまで例です。また間違いがあればコメント欄でいただけると嬉しいです。

■インストール

# apt-get install php-fpm

■設定ファイルを準備

・/etc/apache2/mods-available/proxy.conf

<IfModule mod_proxy.c>
	ProxyRequests Off
</IfModule>

・/etc/apache2/mods-available/fcgid.conf

<IfModule mod_fcgid.c>
  <IfModule mod_mime.c>
    AddHandler fcgid-script .fcgi
  </IfModule>
  FcgidConnectTimeout 20
</IfModule>

・/etc/apache2/conf-available/php7.0-fpm.conf

# Redirect to local php-fpm if mod_php is not available
<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
    # Enable http authorization headers
    <IfModule setenvif_module>
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
    </IfModule>

    # OFF: 各バーチャルホストごとで、php を実行するユーザを分けるため
    #<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
    #    SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost"
    #</FilesMatch>

    <FilesMatch ".+\.phps$">
        # Deny access to raw php sources by default
        # To re-enable it's recommended to enable access to the files
        # only in specific virtual host or directory
        Require all denied
    </FilesMatch>
    # Deny access to files without filename (e.g. '.php')
    <FilesMatch "^\.ph(p[3457]?|t|tml|ps)$">
        Require all denied
    </FilesMatch>
</IfModule>
</IfModule>

・/etc/apache2/sites-available/000-default.conf

デフォルトバーチャルホスト: www-data 権限で php を実行。(実際には www-data 権限で php を実行したいバーチャル全てにおいて設定が必要)

<VirtualHost *:80>
	DocumentRoot /var/www/html

	<Directory />
		Options FollowSymLinks
		AllowOverride None
		Require all denied
	</Directory>

	<Directory /var/www/>
		Options Indexes FollowSymLinks
		AllowOverride None
		Require all granted
	</Directory>

	<IfModule proxy_fcgi_module>
		<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
			SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost"
		</FilesMatch>
	</IfModule>

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

・/etc/apache2/sites-available/www.example.com.conf

サンプルのバーチャルホスト: example 権限で php を実行。(実際には各バーチャルホストごとに設定が必要)

<VirtualHost *:80>
	ServerName www.example.com
	ServerAdmin webmaster@example.com

	SuexecUserGroup example example

	DocumentRoot /home/example/html

	<Directory />
		Options None
		AllowOverride None
		Require all denied
	</Directory>

	<Directory /home/example/html/>
		Options SymLinksIfOwnerMatch ExecCGI
		AllowOverride AuthConfig FileInfo Indexes Limit Options=ExecCGI,Indexes,SymLinksIfOwnerMatch,MultiViews
		Require all granted
	</Directory>

	<IfModule proxy_fcgi_module>
		<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
			SetHandler "proxy:unix:/run/php/php7.0-fpm-example.sock|fcgi://localhost"
		</FilesMatch>
	</IfModule>

	ErrorLog ${APACHE_LOG_DIR}/www.example.com-error.log
	CustomLog ${APACHE_LOG_DIR}/www.example.com-access.log combined
</VirtualHost>

・/etc/php/7.0/fpm/pool.d/www.conf

デフォルトバーチャルホストから呼び出す用の php-fpm の設定。(php スクリプトを www-data 権限で実行する)
こちらはプロセス数は静的。(pm = static)

[www]
user = www-data
group = www-data
listen = /run/php/php7.0-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = static
pm.max_children = 2
pm.process_idle_timeout = 10s;
pm.max_requests = 1000
security.limit_extensions = .php

・/etc/php/7.0/fpm/pool.d/example.conf

サンプルのバーチャルホストから呼び出す用の php-fpm の設定。(php スクリプトを example 権限で実行する)
こちらのプロセス数は最大 5 までの動的。(pm = dynamic)

[example]
user = example
group = example
listen = /run/php/php7.0-fpm-example.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.process_idle_timeout = 10s
pm.max_requests = 1000
security.limit_extensions = .php

いずれの場合でも、Apache 2.4 側では PHP-FPM に対して .php 以外にも .php3 や .phtml と言った拡張子も渡されるが、実際に実行されるのは .php 拡張子のものだけである。

■設定を有効化する

# a2enmod actions proxy_fcgi setenvif
# a2disconf php7.0-cgi
# a2enconf php7.0-fpm
# /etc/init.d/php7.0-fpm restart
# /etc/init.d/apache2 restart

■実際の効果

おおよそではありますが、本サイトのトップページで調べてみたところ、秒間処理可能数リクエストは、fcgid + php-cgi に比べ、
・PHP-FPM では約 10 倍
・PHP-FPM に opcache を設定した場合は約 30 倍
になりました。(ちなみに全部 Apache 2.4 は mpm_event で駆動)

結構早くなるものなのですね。もっとチューニングしたら早くなるものでしょうかね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です