• 赤色のリンクは、まだ日本語Codexに存在しないページ・画像です。英語版と併せてご覧ください。(詳細

このWikiはいつでも誰でも編集できます

Nginx

提供: WordPress Codex 日本語版
移動先: 案内検索

このページ「Nginx」は未翻訳です。和訳や日本語情報を加筆してくださる協力者を求めています

WordPressサイトは、LAMP(Linux + Apache + MySQL + PHP) で動かすことが多いですが、多くの人たちがApacheに代えてnginxを使い始めています。このページは、nginxを使ってWordPressを動かしたい人たちに役立つことを目的としています。

nginxを検討する前に、PHP APCや、WordPressのキャッシュプラグインが、単純にApacheをnginxに変更するよりも大きなパフォーマンス向上をもたらしてくれるかもしれないことに留意しましょう。APCやキャッシュプラグインを使っていないのであれば、nginx will do squat for your WordPress-based website's performance。また、WordPressはApacheを前提に作られているのでnginxを想定したサポートは充実しつつあるものの限定的です。これらを考慮に入れた上で導入を決定しましょう。

この記事は、nginxのインストールや設定については触れません。既にインストールされていて、nginxの使い方に理解があることを前提としています。

: テストし動作すると知り得たのは以下の環境による:

  • Arch Linux 64 bit (nginx 0.8.54)
  • Mac OSX Server Leopard , OSX Server Snow Leopard ,MacPorts経由 (nginx 0.8.54, php-fpm support requires modifying the PHP 5.3 'Portfile')
  • Ubuntu Server 10.04 LTS (nginx 0.8.54 with php-fpm)


一般的なネットワーク (マルチサイト)のサポート

nginx で WordPress を動かすためには、バックエンド php-cgi を設定する必要があります。使用可能なオプションは FastCGI または PHP-FPM (FastCGI Process Manager) です。この記事で私は PHP-FPM を使っています。PHP-FPM は PHP 5.3 に含まれているので、インストールが簡単だからです。

nginx の構成ファイルは 5 つに分割されており、各オプションを容易に理解するためにコメントされています。また、(英語原文の)著者は、nginx のベストプラクティスをフォローしようとするベストエフォート型を作りました。

メインスタートアップファイル

/etc/nginx/nginx.conf (または Arch Linux の /etc/nginx/conf/nginx.conf) に相当します。

# 一般的なスタートアップファイル
user {user} {group};
worker_processes  2;

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;
	client_max_body_size 13m;
	index              index.php index.html index.htm;

	# PHPへのバックエンド接続を抽象化したアップストリーム
	upstream php {
		server unix:/tmp/php-fpm.sock;
#		server 127.0.0.1:9000;
	}

	include sites-enabled/*;
}

さて、一般的な nginx.conf ファイルよりも少し難しいと感じるかもしれません。ここでは Ubuntu/Debian 方式の柔軟性を最大限にする方法——設定の保存に'sites-available' を利用し、'sites-enabled' からシンボリックリンクを張る方法——を採用しています。設定し始めが少し大変ですが、複数のWebサイトを管理すればそれに報いる価値があるでしょう。


サイトごとの設定

# すべてをメインサイトにリダイレクトする。
server {
	server_name *.mysite.com;
	root /var/www/mysite.com;

	if ($http_host != "mysite.com") {
		rewrite ^ http://mysite.com$request_uri permanent;
	}

	include global/restrictions.conf;

	// 追加のルールはこちらへ。

	// 以下のうちどれか一つを読み込む
	include global/wordpress.conf;
#	include global/wordpress-ms-subdir.conf;
#	include global/wordpress-ms-subdomain.conf;
}

インターネットを見渡すと、WordPress のための nginx 設定がいくつも見つかるでしょう。その多くは 'sever' ブロックに多くの設定を入れていますが、同じロジックを何度も繰り返し使う人もいるのです。ブログがサイトのルートにある限り、問題はありません。ここでは 'global' サブディレクトリを作成し、一般的な利用目的にそった補足的ルールをそこに追加しています。こうすることで素早いWordPressのセットアップが可能です( /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)といった隠しファイルへのアクセスを拒否します。
location ~ /\. {
	deny all;
	access_log off;
	log_not_found off;
}

通常のWordPressのルール

こちらは、シングルインストールのための 'global/wordpress.conf' ファイルです:

# WordPress シングルブログルール。
# どの server {} ブロックからもインクルードできるよう設計されています。

# この命令文は奇妙に見えるかもしれません。これは以下のルールすべてが失敗したときにマッチを試みます。
# http://wiki.nginx.org/HttpCoreModule
location / {
	try_files $uri $uri/ /index.php?$args;
}

# */wp-admin へのリクエスト末尾にスラッシュを追加します。
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

# Expiresヘッダを送り、404エラーログをオフにするディレクティブ。
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
	expires 24h;
	log_not_found off;
}

