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オプションを付加しておくと良さそうである。

$ 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スクリプトを実行してはエラーメッセージに足止めされ指定されたライブラリをaptでインストールするというルーチンを幾度も繰り返すのが常であるから、前もって入り用になると調べがついているライブラリは予めまとめて取り入れておくと後が大変気安い。

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

メッセージ 必要なパッケージ
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
$ sudo apt install libxml2-dev libcurl4-gnutls-dev libjpeg-dev libpng-dev autoconf

必要なライブラリをインストールしたら愈々configureスクリプトを実行する。FPM(FastCGI Process Manager)を有効にしたいので --enable-fpm の追加を忘れてはならない。あとは障りがなければインストールまですんなり捗る。なおmake testで33件失敗が発生していたけれども上位に位置するエラーばかりであったからよくある事として高を括ることに吝かでない。

$ ./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

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を書き換える。

そして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

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

参考:
PHP: Apache 2.x (Unixシステム用) – Manual
mod_proxy_fcgi – Apache HTTP Server Version 2.4
php-fpm.conf のグローバル設定項目

Similar Posts:

コメントを残す

メールアドレスが公開されることはありません。

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