LEMP(Linux、Nginx、MariaDB、PHP)環境構築

スポンサーリンク
RockyLinux
この記事は約48分で読めます。
ランキングに参加しています。応援よろしくお願いします。
ブログランキング・にほんブログ村へ 人気ブログランキングへ FC2ブログランキングへ
スポンサーリンク
この記事が気に入ったら
フォローしよう
最新情報をお届けします。
  1. ◆はじめに
  2. ◆環境情報
  3. ◆LEMPとは
  4. ◆LEMP環境構築
    1. ・Nginx
      1. インストール
      2. 設定
      3. 起動と自動起動設定
      4. 起動状態の確認
      5. Firewall設定
      6. 動作確認
    2. ・MariaDB
      1. リポジトリファイルの作成
      2. リポジトリ設定ファイルの確認
      3. GPGキーのインポート
      4. モジュールの確認
      5. モジュールの無効化
      6. インストール
      7. 設定ファイルの確認
      8. 設定ファイルの編集
        1. サーバ用設定ファイル(server.cnf)
        2. クライアント用設定ファイル(client.cnf)
      9. ログファイル出力先の作成
      10. 起動と自動起動設定
      11. 初期設定(セキュリティ強化)
      12. 接続確認
        1. データベース一覧の確認
    3. ・PHP 8.3
      1. Remiリポジトリのインストール
      2. モジュールの確認
      3. モジュールの有効化
      4. 基本パッケージのインストール
      5. 追加パッケージのインストール
      6. 設定ファイルの編集
        1. PHPメイン設定ファイル(php.ini)
        2. PHP-FPM設定ファイル(www.conf)
      7. 起動と自動起動設定
      8. Nginx設定の追加
      9. 動作確認
    4. ・トラブルシューティング
      1. Nginxが起動しない
      2. PHP-FPMの接続エラー
      3. データベース接続エラー
      4. ファイルアップロードができない
      5. 502 Bad Gateway エラー
    5. ・セキュリティ強化のための追加設定
      1. PHPセキュリティ設定
      2. MariaDBユーザーの作成
      3. ファイルパーミッションの設定
    6. ・パフォーマンス最適化
      1. PHP-FPMプロセス管理
      2. MariaDBのパフォーマンス設定
      3. Nginxキャッシュの設定
    7. ・ログ管理
      1. ログローテーション設定
      2. ログの確認方法
  5. ◆まとめ
  6. ◆次のステップ
    1. 関連

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

当ブログサイトを運用しているサーバは、「KAGOYA JAPAN」で提供されている「KAGOYA CLOUD VPS」を利用しています。

LEMP(レンプ)は、Webアプリケーションを動作させるための代表的なソフトウェアスタックの一つです。
各文字は以下のソフトウェアの頭文字を表しています。

  • Linux : オペレーティングシステム
  • Engine-x(Nginx) : Webサーバー(”E”は発音に由来)
  • MariaDB/MySQL : データベース管理システム
  • PHP : サーバーサイドスクリプト言語

従来のLAMP(Apache)環境に対し、LEMPはNginxの高速性と軽量性を活かした構成として、高トラフィックなWebサイトやモダンなWebアプリケーションで広く採用されています。

本記事では、Rocky Linux 9上にLEMP環境を構築し、WordPress等のPHPアプリケーションを動作させる基盤を整備します。

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

外部からの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のデフォルトページが表示されることを確認します。

確認ポイント

  • Rocky Linuxのウェルカムページが表示される
  • ページのタイトルに「Test Page」等が含まれる
  • レスポンスが返ってくる(タイムアウトしない)

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(エラー時のみ出力)の組み合わせ

このスクリプトにより、以下の処理が自動的に実行されます。

  1. システムの前提条件チェック
  2. リポジトリ設定ファイルの作成
  3. GPG署名鍵のインポート
  4. パッケージキャッシュのクリア
