nginxでWordPressの設定する時に出てくるディレクティブのメモ

nginx連載5回目: nginxの設定、その3 – locationディレクティブというのを見ていて、僕もメモ。

WordPressの設定時に出てくるのを理解する試み!
今回は、serverブロックのあたりだけ。

詳しい各種設定方法は、以下の本に載っています。

WordPress 高速化&スマート運用必携ガイド WordPress 高速化&スマート運用必携ガイド
レビューを見る
欲しいものリストに追加
価格:3024円 在庫あり。powered by Amazon.co.jp

また、著者の岡本さんの下記のエントリーも参考にしてください。

WordPress 高速化&スマート運用必携ガイド フォロー

上の方に書いてあるところ

listen		80;
server_name	example.com *.example.com;
root    	/var/www/html/example;
index		index.html index.htm index.php;
charset		utf-8;

上から順番に、

  • ポート指定。プロキシキャッシュを使うときはここを8080とかにして、WordPressを動かす時に受け取れるようにする。
  • ドメイン指定。マルチサイト使うときは、ここに*.(ドメイン名)って書ける。ApacheのServerAliasみたいなの。
  • ドキュメントルート指定。
  • インデックスファイル指定。
  • 文字コード。デフォルトではkoi8-rなるロシアのものらしきのがコメントアウトされて置かれてる。

静的ファイルにExpireHeaderを追加するところ

location ~ .*\.(txt|xml|html?|js|css|gz|ico|jpe?g|gif|png|wmv|flv|mpg) {
	access_log      off;
	expires         30d;
	break;
}

最初のニョロ~が、正規表現(大文字小文字を区別)であることを示すプレフィックス。

.*は、ワイルドカード.が複数回続く*
\.はドットのこと。エスケープしないとメタ文字なので.がワイルドカードになっちゃう。
(txt|xml|html?|js|css|gz|ico|jpe?g|gif|png|wmv|flv|mpg)は、txtかxmlかhtmかhtmlかjsか・・・・の意。

.htaccessへのアクセスを拒否

	location ~ /\.ht {
	deny all;
}

ルートにおいてある.htから始まるファイルへのアクセスを拒否。そもそも無いから。

/wp-adminへのアクセスの場合

location /wp-admin {
	proxy_pass http://wordpress;
}

プロキシキャッシュを使う時に、出てくる。
管理画面へのアクセスを静的にキャッシュしてもらっては困るので、/wp-admin以下へのアクセスがあったら、後述のようにWordPressにそのまま渡す。

キャッシュじゃなくてWordPressを動かす

upstream wordpress {
	server 127.0.0.1:8080;
}

WordPressは8080で動かしますよと指定する。upstream hoge {}というブロックを作っておくと他のブロックからhogeという名前を指定できる。

キャッシュキーのモバイル変数づくり

set $mobile "";
if ($http_user_agent ~* '(DoCoMo|J-PHONE|Vodafone|MOT-|UP\.Browser|DDIPOCKET|ASTEL|PDXGW|Palmscape|Xiino|sharp pda browser|Windows CE|L-mode|WILLCOM|SoftBank|Semulator|Vemulator|J-EMULATOR|emobile|mixi-mobile-converter)') {
	set $mobile ".ktai";
}
if ($http_user_agent ~* '(iPhone|iPod|Opera Mini|Android.*Mobile|NetFront|PSP|BlackBerry|Windows Phone)') {
	set $mobile ".smartphone";
}

set $hoge "hey";と書くと変数に値を代入できる。
ここでは、$mobileという変数に空をセットした後で、ガラケーからのアクセスだったら.ktaiを、スマホからだったら.smartphoneをセットしてる。

ifブロックは、

if ($http_user_agent ~* '(エージェント羅列)'){
	[処理]
}

となっていて、
$http_user_agentはnginxが勝手に作ってくれる変数でユーザーエージェントが入ってる。Apacheの%{HTTP_USER_AGENT}、phpで取得してる時は$_SERVER['HTTP_USER_AGENT']; 。ユーザーエージェント意外にも色々ある。

~*は、大文字小文字を区別しない正規表現の意味のプレフィックス。

プロキシキャッシュを使ったり使わなかったり

location / {
	if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
		set $do_not_cache 1;
	}
	proxy_no_cache          $do_not_cache;
	proxy_cache_bypass      $do_not_cache;
	proxy_cache             cache1;
	proxy_cache_key         "$scheme://$host$request_uri$is_args$args$mobile";
	proxy_cache_valid       200 10m;
	proxy_cache_valid       404 5m;
	proxy_pass http://wordpress;
}

location / {}なのでほぼ全部のリクエスト。location /wp-admin{}ブロックなどもっと個別の指定がある場合はここじゃない。

最初のifブロックでは、クッキーにcomment_author_などが含まれていたら、$do_not_cache変数に1をセット。

proxy_no_cacheディレクティブでは、$do_not_cache変数が割り当てられていて、これが1の時にはWordPressから受け取ったファイルをキャッシュしない(参考)。

proxy_cache_bypassディレクティブでは、1がセットされている時には、ファイルをキャッシュから探すのを止める。上のproxy_no_cacheと同じ変数を与えておけば、キャッシュしないしキャッシュから取得しようとしない(参考)。

proxy_cacheディレクティブでは、キャッシュゾーンを指定。別途keys_zoneの指定が必要。

proxy_cache_keyディレクティブでは、キャッシュファイルにキーを付けていてここでは、

  • https?などのスキーム
  • ホスト名。デフォルトだとこれが入っていなくてマルチサイトやバーチャルホストの設定をしている時とか困る。
  • uri
  • パラメータ(なのかな?)
  • モバイル変数(上で定義したもの)。これでPC用とモバイル用のファイルを別々にキャッシュできる。

proxy_cache_validはキャッシュの有効期間をステータス別に指定。proxy_passではWordPressがどこにいるかを指定。

バックエンド。静的ファイルがあるときと無いとき

location / {
	# static files
	if (-f $request_filename) {
		access_log      off;
		break;
	}
	# request to index.php
	if (!-e $request_filename) {
		rewrite ^(.+)$ /index.php?q=$1 last;
	}
}

1つ目のifブロックでは、リクエストされたファイルがあればアクセスログを残さず、その後の処理も飛ばします。

2つ目のifブロックでは、リクエストされたファイルがない場合、ルートのindex.phpファイルにパラメータ付きで渡します。その後の処理はお任せ。

今日はこんなところです。

↓ プラグインを作る方々への本、書きました。 ↓

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です