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 |
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件もの失敗が発生したけれども、レポート上位のものばかりであったから、よくある事として高を括ることに吝かでない。
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
そうしたらどこへ出しても恥ずかしいコンテンツを設置して終いである。