# 必要なら、キャッシュプラグインのためにいずれかの行のコメントを外してください。
#include global/wordpress-wp-super-cache.conf;
#include global/wordpress-w3-total-cache.conf;

# すべてのPHPファイルを php-fpm/php-fcgi サーバーに送ります。
location ~ \.php$ {
	# ゼロデイ攻撃を防ぐ
	# http://forum.nginx.org/read.php?2,88845,page=3
	# このサーバーにファイルが存在しなくい場合、404エラーになって動作しないようにします。
	# 別のマシーンに php-fpm/php-fcgi を設定する場合は 'try_files' のラインをコメントアウトしてください。自分のマシーンがハックされないようお祈りしましょう。
	try_files $uri =404;

	fastcgi_split_path_info ^(.+\.php)(/.+)$;
	include fastcgi_params;
	fastcgi_index index.php;
	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#	fastcgi_intercept_errors on;
	fastcgi_pass php;
}

WordPressのマルチサイトのサブディレクトリのルール

マルチサイトのサブディレクトリインストールには こちらの 'global/wordpress.conf' ファイルを使います:

# WordPress マルチサイトのサブディレクトリ用ルール。
# どの server {} ブロックからもインクルードできるよう設計されています。

# この命令文は奇妙に見えるかもしれません。これは以下のルールすべてが失敗したときにマッチを試みます。
# http://wiki.nginx.org/HttpCoreModule
location / {
	try_files $uri $uri/ /index.php?$args;
}

# */wp-admin へのリクエスト末尾にスラッシュを追加します。
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

# Expiresヘッダを送り、404エラーログをオフにするディレクティブ。
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
	expires 24h;
	log_not_found off;
}

# wp-includes/ms-files.php にアップロードされたファイルを送ります。
rewrite /files/$ /index.php last;

# マルチサイトの場合、パフォーマンス向上を目的として、適切なサブディレクトリへとシンボリックリンクを張るキャッシュプラグインがあります。
set $cachetest "$document_root/wp-content/cache/ms-filemap/${host}${uri}";
if ($uri ~ /$) {
	set $cachetest "";
}
if (-f $cachetest) {
	# URIの書き換えを行い、それ以上の書き換え処理をストップします。そうすることでこれ以上動くこともなく、次のルールが実行されることもありません。
	rewrite ^ /wp-content/cache/ms-filemap/${host}${uri} break;
}

if ($uri !~ wp-content/plugins) {
	rewrite /files/(.+)$ /wp-includes/ms-files.php?file=$1 last;
}

# 必要なら、キャッシュプラグインのためにいずれかの行のコメントを外してください。
#include global/wordpress-ms-subdir-wp-super-cache.conf;
#include global/wordpress-ms-subdir-w3-total-cache.conf;

# マルチサイトの '.../wp-.*' と '.../*.php' を書き換え
if (!-e $request_filename) {
	rewrite ^/[_0-9a-zA-Z-]+(/wp-.*) $1 last;
	rewrite ^/[_0-9a-zA-Z-]+.*(/wp-admin/.*\.php)$ $1 last;
	rewrite ^/[_0-9a-zA-Z-]+(/.*\.php)$ $1 last;
}

