今回やりたいこと
しばらく前から、自分のところは HTTP/2 対応が完了していたんですが、apache2 パッケージを 2.4.27-* にアップデートすることに伴って HTTP/2 が無効化されてしまうのを回避する、というのが今回のお題目。
mpm-prefork を使わなければ、 HTTP/2 が使えている状況をデクレードせずに済むというのなら、 mpm-prefork 使わない設定に変えますよ、ということで
となっていた構成を、これを HTTP/2 も有効なまま動かすことの出来る
の構成へ変更していく手順をまとめておきます。
#このエントリ書くために、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 ベースのものが使えるようになっているはずです。
もちろん、主目的である 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 に表示されるようになります。
それを解消するために、 /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]
コメントする