◆はじめに
前回の「メール転送設定編」に続いて、Rocky Linux 9 サーバ構築手順次のステップは、「LEMP(Linux、Nginx、MariaDB、PHP)構築編」について設定を行います。

◆環境情報
当ブログサイトを運用しているサーバは、「KAGOYA JAPAN」で提供されている「KAGOYA CLOUD VPS」を利用しています。
◆LEMPとは
LEMP(レンプ)は、Webアプリケーションを動作させるための代表的なソフトウェアスタックの一つです。
各文字は以下のソフトウェアの頭文字を表しています。
- Linux : オペレーティングシステム
- Engine-x(Nginx) : Webサーバー(”E”は発音に由来)
- MariaDB/MySQL : データベース管理システム
- PHP : サーバーサイドスクリプト言語
従来のLAMP(Apache)環境に対し、LEMPはNginxの高速性と軽量性を活かした構成として、高トラフィックなWebサイトやモダンなWebアプリケーションで広く採用されています。
本記事では、Rocky Linux 9上にLEMP環境を構築し、WordPress等のPHPアプリケーションを動作させる基盤を整備します。
◆LEMP環境構築
・Nginx
インストール
NginxはRocky Linux 9の標準リポジトリから入手可能です。
# dnf install -y nginx
'~ 中略 ~'
Installed:
nginx-1:1.20.1-16.el9_4.1.x86_64 nginx-core-1:1.20.1-16.el9_4.1.x86_64
nginx-filesystem-1:1.20.1-16.el9_4.1.noarch rocky-logos-httpd-90.15-2.el9.noarch
Complete!
オプション解説:
-y
: インストール時の確認プロンプトを自動的に承諾
各パッケージの役割:
- nginx : メインパッケージ
- nginx-core : Nginxのコア機能
- nginx-filesystem : Nginxのディレクトリ構造と基本設定
- rocky-logos-httpd : Rocky Linux用のデフォルトページ素材
設定
Nginxのメイン設定ファイルを編集し、サーバー名を設定します。
server_name ディレクティブを設定:
# vi /etc/nginx/nginx.conf
'~ 抜粋 ~'
server {
listen 80;
listen [::]:80;
server_name www.maruweb.jp.net;
# その他の設定...
}
設定項目の解説:
server_name
: このサーバーで受け付けるドメイン名を指定listen 80
: IPv4の80番ポート(HTTP)でリクエストを受け付けるlisten [::]:80
: IPv6の80番ポートでリクエストを受け付ける
起動と自動起動設定
# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
2行目:この出力は、systemdがNginxサービスをマルチユーザーターゲット(通常の起動状態)に登録したことを示している
オプション解説:
enable
:システム起動時にNginxを自動的に起動--now
:enableと同時に即座にサービスを起動
起動状態の確認
# systemctl is-active nginx
active
表示される状態:
activating
: 起動処理中(一時的な状態)active
: サービスが正常に起動し、動作中inactive
: サービスが停止しているfailed
: 起動に失敗した(設定エラー等)
より詳細な状態確認:
# systemctl status nginx
正常時の出力例:
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
Active: active (running) since Tue 2024-09-17 01:00:00 JST; 5min ago
Process: 1234 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
Main PID: 1235 (nginx)
Tasks: 5 (limit: 23449)
Memory: 8.5M
CPU: 45ms
CGroup: /system.slice/nginx.service
├─1235 "nginx: master process /usr/sbin/nginx"
└─1236 "nginx: worker process"
異常時の出力例(failed状態):
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
Active: failed (Result: exit-code) since Tue 2024-09-17 01:00:00 JST; 1min ago
Process: 1234 ExecStart=/usr/sbin/nginx (code=exited, status=1/FAILURE)
異常時は設定ファイルの構文チェックを実行:
# nginx -t
Firewall設定
外部からのHTTPアクセスを許可するため、Firewallの設定を行います。
# firewall-cmd --add-service=http
success
# firewall-cmd --runtime-to-permanent
success
コマンド解説:
--add-service=http
: HTTPサービス(80番ポート)を許可--runtime-to-permanent
: 実行時設定を恒久的な設定として保存
この2段階の設定により、即座に設定が反映され、かつシステム再起動後も設定が保持されます。
設定の確認方法:
現在有効なサービスの確認:
# firewall-cmd --list-services
cockpit dhcpv6-client http ssh
http
が含まれていることを確認してください。
特定ポートの開放状況を確認:
# firewall-cmd --list-ports
より詳細な情報を確認:
# firewall-cmd --list-all
出力例:
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: cockpit dhcpv6-client http ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
HTTPS(443番ポート)も必要な場合:
# firewall-cmd --add-service=https
# firewall-cmd --runtime-to-permanent
動作確認
Webブラウザから http://サーバーのIPアドレス
または http://www.maruweb.jp.net
にアクセスし、Nginxのデフォルトページが表示されることを確認します。