# すべてのPHPファイルを php-fpm/php-fcgi サーバーに送ります。
location ~ \.php$ {
	# ゼロデイ攻撃を防ぐ
	# http://forum.nginx.org/read.php?2,88845,page=3
	# このサーバーにファイルが存在しなくい場合、404エラーになって動作しないようにします。
	# 別のマシーンに php-fpm/php-fcgi を設定する場合は 'try_files' のラインをコメントアウトしてください。自分のマシーンがハックされないようお祈りしましょう。
	try_files $uri =404;

	fastcgi_split_path_info ^(.+\.php)(/.+)$;
	include fastcgi_params;
	fastcgi_index index.php;
	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#	fastcgi_intercept_errors on;
	fastcgi_pass php;
}

この設定は修正なしにサブドメインインストールでも動くかもしれません。この設定はシングルブログ(ネットワークやマルチサイトではない)でもまた動作するかもしれません。

WP Super Cacheのルール

# WP Super Cache のルール。
# 'wordpress-ms-...' からインクルードされるよう設定されています。

# 圧縮された静的コンテンツの.gz拡張子があるかチェックします。
# 静的gzipサポートがnginxにコンパイルされていない場合はコメントアウトしてください。
gzip_static on;

set $supercacheuri "";
set $supercachefile "$document_root/wp-content/cache/supercache/${http_host}${uri}index.html";
if (-e $supercachefile) {
	set $supercacheuri "/wp-content/cache/supercache/${http_host}${uri}index.html";
}

# これがPOSTリクエストならWordPressにリクエストを渡す。
if ($request_method = POST) {
	set $supercacheuri "";
}

# クエリ文字列が含まれる場合、キャッシュされていないバージョンを返す。
if ($query_string) {
	set $supercacheuri "";
}

# ログインしたユーザーとコメントをしたユーザーにはキャッシュしていないバージョンを返す。
if ($http_cookie ~* comment_author_|wordpress_logged_in|wp-postpass_) {
	set $supercacheuri "";
}

# モバイルブラウザにはキャッシュしていないバージョンを返す。
# モバイルブラウザ用WordPressテーマを使っていないばあいはCPUの無駄です。
if ($http_x_wap_profile) {
	set $supercacheuri "";
}

if ($http_profile) {
	set $supercacheuri "";
}

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 $supercacheuri "";
}

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 $supercacheuri "";
}

# キャッシュファイルがない場合は処理を終了。
if ($supercacheuri) {
	rewrite ^ $supercacheuri break;
}

W3 Total Cacheのルール

