AlmaLinux 8

AlmaLinux 8.5 セットアップメモ

Section 5.2 Webサーバー(nginx)構築編 AppStream php7.4

About

nginx(https://nginx.org/) に PHP(https://www.php.net/) をセットアップしていきます。

環境は、Section 5.1を行った直後の状態からとなります。

AppStreamのバージョン等を調べる

AppStreamのモジュール管理されているのでバージョン情報等を確認します。

[root@localhost ~]# dnf module list php
AlmaLinux 8 - AppStream
Name         Stream          Profiles                           Summary
php          7.2 [d]         common [d], devel, minimal         PHP scripting language
php          7.3             common [d], devel, minimal         PHP scripting language
php          7.4             common [d], devel, minimal         PHP scripting language

ヒント: [d]efault, [e]nabled, [x]disabled, [i]nstalled

バージョンの切り替え

Laravel等のフレームワークを使う場合は、必須バージョンや対応バージョンを確認してからバージョンを設定する必要がありますが、現時点(2022年4月)で、PHP 8.1 が出ているくらいなので、7.4 を選択しておいて間違いはないでしょう。それよりも気になるのは、AppStreamでPHP8出てくるのだろうか?結局remi(https://rpms.remirepo.net/)に頼るのか……

[root@localhost ~]# dnf module enable php:7.4
依存関係が解決しました。
==============================================================================================
 パッケージ            アーキテクチャー     バージョン            リポジトリー          サイズ
==============================================================================================
モジュールストリームの有効化中:
 httpd                                      2.4
 php                                        7.4

トランザクションの概要
==============================================================================================

これでよろしいですか? [y/N]: y
完了しました!
[root@localhost ~]# dnf module list php
AlmaLinux 8 - AppStream
Name         Stream          Profiles                           Summary
php          7.2 [d]         common [d], devel, minimal         PHP scripting language
php          7.3             common [d], devel, minimal         PHP scripting language
php          7.4 [e]         common [d], devel, minimal         PHP scripting language

ヒント: [d]efault, [e]nabled, [x]disabled, [i]nstalled
[root@localhost ~]# 

phpをインストールすると決まると、勝手にhttpdつまりapacheも入ってしまうそうで……無効にする方法も無さそうなのでこのまま進めます。

インストール

php本体となにかと使うモジュールをインストールします。不要なモジュールは入れないのが基本です。DBを使う場合でも使うDBに関連するモジュール以外は入れないように気を付けてください。今回は、PostgreSQL を使いたいのでそのモジュールを入れます。

[root@localhost ~]# dnf install php php-cli php-common php-fpm \
php-gd php-json php-mbstring php-xml php-intl \
php-pdo php-pgsql \
php-pecl-apcu php-opcache
依存関係が解決しました。
==============================================================================================
 パッケージ              Arch   バージョン                                    Repo      サイズ
==============================================================================================
インストール:
 php                     x86_64 7.4.19-1.module_el8.5.0+2578+cc873159         appstream 1.5 M
(中略)
==============================================================================================
インストール  37 パッケージ

ダウンロードサイズの合計: 14 M
インストール後のサイズ: 52 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
(中略)

完了しました!
[root@localhost ~]#

PHPの設定

そのままの設定では日本語などの扱いに問題が出るので設定を変更します。

主に変更する内容は下記の表の通り。

オプション名 uncomment 元の内容 変更後の内容
realpath_cache_size 4096k 4096k
expose_php On Off
memory_limit 128M 192M
error_reporting E_ALL & ~E_DEPRECATED & ~E_STRICT E_ALL
display_errors Off On
post_max_size 8M 32M
upload_max_filesize 2M 20M
date.timezone “Asia/Tokyo”
mbstring.language Japanese
mbstring.internal_encoding “UTF-8”
mbstring.http_input “UTF-8”
mbstring.http_output UTF-8

説明も大変なのでsedコマンドを使って一気に書き換えます。

[root@localhost ~]# cp /etc/php.ini /etc/php.ini.org
[root@localhost ~]# cat /etc/php.ini.org \
| sed -E "s/;(realpath_cache_size =)(.*$)/\1 4096k/" \
| sed -E "s/(expose_php =)(.*$)/\1 Off/" \
| sed -E "s/(memory_limit =)(.*$)/\1 192M/" \
| sed -E "s/^(error_reporting =)(.*$)/\1 E_ALL/" \
| sed -E "s/(display_errors =)(.*$)/\1 On/" \
| sed -E "s/(post_max_size =)(.*$)/\1 32M/" \
| sed -E "s/(upload_max_filesize =)(.*$)/\1 20M/" \
| sed -E "s/;(date.timezone =)(.*$)/\1 \"Asia\/Tokyo\"/" \
| sed -E "s/;(mbstring.language .*)$/\1/" \
| sed -E "s/;(mbstring.internal_encoding =)(.*)$/\1 UTF-8/" \
| sed -E "s/;(mbstring.http_input =)(.*)$/\1 UTF-8/" \
| sed -E "s/;(mbstring.http_output =)(.*)$/\1 UTF-8/" \
 > /etc/php.ini 

PHP-FPM の設定

nginxから使うのは、php-fpmにするので、それ用の設定を行います。基本的に動作させるユーザーがapaheになっているで、nginxに書き換えるだけです。

ここもsedコマンドを使って一気に書き換えます。

[root@localhost ~]# cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/.www.conf.org
[root@localhost ~]# cat /etc/php-fpm.d/.www.conf.org \
| sed -E "s/(user = )(.*$)/\1 nginx/" \
| sed -E "s/(owner = )(.*$)/\1 nginx/" \
| sed -E "s/(group = )(.*$)/\1 nginx/" \
| sed -E "s/;(listen\.owner*)/\1/" \
| sed -E "s/;(listen\.group*)/\1/" \
| sed -E "s/;(listen\.mode*)/\1/" \
> /etc/php-fpm.d/www.conf

何が書き換わったかはdiffを見てみましょう。

*** /etc/php-fpm.d/.www.conf.org    YYYY-mm-dd hh:ii:ss.000000000 +0900
--- /etc/php-fpm.d/www.conf         YYYY-mm-dd hh:ii:ss.000000000 +0900
***************
*** 21,29 ****
        ; Note: The user is mandatory. If the group is not set, the default user's group
        ;       will be used.
        ; RPM: apache user chosen to provide access to the same directories as httpd
!       user = apache
        ; RPM: Keep a group allowed to write in log dir.
!       group = apache

        ; The address on which to accept FastCGI requests.
        ; Valid syntaxes are:
--- 21,29 ----
        ; Note: The user is mandatory. If the group is not set, the default user's group
        ;       will be used.
        ; RPM: apache user chosen to provide access to the same directories as httpd
!       user =  nginx
        ; RPM: Keep a group allowed to write in log dir.
!       group =  nginx

        ; The address on which to accept FastCGI requests.
        ; Valid syntaxes are:
***************
*** 45,53 ****
        ; permissions must be set in order to allow connections from a web server.
        ; Default Values: user and group are set as the running user
        ;                 mode is set to 0660
!       ;listen.owner = nobody
!       ;listen.group = nobody
!       ;listen.mode = 0660

        ; When POSIX Access Control Lists are supported you can set them using
        ; these options, value is a comma separated list of user/group names.
--- 45,53 ----
        ; permissions must be set in order to allow connections from a web server.
        ; Default Values: user and group are set as the running user
        ;                 mode is set to 0660
!       listen.owner =  nginx
!       listen.group =  nginx
!       listen.mode = 0660

        ; When POSIX Access Control Lists are supported you can set them using
        ; these options, value is a comma separated list of user/group names.

nginxとの連携設定について

webアクセスでphpが動作するように連携する設定がされているので、必要があれば変更しましょう。

主に、 /etc/nginx/default.d/php.conf/etc/nginx/conf.d/php-fpm.conf が対象となります。

サービスの起動

php-fpmはサービスの一つとして常駐するようなものとなるので、サービスに登録して起動する必要があります。設定変更時にも、サービスを再起動する必要が出てくるので忘れずに。

まずは登録。

[root@localhost ~]# systemctl enable php-fpm

そのあとは、起動しつつ、nginxも再起動します。

[root@localhost ~]# systemctl start php-fpm
[root@localhost ~]# systemctl restart nginx

動作確認

phpinfo() を表示するページを準備してアクセスしてみましょう。

[root@localhost ~]# echo "<?php phpinfo();" > /var/www/html/index.php

これで、ネットワーク的に問題が無ければブラウザでアクセスすれば、phpinfoが表示されます。