確認ポイント
・MariaDB
MariaDBは、MySQLから派生したオープンソースのリレーショナルデータベース管理システムです。本手順では、公式リポジトリから最新版をインストールします。
リポジトリファイルの作成
MariaDB公式が提供するセットアップスクリプトを使用して、リポジトリを追加します。
# curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | bash
# [info] Checking for script prerequisites.
# [info] MariaDB Server version 11.rolling is valid
# [info] Repository file successfully written to /etc/yum.repos.d/mariadb.repo
# [info] Adding trusted package signing keys...
# [info] Successfully added trusted package signing keys
# [info] Cleaning package cache...
43 files removed
オプション解説:
-sS
:-s
(サイレントモード)と-S
(エラー時のみ出力)の組み合わせ
このスクリプトにより、以下の処理が自動的に実行されます。
- システムの前提条件チェック
- リポジトリ設定ファイルの作成
- GPG署名鍵のインポート
- パッケージキャッシュのクリア
リポジトリ設定ファイルの確認
# cat /etc/yum.repos.d/mariadb.repo
[mariadb-main]
name = MariaDB Server
baseurl = https://dlm.mariadb.com/repo/mariadb-server/11.rolling/yum/rhel/9/x86_64
gpgkey = file:///etc/pki/rpm-gpg/MariaDB-Server-GPG-KEY
gpgcheck = 1
enabled = 1
module_hotfixes = 1
[mariadb-maxscale]
name = MariaDB MaxScale
baseurl = https://dlm.mariadb.com/repo/maxscale/latest/yum/rhel/9/x86_64
gpgkey = file:///etc/pki/rpm-gpg/MariaDB-MaxScale-GPG-KEY
gpgcheck = 1
enabled = 1
[mariadb-tools]
name = MariaDB Tools
baseurl = https://downloads.mariadb.com/Tools/rhel/9/x86_64
gpgkey = file:///etc/pki/rpm-gpg/MariaDB-Enterprise-GPG-KEY
gpgcheck = 1
enabled = 1
設定項目の解説:
baseurl
: パッケージの取得元URLgpgcheck = 1
: パッケージの署名検証を有効化(セキュリティ上重要)enabled = 1
: このリポジトリを有効化module_hotfixes = 1
: モジュールの競合を回避
GPGキーのインポート
パッケージの真正性を検証するため、MariaDBの公開鍵をインポートします。
# rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
注意事項
この手順は、セットアップスクリプトで既に実行されている場合もありますが、明示的に実行することで確実に鍵がインポートされます。
GPGキーのインポート確認:
インポートされたGPGキーの一覧を表示:
# rpm -q gpg-pubkey --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{SUMMARY}\n'
出力例:
gpg-pubkey-f1656f24-62bbfcf5 gpg(MariaDB Signing Key <signing-key@mariadb.org>)
gpg-pubkey-fd431d51-4ae0493b gpg(Red Hat, Inc. (release key 2) <security@redhat.com>)
MariaDBのキーが含まれていることを確認します。
特定のキーの詳細情報を表示:
# rpm -qi gpg-pubkey-f1656f24-62bbfcf5
パッケージ署名の検証方法:
MariaDBパッケージをダウンロード後、署名を検証:
# rpm --checksig /var/cache/dnf/mariadb-main-*/packages/MariaDB-server-*.rpm
正常な場合の出力:
/var/cache/dnf/.../MariaDB-server-11.5.2-1.el9.x86_64.rpm: digests signatures OK
異常な場合の出力:
/var/cache/dnf/.../MariaDB-server-11.5.2-1.el9.x86_64.rpm: RSA sha1 ((MD5) PGP) md5 NOT OK (MISSING KEYS: RSA#f1656f24)
既にインストール済みパッケージの署名確認:
# rpm -K MariaDB-server
または、すべてのMariaDB関連パッケージの署名を確認:
# rpm -qa | grep -i mariadb | xargs rpm --checksig
セキュリティのポイント: GPG署名検証により、パッケージが公式の開発元から提供されたものであり、改ざんされていないことを確認できます。
モジュールの確認
Rocky Linux 9の標準リポジトリに含まれるMariaDBモジュールを確認します。
# dnf module info mariadb
Last metadata expiration check: 0:02:08 ago on Tue Sep 17 00:55:07 2024.
Name : mariadb
Stream : 10.11
Version : 9040020240502080049
Context : a68bdff7
Architecture : x86_64
Profiles : client, galera, server [d]
Default profiles : server
Repo : appstream
Summary : MariaDB Module
Description : MariaDB is a community developed branch of MySQL. MariaDB is a multi-user, multi-threaded SQL database server. It is a client/server implementation consisting of a server daemon (mysqld) and many different client programs and libraries. The base package contains the standard MariaDB/MySQL client programs and generic MySQL files.
Requires :
Artifacts : galera-0:26.4.16-1.module+el9.4.0+20012+a68bdff7.src
: galera-0:26.4.16-1.module+el9.4.0+20012+a68bdff7.x86_64
: galera-debuginfo-0:26.4.16-1.module+el9.4.0+20012+a68bdff7.x86_64
: galera-debugsource-0:26.4.16-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.src
: mariadb-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-backup-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-backup-debuginfo-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-common-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-debuginfo-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-debugsource-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-devel-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-embedded-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-embedded-debuginfo-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-embedded-devel-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-errmsg-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-gssapi-server-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-gssapi-server-debuginfo-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-oqgraph-engine-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-oqgraph-engine-debuginfo-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-pam-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-pam-debuginfo-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-server-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-server-debuginfo-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-server-galera-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-server-utils-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-server-utils-debuginfo-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-test-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
: mariadb-test-debuginfo-3:10.11.6-1.module+el9.4.0+20012+a68bdff7.x86_64
Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled, [a]ctive
標準リポジトリではMariaDB 10.11(構築当時)が提供されていることが確認できます。
モジュールの無効化
公式リポジトリから最新版(11.5系)をインストールするため、標準リポジトリのMariaDBモジュールを無効化します。
# dnf module disable -y mariadb
Last metadata expiration check: 0:05:01 ago on Tue Sep 17 00:55:07 2024.
Dependencies resolved.
====================================================================================================
Package Architecture Version Repository Size
====================================================================================================
Disabling modules:
mariadb
Transaction Summary
====================================================================================================
Complete!
重要
この手順を省略すると、標準リポジトリのバージョンがインストールされる可能性があります。
インストール
# dnf install -y MariaDB-server
'~ 中略 ~'
Installed:
MariaDB-client-11.5.2-1.el9.x86_64 MariaDB-client-compat-11.5.2-1.el9.noarch
MariaDB-common-11.5.2-1.el9.x86_64 MariaDB-server-11.5.2-1.el9.x86_64
MariaDB-server-compat-11.5.2-1.el9.noarch MariaDB-shared-11.5.2-1.el9.x86_64
boost-program-options-1.75.0-8.el9.x86_64 galera-4-26.4.19-1.el9.x86_64
liburing-2.5-1.el9.x86_64 perl-DBI-1.643-9.el9.x86_64
perl-Math-BigInt-1:1.9998.18-460.el9.noarch perl-Math-Complex-1.59-481.el9.noarch
perl-Sys-Hostname-1.23-481.el9.x86_64 pv-1.6.20-1.el9.x86_64
rsync-3.2.3-19.el9.x86_64 socat-1.7.4.1-5.el9_4.2.x86_64
Complete!
各パッケージの役割:
- MariaDB-server : データベースサーバー本体
- MariaDB-client : コマンドラインクライアント
- MariaDB-common : 共通ライブラリ
- MariaDB-shared : 共有ライブラリ
- galera-4 : Galeraクラスタリング用ライブラリ
- perl-DBI : Perlデータベースインターフェース
設定ファイルの確認
メイン設定ファイルの内容を確認します。
# cat /etc/my.cnf
#
# This group is read both by the client and the server
# use it for options that affect everything
#
[client-server]
#
# include *.cnf from the config directory
#
!includedir /etc/my.cnf.d
!includedir
ディレクティブにより、/etc/my.cnf.d/
ディレクトリ内の.cnf
ファイルがすべて読み込まれます。
設定ファイルの編集
サーバ用設定ファイル(server.cnf)
[mysqld]
セクションに以下を追加:
# vi /etc/my.cnf.d/server.cnf
'~ 抜粋 ~'
[mysqld]
log-error=/var/log/mariadb/mariadb.log
character-set-server=utf8mb4
設定項目の解説:
log-error
: エラーログの出力先を指定character-set-server=utf8mb4
: サーバーのデフォルト文字セットをUTF-8(4バイト対応)に設定。絵文字等を含む多言語対応に必須
クライアント用設定ファイル(client.cnf)
[client]
セクションに以下を追加:
# vi /etc/my.cnf.d/client.cnf
'~ 抜粋 ~'
[client]
default-character-set=utf8mb4
設定項目の解説:
default-character-set=utf8mb4
:クライアント接続時のデフォルト文字セットを設定
注意事項
サーバーとクライアントの両方で文字セットを統一することで、文字化けを防ぎます。
ログファイル出力先の作成
エラーログ用のディレクトリを作成し、適切な権限を設定します。
# mkdir -p /var/log/mariadb
# chown mysql:mysql /var/log/mariadb
# ll -d /var/log/mariadb
drwxr-xr-x 2 mysql mysql 4096 Sep 17 00:59 /var/log/mariadb
コマンド解説:
mkdir -p
: 親ディレクトリも含めて作成(既に存在する場合はエラーにならない)chown mysql:mysql
: 所有者とグループをmysqlユーザーに変更ll -d
: ディレクトリ自体の詳細情報を表示
起動と自動起動設定
# systemctl enable --now mariadb
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service.
# systemctl is-active mariadb
active
初期設定(セキュリティ強化)
MariaDBの初期セキュリティ設定を行います。
# mariadb-secure-installation
対話形式で以下の設定を行います:
1. 現在のrootパスワード入力
Enter current password for root (enter for none):
初回インストール時は空Enter
2. unix_socket認証への切り替え
Switch to unix_socket authentication [Y/n] n
通常のパスワード認証を使用する場合はn
3. rootパスワードの設定
Change the root password? [Y/n] Y
New password: (パスワード入力)
Re-enter new password: (パスワード再入力)
パスワード要件
4. 匿名ユーザーの削除
Remove anonymous users? [Y/n] Y
セキュリティ上、削除を推奨
5. rootでのリモートログインの禁止
Disallow root login remotely? [Y/n] Y
セキュリティ上、禁止を推奨
6. testデータベースの削除
Remove test database and access to it? [Y/n] Y
本番環境では不要なため削除
7. 特権情報のリロード
Reload privilege tables now? [Y/n] Y
変更を即座に反映
接続確認
MariaDBに接続してみます。
# mysql -u root -p
mysql: Deprecated program name. It will be removed in a future release, use '/usr/bin/mariadb' instead
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 11
Server version: 11.5.2-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
コマンド解説:
-u root
:rootユーザーで接続-p
:パスワード入力を要求
注意メッセージ
mysql: Deprecated program name. It will be removed in a future release, use ‘/usr/bin/mariadb’ instead
データベース一覧の確認
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.008 sec)
各データベースの役割:
- information_schema : メタデータ情報
- mysql : ユーザー権限等のシステム情報
- performance_schema : パフォーマンス監視情報
- sys : パフォーマンス分析用のビュー
接続確認後はexit
またはquit
で終了します。
・PHP 8.3
Rocky Linux 9の標準リポジトリではPHP 8.1/8.2が提供されていますが、最新のPHP 8.3を使用するため、Remiリポジトリを利用します。
Remiリポジトリのインストール
# dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm
'~ 中略 ~'
Installed:
remi-release-9.4-2.el9.remi.noarch
Complete!
Remiリポジトリは、Red Hat系ディストリビューション向けに最新のPHPバージョンを提供する信頼性の高いサードパーティリポジトリです。
モジュールの確認
利用可能なPHPモジュールとバージョンを確認します。
# dnf module list php
Last metadata expiration check: 0:04:20 ago on Thu Sep 19 10:47:48 2024.
Rocky Linux 9 - AppStream
Name Stream Profiles Summary
php 8.1 common [d], devel, minimal PHP scripting language
php 8.2 common [d], devel, minimal PHP scripting language
Remi's Modular repository for Enterprise Linux 9 - x86_64
Name Stream Profiles Summary
php remi-7.4 common [d], devel, minimal PHP scripting language
php remi-8.0 common [d], devel, minimal PHP scripting language
php remi-8.1 common [d], devel, minimal PHP scripting language
php remi-8.2 common [d], devel, minimal PHP scripting language
php remi-8.3 common [d], devel, minimal PHP scripting language
Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
Remiリポジトリから複数のPHPバージョンが選択可能であることが確認できます。
モジュールの有効化
PHP 8.3モジュールを有効化します。
# dnf module enable php:remi-8.3
Last metadata expiration check: 0:05:46 ago on Thu Sep 19 10:47:48 2024.
Dependencies resolved.
====================================================================================================
Package Architecture Version Repository Size
====================================================================================================
Enabling module streams:
php remi-8.3
Transaction Summary
====================================================================================================
Is this ok [y/N]: y
Complete!
重要
モジュールを有効化すると、そのストリームのパッケージが優先的にインストールされます。
基本パッケージのインストール
# dnf module install -y php
'~ 中略 ~'
Installed:
httpd-filesystem-2.4.57-11.el9_4.1.noarch oniguruma5php-6.9.9-1.el9.remi.x86_64
php-cli-8.3.11-1.el9.remi.x86_64 php-common-8.3.11-1.el9.remi.x86_64
php-fpm-8.3.11-1.el9.remi.x86_64 php-mbstring-8.3.11-1.el9.remi.x86_64
php-xml-8.3.11-1.el9.remi.x86_64
Complete!
各パッケージの役割:
- php-cli : コマンドラインからのPHPスクリプト実行
- php-common : PHPの共通ライブラリ
- php-fpm : FastCGI Process Manager(NginxとPHPの橋渡し)
- php-mbstring : マルチバイト文字列処理(日本語等の処理に必須)
- php-xml : XML処理ライブラリ
- oniguruma5php : 正規表現処理ライブラリ
- httpd-filesystem : Webサーバー関連のディレクトリ構造
追加パッケージのインストール
データベース接続、画像処理、その他の機能に必要なパッケージをインストールします。
# dnf install -y php-{devel,mysqlnd,gd,curl,json}
'~ 中略 ~'
Installed:
cmake-filesystem-3.26.5-2.el9.x86_64 gd3php-2.3.3-9.el9.remi.x86_64 highway-1.2.0-2.el9.x86_64
jxl-pixbuf-loader-0.7.0-1.el9.x86_64 keyutils-libs-devel-1.6.3-1.el9.x86_64 krb5-devel-1.21.1-2.el9_4.x86_64
libaom-3.9.0-1.el9.x86_64 libavif-0.11.1-4.el9.x86_64 libcom_err-devel-1.46.5-5.el9.x86_64
libdav1d-1.2.1-1.el9.x86_64 libimagequant-2.17.0-1.el9.x86_64 libjxl-0.7.0-1.el9.x86_64
libkadm5-1.21.1-2.el9_4.x86_64 libraqm-0.8.0-1.el9.x86_64 libselinux-devel-3.6-1.el9.x86_64
libsepol-devel-3.6-1.el9.x86_64 libverto-devel-0.3.2-3.el9.x86_64 libvmaf-2.3.0-2.el9.x86_64
libxml2-devel-2.9.13-6.el9_4.x86_64 pcre2-devel-10.40-5.el9.x86_64 pcre2-utf16-10.40-5.el9.x86_64
pcre2-utf32-10.40-5.el9.x86_64 php-devel-8.3.12-1.el9.remi.x86_64 php-fedora-autoloader-1.0.1-7.el9.noarch
php-gd-8.3.12-1.el9.remi.x86_64 php-mysqlnd-8.3.12-1.el9.remi.x86_64 php-nikic-php-parser5-5.2.0-1.el9.noarch
php-pdo-8.3.12-1.el9.remi.x86_64 rav1e-libs-0.7.1-2.el9.x86_64 svt-av1-libs-0.9.0-1.el9.x86_64
Complete!
ブレース展開の解説: このコマンドは以下と同等です:
# dnf install -y php-devel php-mysqlnd php-gd php-curl php-json
各パッケージの役割:
- php-devel : PHPの開発に必要なヘッダーファイルとツール
- php-mysqlnd : MySQL/MariaDB接続用のネイティブドライバー(高速)
- php-gd : GDライブラリによる画像処理(JPEG、PNG、GIF等)
- php-curl : cURLライブラリによるHTTPリクエスト処理
- php-json : JSON形式データの処理(多くのAPIで使用)
- php-pdo : データベース抽象化レイヤー(複数DBへの統一インターフェース)
設定ファイルの編集
PHPメイン設定ファイル(php.ini)
# vi /etc/php.ini
'~ 抜粋 ~'
post_max_size = 96M
upload_max_filesize = 64M
設定項目の解説:
post_max_size = 96M
: POSTデータの最大サイズ(フォーム送信やファイルアップロード)upload_max_filesize = 64M
: 1つのファイルの最大アップロードサイズ
設定の考え方
post_max_size
はupload_max_filesize
より大きく設定する必要があります。これは、ファイル以外のフォームデータもPOSTに含まれるためです。
WordPress等の要件
PHP-FPM設定ファイル(www.conf)
PHP-FPMの設定ファイルを確認・編集します。
# vi /etc/php-fpm.d/www.conf
'~ 抜粋 ~'
user = nginx
group = nginx
listen = /run/php-fpm/www.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
php_admin_flag[expose_php] = off
重要な設定項目:
- user, group : PHP-FPMをnginxユーザー権限で実行(セキュリティとファイルアクセス権の整合性)
- listen : NginxとPHP-FPM間の通信にUnixソケットを使用(TCPより高速)
- listen.owner, listen.group, listen.mode : ソケットファイルの所有者とパーミッション設定
- php admin flag[expose php] : PHPバージョン情報の非表示(セキュリティ対策)
セキュリティ上の注意
expose_php = off
により、HTTPレスポンスヘッダーからX-Powered-By: PHP/8.3.11
のような情報が削除され、攻撃者による情報収集を困難にします。
起動と自動起動設定
# systemctl start php-fpm
# systemctl enable php-fpm
Created symlink /etc/systemd/system/multi-user.target.wants/php-fpm.service → /usr/lib/systemd/system/php-fpm.service.
Nginx設定の追加
NginxでPHPを処理できるように設定を追加します。
serverブロック内に以下を追加:
# vi /etc/nginx/nginx.conf
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
index index.php index.html index.htm;
設定項目の解説:
location ~ \.php$
:.php
で終わるリクエストにマッチfastcgi_pass
: PHP-FPMへの接続先(Unixソケット)SCRIPT_FILENAME
: 実行するPHPファイルのフルパスinclude fastcgi_params
: FastCGI標準パラメータの読み込み
設定反映のためNginxを再起動:
# systemctl restart nginx
動作確認
PHPの動作確認用ファイルを作成します。
# echo '<?php phpinfo(); ?>' > /var/www/html/phpinfo.php
Webブラウザから http://サーバーのIPアドレス/phpinfo.php
にアクセスし、PHP情報ページが表示されることを確認します。

