apache2 を mpm_worker + php-fpm で動かすために、色々イジったのでメモ

今回やりたいこと

しばらく前から、自分のところは HTTP/2 対応が完了していたんですが、apache2 パッケージを 2.4.27-* にアップデートすることに伴って HTTP/2 が無効化されてしまうのを回避する、というのが今回のお題目。
mpm-prefork を使わなければ、 HTTP/2 が使えている状況をデクレードせずに済むというのなら、 mpm-prefork 使わない設定に変えますよ、ということで

  • mpm-prefork + mod_php7.0

となっていた構成を、これを HTTP/2 も有効なまま動かすことの出来る

  • mpm-worker + php-fpm


の構成へ変更していく手順をまとめておきます。
#このエントリ書くために、mpm-prefork + mod_php7.0 に一旦戻しましたとも…。

少し前に書いたエントリー

今回は、 prefork から worker に変更したんですが、それに合わせて FastCGI 対応と PHP7.0 の fpm 対応をして(この辺、作業メモ取り忘れてた…)、さぁ Apache 再起動! と思ったら

[From HTTP/2 が、いつの間にか無効状態になっていまして… - Soukaku's HENA-CHOKO Blog]

の落ち穂拾いでもあります。


手順その1:mpm-prefork から mpm-worker に変更

まずは、 Apache のマルチプロセッシングモジュールを prefork から worker に変更します。

root@vps2:~# apache2ctl stop
[Thu Oct 19 21:26:57.619130 2017] [alias:warn] [pid 6503] AH00671: The Alias directive in /etc/apache2/mods-enabled/alias.conf at line 14 will probably never match because it overlaps an earlier Alias.
root@vps2:~# a2dismod php7.0 mpm_prefork
Module php7.0 disabled.
Module mpm_prefork disabled.
To activate the new configuration, you need to run:
service apache2 restart
root@vps2:~# a2enmod mpm_worker
Considering conflict mpm_event for mpm_worker:
Considering conflict mpm_prefork for mpm_worker:
Enabling module mpm_worker.
To activate the new configuration, you need to run:
service apache2 restart
root@vps2:~# apache2ctl start
[Thu Oct 19 21:28:02.211255 2017] [alias:warn] [pid 6669:tid 139744273626304] AH00671: The Alias directive in /etc/apache2/mods-enabled/alias.conf at line 14 will probably never match because it overlaps an earlier Alias.

この段階で、一旦 PHP ベースで動くもの(例えば Zabbix の Web インタフェース)が使えなくなるので、その点は注意。
#あと、 Apache2 の起動や再起動のたびに alias:warm が出てきますが、そこは見なかったことに…。

手順その2:php-fpm をインストール & 設定(ついでに PHP7.1 化)

続いて、php-fpm が使える環境を作ります。
まーそのまんま PHP7.0 用にセットアップしてもいいんでしょうけど、エイヤッと PHP7.1 化もやってしまいます。

ちまちま、パッケージ選択してインストールするのも面倒だし、インストール漏れが出て来るのも嫌なので、既にインストール済みの php7.0 パッケージの一覧を取得、そのパッケージ名の "7.0" の部分を "7.1" に置き換えて、一気にインストールすることににして、このタイミングで一緒に libapache2-mod-fcgid と php7.1-fpm もインストール対象として指定します。そうしないと、依存関係の解決のために libapache2-mod-php7.1 をインストールしようとしますから、手順その1をやり直し。
PHP7.0 のままで、ということであれば libapache2-mod-fcgid と php7.0-fpm をインストールしてくださいね。

root@vps2:~# aptitude install `aptitude search ^php7.0 | grep ^i | perl -pe 's/^i.* (php7\.0.*) -.*$/$1/;tr/0/1/'` php7.1-fpm libapache2-mod-fcgid
以下の新規パッケージがインストールされます: libapache2-mod-fcgid php7.1 php7.1-bcmath php7.1-bz2 php7.1-cli php7.1-common php7.1-curl php7.1-fpm php7.1-gd
php7.1-json php7.1-ldap php7.1-mbstring php7.1-mcrypt php7.1-mysql php7.1-opcache php7.1-readline php7.1-sqlite3
php7.1-xml php7.1-zip
更新: 0 個、新規インストール: 19 個、削除: 0 個、保留: 2 個。
〜〜 以下略 〜〜

これでパッケージのダウンロードからインストール、php7.1-fpm の起動、 Apache2 の再起動までが一気に完了します。

但し、まだこの段階では、 php の処理ができる状態になっていないので、基本的な設定を追加していきます。

/etc/apache2/conf-available/php7.1-fpm.conf に対してphp が実行されるように AddHander ディレクティブなどの設定を追加。

root@vps2:~# diff -u /etc/apache2/conf-available/php7.1-fpm.conf~ /etc/apache2/conf-available/php7.1-fpm.conf
--- /etc/apache2/conf-available/php7.1-fpm.conf~ 2017-08-04 03:35:23.000000000 +0900
+++ /etc/apache2/conf-available/php7.1-fpm.conf 2017-10-19 21:56:21.921266689 +0900
@@ -1,6 +1,11 @@
# Redirect to local php-fpm if mod_php is not available
<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
+
+ AddHandler php.fcgi .php
+ Action php.fcgi /php.fcgi
+ Alias /php.fcgi /usr/lib/cgi-bin/php.fcgi
+
# Enable http authorization headers
<IfModule setenvif_module>
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1

変更したら a2enconf コマンドを使って、 php7.1-fpm.conf を Apache2 に読み込ませるようして、 Apache2 を再起動します。

root@vps2:~# apache2ctl graceful
[Thu Oct 19 21:59:04.723830 2017] [alias:warn] [pid 23353:tid 140113985750208] AH00671: The Alias directive in /etc/apache2/mods-enabled/alias.conf at line 14 will probably never match because it overlaps an earlier Alias.

ここまでやると、phpinfo() が表示できるようになり、ほぼ問題なく php ベースのものが使えるようになっているはずです。

phpinfoをPHP7.1+fcgid環境で表示

もちろん、主目的である HTTP/2 も有効なままで、というのもクリア!

root@vps2:~# curl --http2 -IL https://www.downtown.jp/
HTTP/2 200
date: Thu, 19 Oct 2017 13:54:59 GMT
server: Apache/2.4.27 (Debian)
accept-ranges: bytes
cache-control: max-age=519491
expires: Wed, 25 Oct 2017 14:13:11 GMT
vary: Accept-Encoding
strict-transport-security: max-age=31536000; includeSubDomains; Preload
content-length: 13292
content-type: text/html

手順その3:ちまちまと、設定手直し

基本的な設定が終わっても、個々で変更かけないといけない物がチラホラあったりして、それが一番顕著にわかるのが Zabbix 。

mod_php を使っていれば、/etc/apache2/conf-available/zabbix-frontend-php.conf 中の <IfModule mod_php7.c> 〜 </IfModule> に書かれている php_value の値を参照して php が動作するのですけど、 php-fpm 対応にしたことで、その部分の値が読み込まれず、以下のようなエラーメッセージが GUI に表示されるようになります。

ZabbixのGUIに表示されたエラー

それを解消するために、 /etc/php/7.1/fpm/php.ini を修正。修正した内容を反映するために php7.1-fpm を再起動すれば OK となります。

root@vps2:~# diff -u /etc/php/7.1/fpm/php.ini~ /etc/php/7.1/fpm/php.ini
--- /etc/php/7.1/fpm/php.ini~ 2017-08-04 03:35:23.000000000 +0900
+++ /etc/php/7.1/fpm/php.ini 2017-10-19 22:34:10.853331383 +0900
@@ -380,7 +380,7 @@
; Maximum execution time of each script, in seconds
; http://php.net/max-execution-time
; Note: This directive is hardcoded to 0 for the CLI SAPI
-max_execution_time = 30
+max_execution_time = 300

; Maximum amount of time each script may spend parsing request data. It's a good
; idea to limit this time on productions servers in order to eliminate unexpectedly
@@ -390,7 +390,7 @@
; Development Value: 60 (60 seconds)
; Production Value: 60 (60 seconds)
; http://php.net/max-input-time
-max_input_time = 60
+max_input_time = 300

; Maximum input variable nesting level
; http://php.net/max-input-nesting-level
@@ -668,7 +668,7 @@
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
; http://php.net/post-max-size
-post_max_size = 8M
+post_max_size = 16M

; Automatically add files before PHP document.
; http://php.net/auto-prepend-file
@@ -937,6 +937,7 @@
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
;date.timezone =
+date.timezone = Asia/Tokyo

; http://php.net/date.default-latitude
;date.default_latitude = 31.7667
root@vps2:~# service php7.1-fpm restart
[ ok ] Restarting PHP 7.1 FastCGI Process Manager: php-fpm7.1.

ということで、落ち穂拾いは完了。
調べてみると、apache2 + mpm-worker + php-fpm の環境を新規に作るというやつとか、mpm-prefork のまま php-fpm 環境に移行する(その場合、 php の実行負荷の軽減対策を兼ねて)というのは結構見つかるんですけど、今回の自分のように「 HTTP/2 環境を維持したいから」 mpm_prefork から mpm_worker への移行するというのは、探し方が悪かったのか見つからなかったんですよね…。
サラッと書いているようで、結構ハマってたりするんで、これが他の人の参考になると幸いです。

なお、php7.1-fpm の設定については、以下のページを参考にしています。

On this post I'll show you how to run Drupal 8 or any PHP application using Apache HTTP Server with mod_event enabled and PHP 7-FPM

[From Run PHP7-FPM with Apache mpm_event on Ubuntu 16.04 | antrecu]

トラックバック(0)

コメントする