# 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 : パッケージの取得元URL
  • gpgcheck = 1 : パッケージの署名検証を有効化(セキュリティ上重要)
  • enabled = 1 : このリポジトリを有効化
  • module_hotfixes = 1 : モジュールの競合を回避

パッケージの真正性を検証するため、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ファイルがすべて読み込まれます。

[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]セクションに以下を追加:

# 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: (パスワード再入力)

パスワード要件

  • 8文字以上推奨
  • 英大文字、小文字、数字、記号を組み合わせる
  • 推測されにくい文字列を使用

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

  • 将来的にはmysqlコマンドは廃止され、mariadbコマンドに統一される予定です。
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で終了します。

Rocky Linux 9の標準リポジトリではPHP 8.1/8.2が提供されていますが、最新のPHP 8.3を使用するため、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への統一インターフェース)
# vi /etc/php.ini

'~ 抜粋 ~'

post_max_size = 96M
upload_max_filesize = 64M

設定項目の解説:

  • post_max_size = 96M : POSTデータの最大サイズ(フォーム送信やファイルアップロード)
  • upload_max_filesize = 64M : 1つのファイルの最大アップロードサイズ

設定の考え方

post_max_sizeupload_max_filesizeより大きく設定する必要があります。これは、ファイル以外のフォームデータもPOSTに含まれるためです。

WordPress等の要件

  • WordPressのテーマ/プラグインアップロード:32MB以上推奨
  • メディアファイルアップロード:用途に応じて調整

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で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情報ページが表示されることを確認します。

確認ポイント

  • PHP Version: 8.3.x と表示される
  • Server API: FPM/FastCGI と表示される
  • Loaded Configuration File: /etc/php.ini
  • PDO、mysqli、GD、mbstring等の拡張が有効

セキュリティ対策

確認後は必ずphpinfo.phpを削除してください

理由: phpinfo.phpには、サーバーの詳細な構成情報が含まれており、公開されると攻撃者に有益な情報を提供してしまいます。

# rm -f /var/www/html/phpinfo.php

原因: 設定ファイルの構文エラー

対処法:

# nginx -t

設定ファイルの構文チェックを実行し、エラー箇所を特定

原因: ソケットファイルのパーミッション不一致

対処法:

# 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

原因: 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(所有者とグループのみアクセス可)

異常な場合の例と対処:

  1. ソケットファイルが存在しない場合:
ls: cannot access '/run/php-fpm/www.sock': No such file or directory

→ PHP-FPMが起動していない可能性があります。

# systemctl start php-fpm
  1. パーミッションが不適切な場合:
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
  1. Nginxのユーザー設定が一致しない場合: /etc/nginx/nginx.confuserディレクティブを確認:
user nginx;

ログを確認してエラーの原因を特定し、PHP-FPMを再起動:

# systemctl restart php-fpm

/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

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;

セキュリティのポイント

  • アプリケーションごとに専用のユーザーを作成
  • 必要最小限の権限のみを付与
  • localhost接続に限定(リモート接続を防ぐ)
  • 強力なパスワードを使用

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(ファイル) : 所有者は読み書き可、その他は読み取り可

高トラフィックサイトの場合、/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 = 利用可能メモリ / プロセスあたりのメモリ

/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を再起動してください

静的ファイルのキャッシュ設定を/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(圧縮済み)
  • 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 : 最新の言語機能とパフォーマンス向上

重要なポイント:

  1. 各コンポーネントを公式リポジトリから最新版でインストール
  2. 文字セットをUTF-8(utf8mb4)に統一
  3. セキュリティ設定を適切に実施
  4. ファイルパーミッションとユーザー権限の適切な管理
  5. ログファイルの場所と確認方法の把握

参考リンク:

この環境を基盤として、WordPressなどのPHPアプリケーションを導入できます。
次回の記事では、WordPressの移設手順を解説予定です。

コメント

タイトルとURLをコピーしました