#  W3TC ブラウザキャッシュ。
gzip on;
gzip_types text/css application/x-javascript text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon;
location ~ \.(css|js)$ {
    expires 31536000s;
    add_header Pragma "public";
    add_header Cache-Control "max-age=31536000, public, must-revalidate, proxy-revalidate";
    add_header X-Powered-By "W3 Total Cache/0.9.2.3";
}
location ~ \.(html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml)$ {
    expires 180s;
    add_header Pragma "public";
    add_header Cache-Control "max-age=180, public, must-revalidate, proxy-revalidate";
    add_header X-Powered-By "W3 Total Cache/0.9.2.3";
}
location ~ \.(asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|swf|tar|tif|tiff|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$ {
    expires 31536000s;
    add_header Pragma "public";
    add_header Cache-Control "max-age=31536000, public, must-revalidate, proxy-revalidate";
    add_header X-Powered-By "W3 Total Cache/0.9.2.3";
}
# W3TC ブラウザキャッシュ終了。
# 静的ファイルの404エラーはWordPressではなくW3TC が返します。
if (-f $request_filename) {
    break;
}
if (-d $request_filename) {
    break;
}
if ($request_uri ~ "(robots\.txt|sitemap(_index|[0-9]+)?\.xml(\.gz)?)") {
    break;
}
if ($request_uri ~* \.(css|js|html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|swf|tar|tif|tiff|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$) {
    return 404;
}
# 404スキップ処理終了

gzipmモジュール付でコンパイルされていない場合、適切な行をコメントアウトしてください。 If you don't have the static gzip module compiled in, be sure to comment out the correct line.

実験的な調整:

このWP Super Cacheルールは、セットアップの仕方によっては末尾にスラッシュのあるケースでリダイレクトや適切なコンテンツの表示に問題があるかもしれません。よくあるのは、パーマリンク構造が /%post_id%/ の場合です。この場合は次のように設定ファイルを修正してください:

set $supercacheuri "";
set $supercachefile "$document_root/wp-content/cache/supercache/${http_host}${uri}/index.html";
if (-e $supercachefile) {
	set $supercacheuri "/wp-content/cache/supercache/${http_host}${uri}/index.html";
}

...

# Super Cacheのファイルが有効なら処理を中止
if ($supercacheuri) {
	rewrite [^/]$ $scheme://$host$uri/ permanent;
	rewrite ^ $supercacheuri break;
}

この修正によってWordPressのヒット数を減らすことができるので、どの場合でもこちらの方がいいかもしれません。

WP Super Cacheの最新開発バージョン(現在の 'stable' は現時点で0.9.9.9です)では、donnchaがHTTPかHTTPSかでディレクトリ構造がどのように配置されるかを変更したようです。 ${scheme}変数が突如パスに必要な情報となりました。よって、この修正は0.9.9.9より新しいstableバージョンがでたら次のようになります:

set $supercacheuri "";
set $supercachefile "$document_root/wp-content/cache/supercache/${http_host}/${scheme}${uri}index.html";
if (-e $supercachefile) {
	set $supercacheuri "/wp-content/cache/supercache/${http_host}/${scheme}${uri}index.html";
}

もう少しパフォーマンスを

もう少し冒険してでもパフォーマンスを追求したい人は、以下のようなカスタムスクリプトを使って実行してみてください(それぞれのブログが新規にインストールされたあとに実行する必要があります)

<?php
	require_once "wp-load.php";

	@ini_set('display_errors', 'On');
	nocache_headers();

	$blogs = $wpdb->get_results($wpdb->prepare("SELECT blog_id, domain, path FROM " . $wpdb->blogs . " WHERE site_id = %d AND public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0' AND blog_id <> 1 AND last_updated <> '0000-00-00 00:00:00'", $wpdb->siteid));
	if ($blogs)
	{
		// それぞれのブログにアップロードされたファイルに新しいシンボリックリンクを張る。
		foreach ($blogs as $blog)
		{
			$path = "/path/to/root/wp-content/cache/ms-filemap/" . $blog->domain;
			if (!is_dir($path))  @mkdir($path, 0777, true);
			$path .= $blog->path;
			$path = substr($path, 0, -1);
			if (!is_dir($path))  symlink("/path/to/root/wp-content/blogs.dir/" . $blog->blog_id . "/", $path);
		}
	}
?>

PHPスクリプトはそれぞれのブログ名からブログIDのディレクトリへとシンボリックリンクを貼ります。こうすることで、nginxはアップロードされたファイルへのリクエストをphp-fpmに渡さなくなります。この方法を採用してわずかなCPUでも節約したい場合は、設定ファイルの関連する行を削除してください。


また、モバイルサイトの WPテーマを使っていない場合は、WP Super Cacheのモバイルブラウザ向けルールを削除してCPUを節約してください。

注釈

最後に少し注釈を。この設定は、サイトの親がブログで、すべてのファイルがホスト内にあると仮定しています。ブログをサブディレクトリに置いた場合、残念ながらルールを書き換えなければなりません。もしかしたら、このルールを誰かが実現してくれるかもしれません、たとえばこんな:


set $wp_subdir "/blog";

ディレクティブをメインの 'sever' ブロックに置いて、その場でWordPressのルールを生成するような。

リソース

リファレンス

外部リンク

最新英語版: WordPress Codex » Nginx最新版との差分