一般的およびマルチサイトサポート
WordPressをNginxで動作させるには、バックエンドのphp-cgiを設定する必要があります。利用可能なオプションはfastcgi
またはphp-fpm
です。ここでは、PHP 5.3+に含まれているphp-fpmが使用されているため、インストールは簡単です。
Nginxの設定は5つの異なるファイルに分割されており、各オプションを理解しやすくするために多くのコメントが付けられています。著者は、nginxの設定に関する「ベストプラクティス」に従うために最善を尽くしました。
メイン(一般的)スタートアップファイル
これは/etc/nginx/nginx.conf(またはArch Linuxを使用している場合は/etc/nginx/conf/nginx.conf)に相当します。
# 一般的なスタートアップファイル。
user {user} {group};
#通常は持っているCPUの数と等しいです。コマンド「grep processor /proc/cpuinfo | wc -l」を実行して見つけてください。
worker_processes auto;
worker_cpu_affinity auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
# bind()できないというメッセージをログから除外します。
#daemon off;
events {
worker_connections 1024;
}
http {
#rewrite_log on;
include mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
sendfile on;
#tcp_nopush on;
keepalive_timeout 3;
#tcp_nodelay on;
#gzip on;
#phpの最大アップロード制限はこれより大きくできません
client_max_body_size 13m;
index index.php index.html index.htm;
# PHPのためのバックエンド接続を抽象化するためのアップストリーム。
upstream php {
#これはphp-fpmプールの「listen」ディレクティブの値と一致する必要があります
server unix:/tmp/php-fpm.sock;
# server 127.0.0.1:9000;
}
include sites-enabled/*;
}
サイトごとの設定
# すべてをメインサイトにリダイレクトします。別のサーバーステートメントを使用し、ifステートメントは使用しません - https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/を参照してください。
server {
server_name _;
return 302 $scheme://example.com$request_uri;
}
server {
server_name example.com;
root /var/www/example.com;
index index.php;
include global/restrictions.conf;
# 追加のルールはここに記述します。
# 以下のファイルのうち1つだけを含めます。
include global/wordpress.conf;
# include global/wordpress-ms-subdir.conf;
# include global/wordpress-ms-subdomain.conf;
}
設定のセクションを複数のファイルに分割することで、同じロジックを何度も再利用できます。「global」サブディレクトリは、一般的な目的で使用するための追加ルールを追加するために使用されます(/etc/nginx/conf/global/または/etc/nginx/global/は、nginxのインストール方法によって異なります)。
グローバル制限ファイル
# グローバル制限設定ファイル。
# 任意のserver {}ブロックに含めるように設計されています。
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# 隠しファイル(.htaccess、.htpasswd、.DS_Store(Mac)など)へのアクセスをすべて拒否します。
# 後で解析するためにリクエストを記録し続けます(またはfail2banなどのファイアウォールユーティリティに渡します)
location ~ /\. {
deny all;
}
# アップロードディレクトリ内の.php拡張子を持つファイルへのアクセスを拒否します
# サブディレクトリインストールおよびマルチサイトネットワークで動作します
# 後で解析するためにリクエストを記録し続けます(またはfail2banなどのファイアウォールユーティリティに渡します)
location ~* /(?:uploads|files)/.*\.php$ {
deny all;
}
一般的なWordPressルール
シングルサイトインストールの場合、こちらがglobal/wordpress.conf
ファイルです:
# WordPressシングルサイトルール。
# 任意のserver {}ブロックに含めるように設計されています。
# phpのためのバックエンド接続を抽象化するためのアップストリーム
upstream php {
server unix:/tmp/php-cgi.socket;
server 127.0.0.1:9000;
}
server {
## あなたのウェブサイト名をここに記入します。
server_name domain.tld;
## あなたの唯一のパス参照。
root /var/www/wordpress;
## これはhttpブロック内にあるべきで、もしそうであれば、ここには必要ありません。
index index.php;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location / {
# これは素晴らしいことです。静的コンテンツのためにphpは触れません。
# クエリ文字列を使用する際にデフォルト以外のパーマリンクが壊れないように「?$args」部分を含めます。
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
#注意:php.iniに「cgi.fix_pathinfo = 0;」を設定しておくべきです。
include fastcgi.conf;
fastcgi_intercept_errors on;
fastcgi_pass php;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}
これはNginxの最新の例です:https://www.nginx.com/resources/wiki/start/topics/recipes/wordpress/
WordPressマルチサイト
マルチサイトインストールの場合、マルチサイトが有効化されたときに使用されていたWordPressのバージョンやドメイン/サブディレクトリの設定に応じて、以下のセクションのいずれかをglobal/wordpress.conf
ファイルに使用してください。
WordPress 3.5以降
WordPress 3.5以降でマルチサイトを有効化した場合、これらのいずれかを使用してください。
WordPress 3.5以降のサブディレクトリの例
# WP 3.5以降のWordPressマルチサイトサブディレクトリ設定ファイル。
server {
server_name example.com ;
root /var/www/example.com/htdocs;
index index.php;
if (!-e $request_filename) {
rewrite /wp-admin$ $scheme://$host$request_uri/ permanent;
rewrite ^(/[^/]+)?(/wp-.*) $2 last;
rewrite ^(/[^/]+)?(/.*\.php) $2 last;
}
location / {
try_files $uri $uri/ /index.php?$args ;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_pass php;
}
#静的コンテンツの有効期限ヘッダーのためのルールをここに追加します
}
WordPress 3.5以降のサブドメインの例
# WP 3.5以降のWordPressマルチサイトサブドメイン設定ファイル。
server {
server_name example.com *.example.com ;
root /var/www/example.com/htdocs;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args ;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_pass php;
}
#静的コンテンツの有効期限ヘッダーのためのルールをここに追加します
}
WordPress 3.4およびそれ以前
WordPress 3.4またはそれ以前でマルチサイトを最初に有効化した場合、これらのいずれかを使用する必要があります。
WordPress <=3.4サブディレクトリの例
# WP 3.4およびそれ以前のWordPressマルチサイトサブディレクトリ設定ファイル。
map $uri $blogname{
~^(?P<blogpath>/[^/]+/)files/(.*) $blogpath ;
}
map $blogname $blogid{
default -999;
#参照:https://wordpress.org/extend/plugins/nginx-helper/
#include /var/www/wordpress/wp-content/plugins/nginx-helper/map.conf ;
}
server {
server_name example.com ;
root /var/www/example.com/htdocs;
index index.php;
location ~ ^(/[^/]+/)?files/(.+) {
try_files /wp-content/blogs.dir/$blogid/files/$2 /wp-includes/ms-files.php?file=$2 ;
access_log off; log_not_found off; expires max;
}
#php readfile()を避ける
location ^~ /blogs.dir {
internal;
alias /var/www/example.com/htdocs/wp-content/blogs.dir ;
access_log off; log_not_found off; expires max;
}
if (!-e $request_filename) {
rewrite /wp-admin$ $scheme://$host$request_uri/ permanent;
rewrite ^(/[^/]+)?(/wp-.*) $2 last;
rewrite ^(/[^/]+)?(/.*\.php) $2 last;
}
location / {
try_files $uri $uri/ /index.php?$args ;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_pass php;
}
#静的コンテンツの有効期限ヘッダーのためのルールをここに追加します
}
NGINXは、静的ファイルの提供におけるパフォーマンスの低下を排除するために、X-Accel-Redirectおよびmapという2つの特別なディレクティブを提供します。
WordPress <=3.4サブドメインの例
# WP 3.4およびそれ以前のWordPressマルチサイトサブドメイン設定ファイル。
map $http_host $blogid {
default -999;
#参照:https://wordpress.org/extend/plugins/nginx-helper/
#include /var/www/wordpress/wp-content/plugins/nginx-helper/map.conf ;
}
server {
server_name example.com *.example.com ;
root /var/www/example.com/htdocs;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args ;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_pass php;
}
#WPMUファイル
location ~ ^/files/(.*)$ {
try_files /wp-content/blogs.dir/$blogid/$uri /wp-includes/ms-files.php?file=$1 ;
access_log off; log_not_found off; expires max;
}
#WPMU x-sendfileでphp readfile()を避ける
location ^~ /blogs.dir {
internal;
alias /var/www/example.com/htdocs/wp-content/blogs.dir;
access_log off; log_not_found off; expires max;
}
#静的コンテンツの有効期限ヘッダーのためのルールをここに追加します
}
参照:https://www.nginx.com/resources/wiki/start/topics/recipes/wordpress/
NginxでのHTTPS
NginxでHTTPSを有効にするのは比較的簡単です。
server {
# listens both on IPv4 and IPv6 on 443 and enables HTTPS and HTTP/2 support.
# HTTP/2 is available in nginx 1.9.5 and above.
listen *:443 ssl http2;
listen [::]:443 ssl http2;
# indicate locations of SSL key files.
ssl_certificate /srv/www/ssl/ssl.crt;
ssl_certificate_key /srv/www/ssl/ssl.key;
ssl_dhparam /srv/www/master/ssl/dhparam.pem;
# indicate the server name
server_name example.com *.example.com;
# Enable HSTS. This forces SSL on clients that respect it, most modern browsers. The includeSubDomains flag is optional.
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
# Set caches, protocols, and accepted ciphers. This config will merit an A+ SSL Labs score as of Sept 2015.
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5';
}
Mozillaは、優れたSSL設定生成ツールも提供しています。
WP Super Cacheルール
# WP Super Cacheルール。
# 'wordpress-ms-...'設定ファイルから含めるように設計されています。
set $cache_uri $request_uri;
# POSTリクエストおよびクエリ文字列を含むURLは常にPHPに送信されるべきです
if ($request_method = POST) {
set $cache_uri 'null cache';
}
if ($query_string != "") {
set $cache_uri 'null cache';
}
# 以下のセグメントを含むURIはキャッシュしないでください
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
set $cache_uri 'null cache';
}
# ログインユーザーまたは最近のコメント者にはキャッシュを使用しないでください
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
set $cache_uri 'null cache';
}
# モバイル開始
# モバイルブラウザセクションは、キャッシュされていないバージョンを提供します。デフォルトではコメントアウトされています。ほとんどの最新のWordPressテーマ(Twenty Elevenを含む)はレスポンシブです。このセクションの設定行のコメントを解除すると、WP-Touchのようなプラグインを使用できます。
# if ($http_x_wap_profile) {
# set $cache_uri 'null cache';
#}
#if ($http_profile) {
# set $cache_uri 'null cache';
#}
#if ($http_user_agent ~* (2.0\ MMP|240x320|400X240|AvantGo|BlackBerry|Blazer|Cellphone|Danger|DoCoMo|Elaine/3.0|EudoraWeb|Googlebot-Mobile|hiptop|IEMobile|KYOCERA/WX310K|LG/U990|MIDP-2.|MMEF20|MOT-V|NetFront|Newt|Nintendo\ Wii|Nitro|Nokia|Opera\ Mini|Palm|PlayStation\ Portable|portalmmm|Proxinet|ProxiNet|SHARP-TQ-GX10|SHG-i900|Small|SonyEricsson|Symbian\ OS|SymbianOS|TS21i-10|UP.Browser|UP.Link|webOS|Windows\ CE|WinWAP|YahooSeeker/M1A1-R2D2|iPhone|iPod|Android|BlackBerry9530|LG-TU915\ Obigo|LGE\ VX|webOS|Nokia5800)) {
# set $cache_uri 'null cache';
#}
#if ($http_user_agent ~* (w3c\ |w3c-|acs-|alav|alca|amoi|audi|avan|benq|bird|blac|blaz|brew|cell|cldc|cmd-|dang|doco|eric|hipt|htc_|inno|ipaq|ipod|jigs|kddi|keji|leno|lg-c|lg-d|lg-g|lge-|lg/u|maui|maxo|midp|mits|mmef|mobi|mot-|moto|mwbp|nec-|newt|noki|palm|pana|pant|phil|play|port|prox|qwap|sage|sams|sany|sch-|sec-|send|seri|sgh-|shar|sie-|siem|smal|smar|sony|sph-|symb|t-mo|teli|tim-|tosh|tsm-|upg1|upsi|vk-v|voda|wap-|wapa|wapi|wapp|wapr|webc|winw|winw|xda\ |xda-)) {
# set $cache_uri 'null cache';
#}
#モバイル終了
# キャッシュされたファイルまたは実際のファイルが存在する場合はそれを使用し、そうでない場合はリクエストをWordPressに渡します
location / {
try_files /wp-content/cache/supercache/$http_host/$cache_uri/index.html $uri $uri/ /index.php?$args ;
}
実験的な変更:
HTTPSを使用している場合、WP Super Cacheの最新の開発バージョンは、HTTPとHTTPSを区別するために異なるディレクトリ構造を使用する場合があります。try_files行は以下のようになる場合があります:
location / {
try_files /wp-content/cache/supercache/$http_host/$cache_uri/index-https.html $uri $uri/ /index.php?$args ;
}
W3トータルキャッシュルール
W3トータルキャッシュは、WordPressの設定に応じてディスクベースのキャッシュストレージのための異なるディレクトリ構造を使用します。
キャッシュ検証チェックは、以下に示すように共通のままです:
#W3トータルキャッシュチェック
set $cache_uri $request_uri;
# POSTリクエストおよびクエリ文字列を含むURLは常にPHPに送信されるべきです
if ($request_method = POST) {
set $cache_uri 'null cache';
}
if ($query_string != "") {
set $cache_uri 'null cache';
}
# 以下のセグメントを含むURIはキャッシュしないでください
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
set $cache_uri 'null cache';
}
# ログインユーザーまたは最近のコメント者にはキャッシュを使用しないでください
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $cache_uri 'null cache';
}
#上記のWP SUPER CACHEセクションからモバイルルールを追加
#以下のコードブロックを追加...
通常のWordPress(マルチサイトなし)用
以下を使用してください:
# キャッシュされたファイルまたは実際のファイルが存在する場合はそれを使用し、そうでない場合はリクエストをWordPressに渡します
location / {
try_files /wp-content/w3tc/pgcache/$cache_uri/_index.html $uri $uri/ /index.php?$args ;
}
サブディレクトリを持つマルチサイト用
以下を使用してください:
if ( $request_uri ~* "^/([_0-9a-zA-Z-]+)/.*" ){
set $blog $1;
}
set $blog "${blog}.";
if ( $blog = "blog." ){
set $blog "";
}
# キャッシュされたファイルまたは実際のファイルが存在する場合はそれを使用し、そうでない場合はリクエストをWordPressに渡します
location / {
try_files /wp-content/w3tc-$blog$host/pgcache$cache_uri/_index.html $uri $uri/ /index.php?$args ;
}
サブドメイン/ドメインマッピングを持つマルチサイト用
以下を使用してください:
location / {
try_files /wp-content/w3tc-$host/pgcache/$cache_uri/_index.html $uri $uri/ /index.php?$args;
}
注意
Nginx fastcgi_cache
Nginxは、サーバーの負荷を軽減するために独自にキャッシングを行うことができます。Nginxの組み込みfastcgi_cacheを使用したい場合は、fastcgi_cache_purgeモジュールでnginxをコンパイルする方が良いです。これにより、ページが編集されたときにnginxがキャッシュを削除するのに役立ちます。WordPress側では、fastcgi_cache_purge機能を利用するためにNginx Helperのようなプラグインをインストールする必要があります。
設定は以下のようになります:
http{…}ブロック内でNginxキャッシュゾーンを定義します。server{…}ブロックの外側に
#move next 3 lines to /etc/nginx/nginx.conf if you want to use fastcgi_cache across many sites
fastcgi_cache_path /var/run/nginx-cache levels=1:2 keys_zone=WORDPRESS:500m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
WordPressサイト設定では、server{..}ブロックに以下のキャッシュチェックブロックを追加します
#fastcgi_cache開始
set $no_cache 0;
# POSTリクエストおよびクエリ文字列を含むURLは常にPHPに送信されるべきです
if ($request_method = POST) {
set $no_cache 1;
}
if ($query_string != "") {
set $no_cache 1;
}
# 以下のセグメントを含むURIはキャッシュしないでください
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
set $no_cache 1;
}
# ログインユーザーまたは最近のコメント者にはキャッシュを使用しないでください
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $no_cache 1;
}
次にPHP処理ブロックに変更を加えます
次のphpブロックにこれを追加します。fastcgi_cache_valid 200 60m;という行に注意してください。これはnginxに200レスポンス(通常のページ)のみをキャッシュするように指示します。これは、リダイレクトがキャッシュされないことを意味します。これは多言語サイトにとって重要です。実装しない場合、nginxはメインURLを1つの言語でキャッシュし、ユーザーをそれぞれの言語に応じたコンテンツにリダイレクトすることができません。
fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 60m;
そのため、次のようになります
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
# This is a robust solution for path info security issue and works with "cgi.fix_pathinfo = 1" in /etc/php.ini (default)
include fastcgi.conf;
fastcgi_index index.php;
# fastcgi_intercept_errors on;
fastcgi_pass php;
fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 60m;
}
条件付きパージのためのロケーションを追加します
location ~ /purge(/.*) {
# Uncomment the following two lines to allow purge only from the webserver
# allow 127.0.0.1;
# deny all;
fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
}
‘unknown directive “fastcgi_cache_purge”’エラーが発生した場合は、Nginxインストールにfastcgi_cache_purgeモジュールがあるか確認してください。
マルチサイトにおける静的ファイルのパフォーマンス向上(WP <= 3.4)
デフォルトでは、3.5以前に有効化されたマルチサイトネットワークでは、静的ファイルリクエストがphpを呼び出します。すなわち、ms-files.php
ファイルです。Nginx Map{..}
ディレクティブを使用することで、はるかに優れたパフォーマンスを得ることができます。
サイトのNginx設定では、server{..}
ブロックの上に次のセクションを追加します:
map $http_host $blogid {
default 0;
example.com 1;
site1.example.com 2;
site1.com 2;
}
これはサイト名とブログIDのリストです。このリストを取得するにはNginx helperを使用できます。このプラグインは、map.conf
ファイルも生成し、map{}
セクションに直接含めることができます。
map $http_host $blogid {
default 0;
include /path/to/map.conf ;
}
map{..}
セクションを作成した後、Nginx設定で1つの変更を行う必要があります。/files/へのリクエストは最初にnginx map{..}
を使用して処理されます:
location ~ ^/files/(.*)$ {
try_files /wp-content/blogs.dir/$blogid/$uri /wp-includes/ms-files.php?file=$1 ;
access_log off; log_not_found off; expires max;
}
注意
- 新しいサイトが作成されたり削除されたり、既存のサイトに追加のドメインがマッピングされたりすると、Nginx helperはmap.confファイルを自動的に更新しますが、Nginx設定を手動でリロードする必要があります。これは後でいつでも行うことができます。それまでは、新しいサイトのファイルのみがphp-fpmを使用して提供されます。
- この方法ではシンボリックリンクは生成されません。したがって、偶発的な削除やシンボリックリンクに従うバックアップスクリプトに問題はありません。
- 大規模なネットワークでは、単一のmap.confファイルがあるため、スケールアップがうまくいきます。
最後に重要な注意点:この全体のセットアップは、サイトのルートがブログであり、参照されるすべてのファイルがホスト上に存在することを前提としています。ブログを/blogのようなサブディレクトリに置く場合、ルールを修正する必要があります。おそらく誰かがこれらのルールを取り、例えば、
set $wp_subdir "/blog";
メインの‘server’ブロックにディレクティブを追加し、一般的なWPルールに自動的に適用されるようにすることができるでしょう。
警告
グローバル制限ファイルのタイプミスは抜け穴を作成する可能性があります。「uploads」ディレクトリが本当に保護されているかテストするには、いくつかのコンテンツを含むPHPファイルを作成し(例:)、それを「uploads」ディレクトリ(またはそのサブディレクトリの1つ)にアップロードし、ブラウザからアクセス(実行)してみてください。
リソース
参考
外部リンク
- Nginx WordPress wikiページ
- LinodeのライブラリにおけるLEMPガイド
- LinodeのライブラリにおけるNginxに関するさまざまなガイド
- Php-fpmとNginxを使用した超高速WordPress
- バーチャルホストの例
- 一般的な状況に対する20以上のWordPress-Nginxチュートリアルのリスト
- Nginx設定の紹介
- Nginxを使用してWordPressを自分でホストするための包括的なブログシリーズ
- WordPressインストールCentminMod
- Nginx WordPressインストールガイド
スクリプトとツール
WordPress Nginxのスクリプトインストールには、CentOS用のCentminModを使用できます。
Nginxのセキュリティ
変更履歴
- 2022-10-25: Nginxからの元のコンテンツ。