確認ポイント
セキュリティ対策
確認後は必ずphpinfo.phpを削除してください
理由: phpinfo.phpには、サーバーの詳細な構成情報が含まれており、公開されると攻撃者に有益な情報を提供してしまいます。
# rm -f /var/www/html/phpinfo.php
・トラブルシューティング
Nginxが起動しない
原因: 設定ファイルの構文エラー
対処法:
# nginx -t
設定ファイルの構文チェックを実行し、エラー箇所を特定
PHP-FPMの接続エラー
原因: ソケットファイルのパーミッション不一致
対処法:
# ls -l /run/php-fpm/www.sock
# systemctl restart php-fpm
データベース接続エラー
原因: 文字セット設定の不一致
対処法:
# mysql -u root -p -e "SHOW VARIABLES LIKE 'character%';"
文字セット設定を確認し、必要に応じてmy.cnf
を修正
ファイルアップロードができない
原因: PHPのアップロードサイズ制限
対処法:
# vi /etc/php.ini
以下の値を確認・調整:
upload_max_filesize
post_max_size
memory_limit
変更後はPHP-FPMを再起動:
# systemctl restart php-fpm
502 Bad Gateway エラー
原因: PHP-FPMが停止している、またはソケット接続の問題
対処法:
まずPHP-FPMの状態を確認:
# systemctl status php-fpm
エラーログを確認:
# tail -f /var/log/php-fpm/error.log
ソケットファイルのパーミッションを確認:
# ls -l /run/php-fpm/www.sock
正常な場合の出力例:
srw-rw---- 1 nginx nginx 0 Sep 17 01:00 /run/php-fpm/www.sock
パーミッションの見方:
srw-rw----
:ソケットファイル(先頭のs
)、所有者とグループに読み書き権限1 nginx nginx
:所有者とグループがともにnginx
- ソケットのパーミッションは
0660
(所有者とグループのみアクセス可)
異常な場合の例と対処:
- ソケットファイルが存在しない場合:
ls: cannot access '/run/php-fpm/www.sock': No such file or directory
→ PHP-FPMが起動していない可能性があります。
# systemctl start php-fpm
- パーミッションが不適切な場合:
srw-rw---- 1 apache apache 0 Sep 17 01:00 /run/php-fpm/www.sock
→ 所有者がapache
になっている場合、/etc/php-fpm.d/www.conf
の設定を確認:
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
設定後、PHP-FPMを再起動:
# systemctl restart php-fpm
- Nginxのユーザー設定が一致しない場合:
/etc/nginx/nginx.conf
のuser
ディレクティブを確認:
user nginx;
ログを確認してエラーの原因を特定し、PHP-FPMを再起動:
# systemctl restart php-fpm
・セキュリティ強化のための追加設定
PHPセキュリティ設定
/etc/php.ini
で以下の設定を確認・調整することを推奨します:
; 危険な関数の無効化
disable_functions = exec,passthru,shell_exec,system,proc_open,popen
; エラー表示の制御(本番環境)
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php-fpm/error.log
; セッションのセキュリティ
session.cookie_httponly = 1
session.cookie_secure = 1
session.use_strict_mode = 1
MariaDBユーザーの作成
WordPress等のアプリケーション用に、専用のデータベースとユーザーを作成します。
# mysql -u root -p
-- データベースの作成
CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- ユーザーの作成と権限付与
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY '強力なパスワード';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
-- 確認
SHOW GRANTS FOR 'wpuser'@'localhost';
EXIT;
セキュリティのポイント
ファイルパーミッションの設定
Webコンテンツディレクトリの適切な権限設定:
# chown -R nginx:nginx /var/www/html
# find /var/www/html -type d -exec chmod 755 {} \;
# find /var/www/html -type f -exec chmod 644 {} \;
コマンド解説:
chown -R nginx:nginx
: 所有者をnginxユーザーに変更(再帰的)find ... -type d -exec chmod 755
: ディレクトリを755に設定find ... -type f -exec chmod 644
: ファイルを644に設定
パーミッションの意味:
- 755(ディレクトリ) : 所有者は読み書き実行可、その他は読み実行可
- 644(ファイル) : 所有者は読み書き可、その他は読み取り可
・パフォーマンス最適化
PHP-FPMプロセス管理
高トラフィックサイトの場合、/etc/php-fpm.d/www.conf
でプロセス管理を調整:
; プロセス管理方式
pm = dynamic
; 常駐するプロセス数
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.max_children = 50
設定の考え方:
- サーバーのメモリ容量に応じて調整
- 1プロセスあたり約30-50MBのメモリを消費
max_children = 利用可能メモリ / プロセスあたりのメモリ
MariaDBのパフォーマンス設定
/etc/my.cnf.d/server.cnf
の[mysqld]
セクションに追加:
# InnoDB設定
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
# クエリキャッシュ(MariaDB 10.x系)
query_cache_type = 1
query_cache_size = 64M
# 接続設定
max_connections = 200
注意
設定変更後は必ずMariaDBを再起動してください
Nginxキャッシュの設定
静的ファイルのキャッシュ設定を/etc/nginx/nginx.conf
に追加:
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
access_log off;
}
設定の効果:
- ブラウザキャッシュにより、リピーターの読み込み時間を短縮
- サーバー負荷の軽減
- 帯域幅の節約
・ログ管理
ログローテーション設定
PHP-FPMログのローテーション設定例:
# vi /etc/logrotate.d/php-fpm
/var/log/php-fpm/*log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/bin/kill -SIGUSR1 `cat /run/php-fpm/php-fpm.pid 2>/dev/null` 2>/dev/null || true
endscript
}
各設定項目の詳細説明:
daily
: ログを毎日ローテーション- 他のオプション :
weekly
(毎週)、monthly
(毎月)、yearly
(毎年)
- 他のオプション :
rotate 7
: 過去7世代分のログを保持- ローテーション後、8世代目以降は自動削除される
- 例 :
daily
と組み合わせた場合、過去7日分のログが保持される
missingok
: ログファイルが存在しない場合でもエラーを出さない- サービス未起動時や初回実行時にエラーを防ぐ
notifempty
: ログファイルが空の場合はローテーションしない- ディスク容量の無駄な使用を防ぐ
- 空のログファイルが大量に生成されることを回避
compress
: ローテーション後のログファイルをgzip圧縮- ディスク容量を節約(通常90%以上の圧縮率)
- 圧縮後のファイル名例 :
error.log.1.gz
delaycompress
: 直前のログファイルは圧縮しない- 最新の1世代前(
.log.1
)は無圧縮のまま保持 - アプリケーションが古いログファイルに書き込む可能性がある場合に有効
- 例 :
error.log
(現在)、error.log.1
(無圧縮)、error.log.2.gz
(圧縮済み)
- 最新の1世代前(
sharedscripts
: 複数のログファイルに対して、postrotateスクリプトを1回だけ実行/var/log/php-fpm/error.log
と/var/log/php-fpm/www-error.log
の両方をローテーションする場合でも、PHP-FPMへのシグナル送信は1回のみ- パフォーマンスの向上とログの整合性を保つ
postrotate ... endscript
: ローテーション後に実行するコマンドcat /run/php-fpm/php-fpm.pid
: PHP-FPMのプロセスIDを取得/bin/kill -SIGUSR1
: PHP-FPMにSIGUSR1シグナルを送信してログファイルを再オープン2>/dev/null
: エラー出力を破棄(プロセスが存在しない場合のエラーを抑制)|| true
: コマンドが失敗してもlogrotateを停止させない
ログローテーションの動作イメージ:
ローテーション実行前:
error.log # 現在のログ(100MB)
error.log.1.gz # 1日前(10MB、圧縮済み)
error.log.2.gz # 2日前(10MB、圧縮済み)
...
error.log.7.gz # 7日前(10MB、圧縮済み)
ローテーション実行後:
error.log # 新規ログ(0MB)
error.log.1 # 今日(100MB、無圧縮)← delaycompressにより無圧縮
error.log.2.gz # 1日前(10MB、圧縮済み)
error.log.3.gz # 2日前(10MB、圧縮済み)
...
error.log.7.gz # 6日前(10MB、圧縮済み)
# 8日前のログは削除される
ログローテーションの手動実行(テスト):
# logrotate -f /etc/logrotate.d/php-fpm
オプション解説:
-f
: 強制的にローテーションを実行(日時条件を無視)-d
: デバッグモード(実際にはローテーションせず、動作確認のみ)
デバッグ実行例:
# logrotate -d /etc/logrotate.d/php-fpm
ログローテーションの自動実行: logrotateは通常、cronによって毎日自動実行されます:
# cat /etc/cron.daily/logrotate
ログの確認方法
Nginxアクセスログ:
# tail -f /var/log/nginx/access.log
Nginxエラーログ:
# tail -f /var/log/nginx/error.log
PHP-FPMエラーログ:
# tail -f /var/log/php-fpm/error.log
MariaDBエラーログ:
# tail -f /var/log/mariadb/mariadb.log
◆まとめ
本記事では、Rocky Linux 9上にLEMP環境(Nginx、MariaDB、PHP8.3)を構築する手順を解説しました。
構築した環境:
- Nginx 1.20.1 : 高速で軽量なWebサーバー
- MariaDB 11.5.2 : 高性能なデータベースサーバー
- PHP 8.3 : 最新の言語機能とパフォーマンス向上
重要なポイント:
- 各コンポーネントを公式リポジトリから最新版でインストール
- 文字セットをUTF-8(utf8mb4)に統一
- セキュリティ設定を適切に実施
- ファイルパーミッションとユーザー権限の適切な管理
- ログファイルの場所と確認方法の把握
参考リンク:
◆次のステップ
この環境を基盤として、WordPressなどのPHPアプリケーションを導入できます。
次回の記事では、WordPressの移設手順を解説予定です。
コメント