nginx連載5回目: nginxの設定、その3 – locationディレクティブというのを見ていて、僕もメモ。
WordPressの設定時に出てくるのを理解する試み!
今回は、serverブロックのあたりだけ。
詳しい各種設定方法は、以下の本に載っています。
また、著者の岡本さんの下記のエントリーも参考にしてください。
上の方に書いてあるところ
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ファイルにパラメータ付きで渡します。その後の処理はお任せ。
今日はこんなところです。