LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-06-16
../

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で「お問い合わせ画面」を実装してみた」で作成した一式を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のまま使用する。

session_save_path('/xxx/session');
session_start();
../
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0