PHP7.2.10をソースからインストールしphp-fpmも設定

OS: Ubuntu 18.04.1 LTS
Apache 2.4.34
PHP 7.2.10

まずはPHP7.2.10をソースコードからインストールする。この際、wgetを使うとファイル名がmirrorになってしまって参った。--trust-server-namesオプションを付加するとphp-7.2.10.tar.bz2という具合に望みのファイル名となった。

$ wget -c http://jp2.php.net/get/php-7.2.10.tar.bz2/from/this/mirror --trust-server-names
$ wget -c http://jp2.php.net/get/php-7.2.10.tar.bz2.asc/from/this/mirror --trust-server-names

$ gpg --recv-key DC9FF8D3EE5AF27F
$ gpg --verify php-7.2.10.tar.bz2.asc

$ tar jxvf php-7.2.10.tar.bz2
$ cd php-7.2.10/

まずはconfigureスクリプトを実行する。普段指定しているオプションのために必要なパッケージがいくらかあるので此れを予めインストールしておく。さもないと次のようなメッセージに見舞われる。

メッセージ必要なパッケージ
configure: error: libxml2 not found.
Please check your libxml2 installation.
libxml2-dev
checking for cURL 7.10.5 or greater…
configure: error: cURL version 7.10.5 or later
is required to compile php with cURL support
libcurl4-gnutls-dev
configure: error: jpeglib.h not found.libjpeg-dev
configure: error: png.h not found.libpng-dev
Do you want to send this report now? [Yns]: s
sh: 1: autoconf: not found
autoconf
表1. エラーメッセージの解消に必要なパッケージ

libcurl4についてはGnuTLS、NSS、OpenSSLという三種のフレーバーが揃い踏みであった。果たしてどれを選んだものか分からないのでひとまずGnuTLSフレーバーを選択した。autoconfパッケージはmake testの結果レポート保存に必要なだけであるからインストールしなくとも差し障りなかった。

$ sudo apt install libxml2-dev libcurl4-gnutls-dev libjpeg-dev libpng-dev autoconf

ライブラリが準備できたら愈々configureスクリプトを実行する。FPM(FastCGI Process Manager)を有効にしたいので --enable-fpm の追加を忘れない。あとは障りなければインストールまですんなり捗る。

$ ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysqli --with-openssl --with-zlib --enable-exif --with-gd --with-jpeg-dir --with-png-dir --with-zlib-dir --enable-mbstring --enable-pcntl --enable-soap --enable-zip --enable-fpm --enable-opcache --with-curl --enable-intl --with-pdo-mysql
$ make
$ make test
$ sudo make install

なおmake testでは33件もの失敗が発生したけれども、レポート上位のものばかりであったから、よくある事として高を括ることに吝かでない。

図1. レポートの上位に位置するテスト

php.iniの雛形を指定のディレクトリへコピーして、ApacheがPHPのモジュールをロードする設定になっているか点検する。

$ sudo cp php.ini-development /usr/local/lib/php.ini
$ grep libphp7.so /usr/local/apache2/conf/httpd.conf
LoadModule php7_module        modules/libphp7.so

次にphp-fpmを使用するための設定をおこなう。php-fpmにはApacheのモジュールmod_proxy_fcgi.soのロードが求められる。そのmod_proxy_fcgi.soにはmod_proxy.soが要求されるから共にロードするようhttpd.confを書き換える。

php-fpmの設定は様々、存在するようである。うち、SetHandlerディレクティブで以ってPHPスクリプトの全要求をリバースプロキシを用いて、指定のFastCGIサーバーへ渡す設定が良さそうな情勢であった。これがもっとも正確にPATH_INFOが計算できるという触れ込みである。この記述はApache2.4.10から使用できるということであった。

$ sudo vi /usr/local/apache2/conf/httpd.conf
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

<FilesMatch "\.php$">
    # Note: The only part that varies is /path/to/app.sock
    #SetHandler  "proxy:unix:/path/to/app.sock|fcgi://localhost/"
    SetHandler  "proxy:unix:/home/guro/tmp/php/php-fpm.sock|fcgi://localhost/"
</FilesMatch>

<Proxy "fcgi://localhost/" enablereuse=on max=10>
</Proxy>

続いてFPMのグローバルなオプションを記載する設定ファイルを雛形からコピーして書き換える。includeの箇所がNONEになっていてパスが有効でないから修正しておく。

$ cd /usr/local/etc/
$ sudo cp -av php-fpm.conf.default php-fpm.conf
$ sudo vi php-fpm.conf
;include=NONE/etc/php-fpm.d/*.conf
include=/usr/local/etc/php-fpm.d/*.conf

php-fpm.dディレクトリ内にプロセスプールの設定を個別に用意する。listenではFastCGIのリクエストを受け付けるアドレスを指定する。選択肢はUNIXドメインソケットとTCPソケットの二種類である。UNIXドメインソケットのほうがパフォーマンスが優秀であるとほうぼうで評判であるから此れを選択した。

$ mkdir -p /home/guro/tmp/php
$ cd php-fpm.d/
$ sudo vi guro.conf
[guro]
user = guro
group = guro

listen = /home/guro/tmp/php/php-fpm.sock
listen.owner = guro
listen.group = guro
listen.mode  = 0666

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

access.log = var/log/$pool.access.log
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
slowlog = var/log/$pool.log.slow
request_slowlog_timeout = 10

catch_workers_output = yes 

設定が一段落したら文法の誤りをチェックする。ここで間違いが見つかればメッセージが現れるからつぶさに調べて正す。

$ sudo /usr/local/sbin/php-fpm -t
[25-Sep-2018 06:51:03] ERROR: [/usr/local/etc/php-fpm.conf:125] unknown entry '#include'
[25-Sep-2018 06:51:03] ERROR: failed to load configuration file '/usr/local/etc/php-fpm.conf'
[25-Sep-2018 06:51:03] ERROR: FPM initialization failed

$ sudo /usr/local/sbin/php-fpm -t
[25-Sep-2018 06:52:01] NOTICE: configuration file /usr/local/etc/php-fpm.conf test is successful

文法テストに合格したので手動でphp-fpmを起動すると、思惑通りに立ち上がって来ているようである。phpinfo()にもphp-fpmがactiveとして表示されているからまず間違いない様子である。

$ sudo /usr/local/sbin/php-fpm
$ ps axuwf | grep php-fp[m]
root      94279  0.0  0.3 192168 13044 ?        Ss   06:54   0:00 php-fpm: master process (/usr/local/etc/php-fpm.conf)
guro      94280  0.0  0.3 194468 12744 ?        S    06:54   0:00  \_ php-fpm: pool guro
guro      94281  0.0  0.3 194468 12744 ?        S    06:54   0:00  \_ php-fpm: pool guro
図2. php-fpmが有効になった様子

そうしたらどこへ出しても恥ずかしいコンテンツを設置して終いである。

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください