Redhat9 + Nginx + PHP-FPM + MariaDB + phpMyAdmin + FTP でPHP8.2 の実行環境を構築する。

今回構築していく OS の環境を確認する

$ cat /etc/redhat-release
Red Hat Enterprise Linux release 9.3 (Plow)

サーバーのポートを開放する(AWS)

SELinuxを無効に設定する

一時的に無効化するには、以下のコマンドを実行します。

$ sudo setenforce 0

永続的に無効化するには「 /etc/selinux/config 」を変更します。

$ sudo vi /etc/selinux/config

# 「enforcing」になっている箇所をコメントアウトして「disabled」を追加
# SELINUX=enforcing
SELINUX=disabled

OSの最新化を行う

タイムゾーンを変更します。

$ sudo timedatectl set-timezone Asia/Tokyo
$ sudo timedatectl status
Local time: Thu 2023-02-16 08:30:51 JST
Universal time: Wed 2023-02-15 23:30:51 UTC
RTC time: Wed 2023-02-15 23:30:51
Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
NTP service: active

以下のコマンドを実行します。

$ sudo dnf update

定期更新を自動化する

EPELリポジトリに含まれるパッケージなので、EPELをインストールします。

$ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm

Rocky Linux 9 の場合は下記コマンドを実行します。

$ sudo dnf install epel-release

subscription-manager を無効化して、dnf-automaticをインストールします。

$ sudo vi /etc/yum/pluginconf.d/subscription-manager.conf
[main]
enabled=0

# When following option is set to 1, then all repositories defined outside redhat.repo will be disabled
# every time subscription-manager plugin is triggered by dnf or yum
disable_system_repos=0

$ sudo dnf install dnf-automatic

自動アップデートをスケジュールします。

$ sudo systemctl enable --now dnf-automatic.timer
$ sudo vi /etc/dnf/automatic.conf

[commands]
# What kind of upgrade to perform:
# default                            = all available upgrades
# security                           = only the security upgrades
upgrade_type = default

# Whether updates should be downloaded when they are available, by
# dnf-automatic.timer. notifyonly.timer, download.timer and
# install.timer override this setting.
download_updates = yes

# Whether updates should be applied when they are available, by
# dnf-automatic.timer. notifyonly.timer, download.timer and
# install.timer override this setting.
apply_updates = yes

# 毎日4時に自動更新する
[Timer]
OnCalendar=*-*-* 4:00

デーモンのリロードをします。

$ sudo systemctl daemon-reload

スケジュールの一覧を確認します。

$ sudo systemctl list-timers

NEXT                        LEFT      LAST  PASSED  UNIT                  ACTIVATES                     
Fri 2023-02-17 06:14:22 JST 15h left  n/a   n/a     dnf-automatic.timer   dnf-automatic.service

PHPをインストールする

OSデフォルトのPHP(5.4系など)がインストールされていないことを確認します。

$ sudo dnf list installed | grep php

もし、インストール対象外のPHPが出力された場合は削除をします。

$ sudo dnf remove php*

PHP 8.2をインストールします。

Remiパッケージを使用する方法もありますが、今回は標準インストールを使用します。

$ sudo dnf module enable php:8.2
$ sudo dnf install php php-fpm php-mysqlnd

PHP のバージョンを確認します。

$ php -v
PHP 8.1.8 (cli) (built: Jul  5 2022 21:55:55) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.1.8, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.8, Copyright (c), by Zend Technologies

php.ini のタイムゾーンを変更します。

$ sudo vi /etc/php.ini

[Date]
; Defines the default timezone used by the date functions
; https://php.net/date.timezone
;date.timezone =
date.timezone = "Asia/Tokyo"

タイムゾーンの変更を確認します。

$ php -i | grep timezone
Default timezone => Asia/Tokyo
date.timezone => Asia/Tokyo => Asia/Tokyo

PHP-FPMの自動起動を設定します。

$ sudo systemctl enable php-fpm

PHP-FPMを起動します。

PHP-FPMの起動、停止、再起動、ステータスの確認コマンドは以下を使用します。

$ sudo systemctl start php-fpm
$ sudo systemctl stop php-fpm
$ sudo systemctl restart php-fpm
$ sudo systemctl status php-fpm

Nginxをインストールする

Apacheをアンインストールします。

$ sudo dnf remove httpd

Nginxをインストールします。

$ sudo dnf install nginx
$ nginx -v
nginx version: nginx/1.20.1

PHPを使用できるようにconfを編集します。

$ sudo vi /etc/nginx/nginx.conf

server {
    listen 80;
    server_name  _;
    root /var/www/html;
    index index.php index.html;

    location ~ \.php$ {
        root           /var/www;
        fastcgi_pass   unix:/run/php-fpm/www.sock; 
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
        include        fastcgi_params;
    }
}

PHP-FPMの設定をします。

$ sudo vi /etc/php-fpm.d/www.conf

; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx # nginx にする
; RPM: Keep a group allowed to write in log dir.
group = nginx  # nginx にする

<省略>
; Note: This value is mandatory.
listen = /run/php-fpm/www.sock

