../ |
---|
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();
../ |
---|