CentOS Stream 8にPHP7.4をインストールする手順


|[../](https://qiita.com/taconana/items/d382d08a83a2a67f3b6a) |
|---|

CentOS8.xには、既にPHP7.2とnginx1.14がインストールされていた。どのタイミングでインストールされたものかは覚えていない。
※nginx1.14は、`noarch`(no architecture)になっていてどのOSでも使えるRPMパッケージのようだ。nginxは、エンジンエックスと読むのか。

CentOS Stream 8で、PHP7.4を使いたい。

## PHP7.4のインストール   

CentOS Stream 8で利用できる`php`のパッケージを確認する。リポジトリからphp7.2、php7.4などがインストール可能であることが分かる。インストール済みのPHP7.2を一旦削除してから開始する。
```
$ dnf remove php

$ dnf module list php
CentOS Stream 8 - AppStream  
Name Stream    Profiles   Summary   
php  7.2       common [d], devel, minimalPHP scripting language    
php  7.3       common [d], devel, minimalPHP scripting language    
php  7.4       common [d], devel, minimalPHP scripting language    
php  8.0       common [d], devel, minimalPHP scripting language    
```
PHP7.4を指定してインストールする。
```
$ dnf module install php:7.4
php            x86_64  7.4.19-2.module_el8.6.0+1075+ab70be85   appstream  1.5 M
php-cli        x86_64  7.4.19-2.module_el8.6.0+1075+ab70be85   appstream  3.1 M
php-common     x86_64  7.4.19-2.module_el8.6.0+1075+ab70be85   appstream  702 k
php-fpm        x86_64  7.4.19-2.module_el8.6.0+1075+ab70be85   appstream  1.6 M
php-json       x86_64  7.4.19-2.module_el8.6.0+1075+ab70be85   appstream   74 k
php-mbstring   x86_64  7.4.19-2.module_el8.6.0+1075+ab70be85   appstream  484 k
php-xml        x86_64  7.4.19-2.module_el8.6.0+1075+ab70be85   appstream  174 k
php-opcache    x86_64  7.4.19-2.module_el8.6.0+1075+ab70be85   appstream  267 k
php-pdo        x86_64  7.4.19-2.module_el8.6.0+1075+ab70be85   appstream  123 k
```
php-fpm(FastCGI Process Manager)は、Apache httpdからCGIモードで連携してくれるもの、php-mbstringはマルチバイト(主に日本語)に対応するためのものである。PDOやJSONもパッケージになっている。ちなみにPHP7.4には、nginxは含まれていない。nginxは別にinstallする必要がある。

インストールしたphpのバージョンを確認しておく。また、PHPが動作するかを確認しておく。
```
$ php -v
PHP 7.4.19 (cli) (built: May  4 2021 11:06:37) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.19, Copyright (c), by Zend Technologies

$ php -r 'echo 123 . PHP_EOL;'
123
```
Apache httpdのバージョンも確認しておこう。
```
$ httpd -v
Server version: Apache/2.4.37 (centos)
Server built:   Apr  6 2022 14:54:37
```
Apache httpdは、デフォルトではマルチプロセッシングモジュール(eventMPM)が設定されている。eventMPMでPHPを導入するためには php-fpm のインストールと設定が必要になる。php-fpmは、php7.4をインストールした際に合わせてインストールされ、サービスも起動してくれている。

設定ファイルは以下にある。ネット情報をもとに修正しておく。
※ネット情報で「コメントアウト」の意味を逆に解説しているものがありますね。comment out は対象のコードをコメント化して無効にすること。逆が uncommentで有効化すること。

```
$ vi /etc/httpd/conf/httpd.conf     // 特に触らない
$ vi /etc/httpd/conf.d/php.conf     // 特に触らない
$ vi /etc/httpd/conf.d/vhhost-xxx.conf // VirtualHostは個別に設定する。後述する。

$ vi /etc/php.ini
expose_php = Off
memory_limit = 128M
display_errors = Off
post_max_size = 20M
default_charset = "UTF-8"
upload_max_filesize = 20M
date.timezone = Asia/Tokyo
mbstring.language = Japanese
;mbstring.internal_encoding = UTF-8		// 非推奨
;mbstring.http_input = 					// 非推奨
;mbstring.http_output = 				// 非推奨
mbstring.encoding_translation = On
mbstring.detect_order = auto

$ vi /etc/php-fpm.d/www.conf
user = apache
group = apache
listen = /run/php-fpm/www.sock
listen.owner = apache
listen.group = apache
listen.mode = 0660
listen.allowed_clients = 127.0.0.1
pm.max_children = 25
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 500

$ systemctl restart httpd
$ systemctl restart php-fpm
$ systemctl status httpd
$ systemctl status php-fpm
```
httpd.confのデフォルトの設定では、/var/www/html がドキュメントルートになっている。そこにテスト用のindex.phpを置いてみる。
```
$ cd /var/www/html
$ vi index.php
<?php 
echo 'こんにちは' . PHP_EOL;
?>
```
仮にドメインがkankeri.comで設定されているとすると、
```
$ vi /etc/httpd/conf.d/vhhost-xxx.conf
<VirtualHost kankeri.com:80>
ServerName kankeri.com
ServerAlias www.kankeri.com
ServerAdmin webmaster@kankeri.com
DocumentRoot "/var/www/html/"

DirectoryIndex index.html index.php 
</VirtualHost>
```
以下のURLでアクセスして確認できる。「こんにちは」が出るはずである。「[PHPで「お問い合わせ画面」を実装してみた](https://qiita.com/taconana/items/5dd35e155f28e7be89ad)」で作成した一式をWindows環境からCentOS環境にWinSCPを使ってコピーし、/var/www/html/contact/ 配下に置き、アクセスしてみた。問題なく動作した。
```
http://kankeri.com/
http://kankeri.com/contact/
```

## php-fpmの所有者はapacheにしておく

/var/lib/php/session ディレクトリの権限とphp-fpmの所有者を整合させておく必要がある。不一致だと、PHPの実行時にsession_start()で以下のようなエラーが出る。
```
Warning: session_start(): open(/var/lib/php/session/sess_g09b7ghaqecin1hq656nmgm3c4, O_RDWR) failed: 
Permission denied (13) in ...
```
session_start()で /var/lib/php/session 配下にセッション情報を読み書きするためのファイルがオープンされるが、そこでエラーが起きている。/var/lib/php/session ディレクトリがroot権限になっていて、php-fpmのuser/groupもapache以外のものになっていた。両者の権限をapacheで揃えておくのがよいだろう。ちなみに、sess_xxxのファイルは、xxxがセッションIDで、中身が$_SESSIONに保持されたデータをserializeして書き込んだもののようだ。(※`$_SESSION`にセットした値は、ファイルに保存して共有しているのですね。ランダムアクセス可能なファイルなのかな。毎回すべてのデータを読み込んだり、書き込んだりしているのかな。)

php-fpmのuser/groupをapacheにし、/var/lib/php/session/の所有者もapacheにして合わせておきたい。
```
$ vi /etc/php-fpm.d/www.conf
user = apache
group = apache
listen.owner = apache
listen.group = apache

$ chown -R root:apache   /var/lib/php/session		// 前述のエラーになる
$ chown -R apache:apache /var/lib/php/session		// エラーにならない
$ ls -lag /var/lib/php/session
drwxrwx--- 2 apache 4096  6月 16 17:25 .
drwxr-xr-x 6 root   4096  1月 28 01:10 ..
-rw------- 1 apache 5092  6月 17 13:26 sess_g09b7ghaqecin1hq656nmgm3c4
```

ちなみに、セッション情報を配置するディレクトリは、PHPから明示的に変更できるそうだ。変更先のディレクトリに適切な所有者を設定しておくのが、より安全だそうだ。今回は、/var/lib/php/sessionのまま使用する。
```php
session_save_path('/xxx/session');
session_start();
```
|[../](https://qiita.com/taconana/items/d382d08a83a2a67f3b6a) |
|---|