<省略>
listen.owner = nginx  # nginx にする
listen.group = nginx  # nginx にする

Nginxの自動起動を設定します。

$ sudo systemctl enable nginx

Nginxを起動します。

Nginxの起動、停止、再起動、ステータスの確認コマンドは以下を使用します。

$ sudo systemctl start nginx
$ sudo systemctl stop nginx
$ sudo systemctl restart nginx
$ sudo systemctl status nginx

Nginx+PHPの動作確認を行う

動作確認用のPHPファイルを作成します。

$ sudo vi /var/www/html/phpinfo.php

<?php phpinfo(); ?>

ブラウザで開いて確認をします。

403 Forbidden と表示されたとき

ディレクトリのパーミッションが正しいか確認してください。

パーミッションを正しく設定するには以下を実行します。

$ sudo chmod 775 -R /var/www/html

SSL認証( Let’s Encrypt )のインストール&自動更新を設定する

証明書のインストール準備を行います。

$ sudo dnf install certbot python3-certbot-nginx

ドメインを指定して証明書をインストールします。

$ sudo certbot --nginx -d [ドメイン] --register-unsafely-without-email

証明書の自動更新の設定をします。

更新時にはWebサーバーを再読み込みします。

$ sudo systemctl enable --now certbot-renew.timer
$ sudo systemctl start certbot-renew.timer
$ sudo vi /etc/sysconfig/certbot

PRE_HOOK=""
POST_HOOK="-post-hook 'systemctl reload nginx.service'"

$ sudo systemctl daemon-reload

MariaDBをインストールする

MariaDB(MySQLでも可)をインストールします。

$ sudo dnf install mariadb-server

自動起動を設定します。

$ sudo systemctl enable mariadb

mariadb-secure-installation を使って MariaDB の初期設定を行います。

$ sudo mariadb-secure-installation

(中略…)
Enter current password for root (enter for none):(そのままENTER)
OK, successfully used password, moving on...

(中略…)
Switch to unix_socket authentication [Y/n] n
 ... skipping.

You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] y
New password: (rootパスワードを入力)
Re-enter new password: (rootパスワードを入力)
Password updated successfully!
Reloading privilege tables..
 ... Success!
 
(中略…)
Remove anonymous users? [Y/n] y
 ... Success!
 
(中略…)
Disallow root login remotely? [Y/n] y
 ... Success!

(中略…)
Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!
 
(中略…)
Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

MariaDB(MySQLでも可)を起動します。

$ sudo systemctl start mariadb
$ sudo systemctl stop php-fpm
$ sudo systemctl restart php-fpm
$ sudo systemctl status php-fpm

phpMyAdminをインストールする

phpMyAdminをインストールします。

$ sudo dnf --enablerepo=epel install phpMyAdmin

phpMyAdminが起動していることをブラウザで確認します。

http://(IPアドレス or 接続ドメイン)/phpMyAdmin/

FTPサーバーをインストールする

FTPでログインするユーザーを追加します。

$ sudo useradd -d /var/www/html -s /sbin/nologin ftp-user
$ sudo passwd ftp-user
Changing password for user ftp-user.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

ユーザーグループを追加します。

$ sudo usermod -G nginx nginx
$ sudo usermod -G nginx ftp-user

/sbin/nologin 指定によるユーザ作成をすると、

Redhat 7 以上だとFTP接続時に「530 Login incorrect.」で失敗してしまいます。

$ sudo vi /etc/shells

# 下記を追記
/sbin/nologin

セキュアFTPパッケージをインストールします。

$ sudo dnf install vsftpd

vsftpd の初期設定をします。

$ sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.org
$ sudo vi /etc/vsftpd/vsftpd.conf

# 匿名ユーザーのログイン不可
anonymous_enable=NO

# FTPでログインできるユーザーを制限
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list

# アクセスファイル(/etc/hosts.allow, /etc/hosts.deny)をアクセス制御に利用
tcp_wrappers=NO

# パッシブモードの接続を許可
pasv_enable=YES
pasv_min_port=60001
pasv_max_port=60010

# ファイル(またはディレクトリ)のタイムスタンプの表示をローカルタイムで表示
use_localtime=YES

# ドットから始まるファイルを含めた一覧を表示
force_dot_files=YES

# ログインディレクトリの指定
local_root=/var/www/

# ホームディレクトリより上層へのアクセスを禁止するかどうかを指定
chroot_local_user=YES
chroot_list_enable=NO

user_listにFTP接続を許可するユーザーのみを追加します。

$ sudo vi /etc/vsftpd/user_list

# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
# root
# bin
# daemon
# adm
# lp
# sync
# shutdown
# halt
# mail
# news
# uucp
# operator
# games
# nobody
ftp-user

vsftpdの自動起動を設定します。

$ sudo systemctl enable vsftpd

vsftpdを起動します。

vsftpdの起動、停止、再起動、ステータスの確認コマンドは以下を使用します。

$ sudo systemctl start vsftpd
$ sudo systemctl stop vsftpd
$ sudo systemctl restart vsftpd
$ sudo systemctl status vsftpd

サーバーのポートを開放する(AWS)