PHPとNGINXを用いたWebサーバ環境の連携設定について解説
PHPとNGINXを組み合わせることで、Webアプリケーションの処理速度や安定性が向上します。
この記事では、すでに開発環境が整っている前提で、PHPとNGINXの連携に必要な基本設定と注意点を簡潔に紹介します。
適切な構成で快適な開発環境を実現するヒントとしてご活用ください。
PHPとNGINXの基礎知識
PHPとWebサーバ連携の概要
PHPは動的なWebアプリケーションを構築するために広く利用されており、NGINXなどのWebサーバと組み合わせることで高速なレスポンスを実現できます。
PHPのコードは通常、PHP-FPMを介して実行され、NGINXはリクエストの処理と静的ファイルの配信を担当します。
連携の流れは以下のようになります。
- ユーザがブラウザからリクエストを送信
- NGINXがリクエストを受け付け、静的コンテンツかPHP処理が必要なリクエストを判別
- PHPが必要な場合、NGINXがリクエストをPHP-FPMに転送
- PHP-FPMがPHPコードを実行し、結果をNGINXに返却
- NGINXがレスポンスをユーザに返す
この流れにより、各コンポーネントの役割を分担しながら効率的なWebサーバ環境を構築できます。
NGINXの特徴と役割
NGINXは軽量で高性能なWebサーバとして評価されており、以下の特徴があります。
- 高速な静的コンテンツの配信が可能
- 低いリソース消費で多くの同時接続に対応できる
- リバースプロキシやロードバランサとしても利用可能
NGINXはリクエストの振り分けやキャッシュ機能の利用など、Webサイトの高速化やセキュリティ強化に大きく貢献します。
また、PHP-FPMと連携することで、動的なコンテンツを効率的に処理できます。
NGINXの環境設定
インストールと基本設定
NGINXは公式リポジトリやパッケージ管理システムを利用して簡単にインストールできます。
基本設定では、サーバブロック(仮想ホスト)の設定や接続ポートの指定、ログ出力の設定などが必要です。
以下に、基本的な設定例をご紹介します。
サーバブロックの設定
サーバブロックは各Webサイトごとに独立した設定が可能です。
設定ファイルは通常、ディレクトリ/etc/nginx/sites-available/
に配置され、必要に応じてsites-enabled
にシンボリックリンクを張ります。
以下はPHP連携のサンプル設定です。
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example;
index index.php index.html;
# 静的ファイルへのリクエスト処理
location / {
try_files $uri $uri/ =404;
}
# PHPファイルの処理設定
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # PHP-FPMのソケットファイル
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
# 出力例(NGINXのエラーログ等に反映される設定内容)
# サーバはポート80でリクエストを待ち受け、example.comがリクエストされた際にPHPファイルを処理する
SSL/TLSの導入
SSL/TLSを導入することで、通信の暗号化が実現されユーザのセキュリティが向上します。
設定ファイル内で証明書のパスや秘密鍵のパスを指定し、HTTPSアクセスを有効にします。
以下はSSL/TLS導入時の設定例です。
server {
listen 443 ssl;
server_name secure.example.com;
root /var/www/secure_example;
index index.php index.html;
ssl_certificate /etc/nginx/ssl/example.com.crt; # 証明書ファイルのパス
ssl_certificate_key /etc/nginx/ssl/example.com.key; # 秘密鍵ファイルのパス
# SSL設定の基本パラメータ
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
# 出力例(HTTPS通信が有効な状態での設定)
# secure.example.comにアクセスすると、SSL/TLSを利用した暗号化通信が行われる
設定ファイルとディレクトリ構造
NGINXの設定ファイルは一般的に以下のようなディレクトリ構造となっています。
/etc/nginx/nginx.conf
グローバルな設定ファイルです。
全体の挙動やモジュールの設定が記述されています。
/etc/nginx/sites-available/
各Webサイトのサーバブロック設定ファイルが配置されます。
/etc/nginx/sites-enabled/
有効なサーバブロックのシンボリックリンクが作成されます。
不要な設定を簡単に無効化できます。
/var/log/nginx/
アクセスログやエラーログが格納されるディレクトリです。
運用時のトラブルシューティングに役立ちます。
この構造により、設定の管理や有効・無効の切り替えが容易に行え、運用環境での柔軟な対応が可能となります。
PHP-FPMの設定と連携
PHP-FPM設定ファイルの概要
PHP-FPMはPHPの処理を効率化するための仕組みとして利用され、個別のプールごとに動作環境を分離できます。
設定ファイルは通常、/etc/php/7.4/fpm/pool.d/
ディレクトリに配置されます。
各プール設定では、プロセス数やタイムアウト値、ログの出力先などを指定します。
プロセスマネジメントの基本
PHP-FPMには静的方式と動的方式があり、環境に応じたプロセスマネジメントが可能です。
動的方式の場合、以下のような設定が一般的です。
pm = dynamic
動的方式を指定します。
pm.max_children = 50
同時に実行できる最大プロセス数を定義します。
pm.start_servers = 5
初期起動時に起動するプロセス数を指定します。
pm.min_spare_servers = 2
最小の待機プロセス数を設定します。
pm.max_spare_servers = 10
最大の待機プロセス数を設定します。
これにより、アクセスが急増した場合でも適切にプロセスが増減し、リソースの使用効率が維持されます。
ユーザーとグループの設定
PHP-FPMはセキュリティの観点から、特定のユーザーやグループで実行するように設定します。
以下は設定ファイル内での例です。
; プール設定ファイルのサンプル部分
user = www-data ; 利用するユーザ名
group = www-data ; 利用するグループ名
listen.owner = www-data ; ソケットファイルの所有者
listen.group = www-data ; ソケットファイルのグループ
# 出力例(プロセスがwww-dataユーザーで実行される設定となる)
この設定により、コンテナ内や仮想環境でのファイル権限管理が容易になり、セキュリティリスクを低減できます。
NGINXとの連携確認
NGINXとPHP-FPMの連携が正しく動作しているか確認するためには、テストページの作成と動作確認が必要です。
テストページの作成と動作確認
連携テストにはシンプルなPHPファイルを作成し、ブラウザからアクセスする方法が一般的です。
以下はサンプルのindex.php
ファイルです。
<?php
// PHP動作確認用サンプルコード
// 現在時刻を表示してPHPが正常に動作しているか確認する
$now = date("Y-m-d H:i:s"); // 現在の日時を取得
echo "PHP is running properly. Current time: " . $now;
?>
PHP is running properly. Current time: 2023-10-10 15:30:00
このファイルをWebサイトのルートディレクトリに配置し、ブラウザでアクセスすることでPHP-FPMとの連携が正常に動作しているか確認できます。
パフォーマンス最適化とセキュリティ対策
キャッシュ機能の設定
NGINXにおけるキャッシュ機能を利用することで、動的コンテンツの生成回数を削減し、レスポンス速度の向上が期待できます。
特にFastCGI
キャッシュはPHP-FPMとの連携環境で有効です。
FastCGIキャッシュの利用
FastCGIキャッシュを利用するためには、まずキャッシュ領域の定義から設定します。
以下はキャッシュ設定の一例です。
# FastCGIキャッシュのディレクトリとキーの設定
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=FASTCGI_CACHE:100m inactive=60m;
server {
listen 80;
server_name cache.example.com;
root /var/www/cache_example;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# キャッシュの有効化
fastcgi_cache FASTCGI_CACHE;
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 404 1m;
}
}
# 出力例
# cache.example.comに対するPHPリクエストがキャッシュされ、200番台と302番台は10分間、404は1分間のキャッシュが有効
この設定により、キャッシュが有効となった場合、同じリクエストに対してPHPの処理を省略し、キャッシュデータを直接返すことで高速化が実現されます。
セキュリティ向上の設定
NGINXとPHP-FPMを利用する際には、不要な機能の無効化やアクセス制御によるセキュリティ強化が重要です。
一般的な設定例は以下の通りです。
不要機能の無効化とアクセス制御
- ディレクトリのブラウズ禁止
サーバブロックの設定で、ディレクトリアクセスによるインデックス表示を無効化します。
location / {
autoindex off; # ディレクトリインデックスの無効化
try_files $uri $uri/ =404;
}
- 特定のファイルへのアクセス制限
機密情報(例えば設定ファイル)へのアクセスを防止するために、特定の拡張子を拒否します。
location ~ /\.(ht|git) {
deny all;
}
- PHPエラー情報の非表示
PHPの設定ファイル内でエラー情報の表示を無効化することで、脆弱性情報を隠蔽します。
; php.iniの設定例
display_errors = Off
# 出力例
# ブラウザ上に内部情報やエラー情報が表示されず、セキュリティリスクが軽減される
これらの設定により、不要な情報が外部に漏れず、サーバ全体のセキュリティが向上します。
まとめ
本記事では、PHPとNGINXの連携設定、PHP-FPMの運用方法、キャッシュ機能およびセキュリティ対策について具体例を交えて説明しましたでした。
各設定項目の手順やサンプルコードを通して、環境構築の基本と運用上の注意点を整理した内容です。
ぜひ実際の環境で設定を試し、新たな知識の獲得にお役立てください。