よくわからないエンジニア

よく分からないエンジニアの日々の記録

よくわからないエンジニア

CentOS7 php7 ソースインストール(PHP-FPM)

今回はCentOS7にphp7をインストールします。
php-fpm使うのは初めてなので、気をつけて入れていきます。

目次

なぜphp-fpmを使うのか

今回apacheのmpmをeventでインストールしています。

www.unknownengineer.net

普段はpreforkで使っているので、mod_phpを使えば良いのですが、mod_phpはスレッドセーフでは無い為、eventでは利用できません。
(スレッドセーフなんて言ってますがよく分かっていません。とりあえずeventの方がメモリ節約出来るって聞いたので導入してみたいだけです) 詳しいことは以下の記事を日本語翻訳して読むと分かるかもしれません。
http://z-issue.com/wp/apache-2-4-the-event-mpm-php-via-mod_proxy_fcgi-and-php-fpm-with-vhosts/
物は試しです。なんでもやってみて、駄目だったら違う方法を模索します。

phpのインストール

とりあえず最新版をダウンロードして解凍します。

# wget http://jp2.php.net/get/php-7.1.11.tar.gz/from/this/mirror
# tar xvfz mirror
# cd php-7.1.11/

mysqlをソースインストールしたのでオプションで明示的に指定します。後はphp-fpmを有効にするオプションを設定します。

# ./configure --prefix=/usr/local/php-7.1.11 --with-pdo-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --enable-fpm
configure: error: xml2-config not found. Please check your libxml2 installation.

パッケージを入れます。

# yum install libxml2-devel
# ./configure --prefix=/usr/local/php-7.1.11 --with-pdo-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --enable-fpm --with-gd --enable-gd-native-ttf --enable-gd-jis-conv --enable-intl --with-openssl --with-zlib
Thank you for using PHP.

config.status: creating php7.spec
config.status: creating main/build-defs.h
config.status: creating scripts/phpize
config.status: creating scripts/man1/phpize.1
config.status: creating scripts/php-config
config.status: creating scripts/man1/php-config.1
config.status: creating sapi/cli/php.1
config.status: creating sapi/fpm/php-fpm.conf
config.status: creating sapi/fpm/www.conf
config.status: creating sapi/fpm/init.d.php-fpm
config.status: creating sapi/fpm/php-fpm.service
config.status: creating sapi/fpm/php-fpm.8
config.status: creating sapi/fpm/status.html
config.status: creating sapi/cgi/php-cgi.1
config.status: creating ext/phar/phar.1
config.status: creating ext/phar/phar.phar.1
config.status: creating main/php_config.h
config.status: executing default commands
# make 
# make install
# ln -s /usr/local/php-7.1.11 php

なんかあんま苦労せずに入りました。

phpの設定

まずはphp.iniを用意して編集します。変更点はdiffを参照下さい。

# cp -p /usr/local/src/php-7.1.11/php.ini-production /usr/local/php/lib/php.ini
# diff -u /usr/local/src/php-7.1.11/php.ini-production /usr/local/php/lib/php.ini
--- /usr/local/src/php-7.1.11/php.ini-production        2017-10-25 16:04:42.000000000 +0900
+++ /usr/local/php/lib/php.ini  2017-11-18 21:37:23.064866164 +0900
@@ -371,7 +371,7 @@
 ; threat in any way, but it makes it possible to determine whether you use PHP
 ; on your server or not.
 ; http://php.net/expose-php
-expose_php = On
+expose_php = Off

 ;;;;;;;;;;;;;;;;;;;
 ; Resource Limits ;
@@ -936,7 +936,7 @@
 [Date]
 ; 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

php-fpm用のconfigファイルが作成されているので、こちらも編集します。

# cd /usr/local/php/
# cp -p etc/php-fpm.d/www.conf.default etc/php-fpm.d/www.conf
# diff -u  etc/php-fpm.d/www.conf.default etc/php-fpm.d/www.conf
--- etc/php-fpm.d/www.conf.default      2017-11-18 21:20:30.526581685 +0900
+++ etc/php-fpm.d/www.conf      2017-11-18 21:57:53.275716288 +0900
@@ -20,8 +20,8 @@
 ; Unix user/group of processes
 ; Note: The user is mandatory. If the group is not set, the default user's group
 ;       will be used.
-user = nobody
-group = nobody
+user = apache
+group = apache

 ; The address on which to accept FastCGI requests.
 ; Valid syntaxes are:

# cp -p etc/php-fpm.conf.default etc/php-fpm.conf
# diff -u  etc/php-fpm.conf.default etc/php-fpm.conf
--- etc/php-fpm.conf.default    2017-11-18 21:20:30.476580426 +0900
+++ etc/php-fpm.conf    2017-11-18 21:57:14.667750225 +0900
@@ -14,7 +14,7 @@
 ; Pid file
 ; Note: the default prefix is /usr/local/php-7.1.11/var
 ; Default Value: none
-;pid = run/php-fpm.pid
+pid = run/php-fpm.pid

 ; Error log file
 ; If it's set to "syslog", log is sent to syslogd instead of being written
@@ -78,7 +78,7 @@

 ; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging.
 ; Default Value: yes
-;daemonize = yes
+daemonize = yes

 ; Set open file descriptor rlimit for the master process.
 ; Default Value: system defined value

php-fpmの場合、apacheとは別にphp-fpmを起動する必要があります。

# vim /etc/systemd/system/php-fpm.service
[Unit]
Description=The PHP 7 FastCGI Process Manager
After=network.target

[Service]
Type=simple
PIDFile=/usr/local/php/var/run/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target

これでphp-fpmが起動すればオッケーです。

# systemctl start php-fpm.service
# ps aux |grep php
root      7882  0.0  0.7 161596  7428 ?        Ss   1118   0:01 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
apache    7883  0.0  0.5 163744  6080 ?        S    1118   0:00 php-fpm: pool www
apache    7884  0.0  0.5 163744  6080 ?        S    1118   0:00 php-fpm: pool www

apacheの設定

このままだとphp-fpmとapacheが別々に起動しているだけなので、phpの処理をphp-fpmに投げるようにapache側の設定を変更します。

# cd /usr/local/apache2/conf/
# vim httpd.conf
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so ←コメントアウト外します
# vim extra/httpd-vhosts.conf
            <FilesMatch \.php$>
                SetHandler "proxy:fcgi://127.0.0.1:9000/"
            </FilesMatch>

# systemd restart httpd

apacheを再起動した後に、phpinfo辺りが表示されるようになれば設定完了だと思います。