WordpressをNginxでサイト構築したのでその設定等のメモ

個人的にはリバプロはVarnish Cacheも設定ファイルが書きやすくて好きでしたが、Nginxも今となっては詳しい解説サイトが多いので非常に敷居が低くなりました。

インストールに関しては他のサイトをご参照ください。

今回の構成は、割りと普通の、Nginx (リバースプロキシ) – Nginx (Web サーバ)という構成。

キャッシュされていないコンテンツがリクエストされた場合はnginx ウェブサーバが対応し、キャッシュを生成します。キャッシュされているリクエストはリバースプロキシが対応します。

Web サーバをNginxするだけでもFastCGIのおかげでしょう、サイトが相当軽くなります。

その恩恵が大きいのが管理画面でしょう。

Quick Cache等のWordpressのキャッシュ系のプラグインを入れれば、いわゆる公開ページは手軽にさくさくになりますが、管理画面はそうもいかず、こちらを高速化するのはなかなか敷居が高いかもしれません。

APC入れたりと根本的にPHP自体を高速に動作させる工夫が必要です。

「AWSでMicroインスタンスでWordpressを構築して公開画面はそこそこ見れる速度になったけど、管理画面が遅くて発狂しそう。。。」という方は是非お試しください。


ちなみにNginxのバージョンは1.6.2です。

ProxyとWebサーバー感の通信はUnix Socketを利用しています。

そんなわけで、設定ファイルを下に。

# ドキュメントルート
root   /var/www/html/wordpress;
# インデックスファイル指定
index  index.php index.html index.htm;

# キャッシュしたファイルが保管されるパスと、キャッシュゾーンの名前、容量を指定
# キャッシュ保管場所 /var/cache/nginx
# キャッシュを保存するサブディレクトリ階層の深さ 1:2
# キャッシュゾーン czone メモリの割当量 32m
# ゾーン内に保存できるキャッシュ最大値 256m
# アクセスの無いキャッシュを削除するまでの期間 1440m
proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=czone:32m max_size=256m inactive=1440m;
# 利用するキャッシュゾーンの名前を指定
proxy_cache czone;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# ステータスコードが通常応答の「200」と、ファイルが存在しない「404」の場合30分間キャッシュを保持
proxy_cache_valid 200 404 30m;

# プロキシサーバ設定
server {
    listen 80 default_server;

    # ドットファイルへのアクセスを禁止、ログへの記録オフ
    location ~ /\. {deny all; access_log off; log_not_found off; }
    # robots.txt へのアクセスはログへの記録オフ
    location = /robots.txt  { access_log off; log_not_found off; }
    # favicon へのアクセスはログへの記録オフ
    location = /favicon.ico { access_log off; log_not_found off; }
    # JavaScript CSS 画像へのアクセスはログへの記録オフ、直ちにプロキシに通しキャッシュ。
    # この期の設定でアクセス元の状態で複数キャッシュを行うが画像ファイルなどは複数キャッシュさせない
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        log_not_found off;
        proxy_pass http://unix:/var/run/nginx.sock;
        expires 7d;
    }

    # プロキシキャッシュ設定
    # 初期値はキャッシュするにセット
    set $do_not_cache 0;
    # .php ファイルへ直接アクセスがあるのは基本的に管理ページのみのためキャッシュしない
    if ($uri ~* "\.php$") {
        set $do_not_cache 1;
    }

    # POST 時はキャッシュしない
    if ($request_method = POST) {
        set $do_not_cache 1;
    }

    # $proxy_cache_key に任意の文字を加えることで別のキーでページをキャッシュ可能にする

    set $proxy_cache_key "$scheme://$host$request_uri";

    # ログイン状態またはコメントを記入したことがあれば、その情報ごとにキャッシュを分ける
    if ($http_cookie ~ "(wordpress_logged_in_|comment_author_)(.*)") {
        set $proxy_cache_key "$2::$proxy_cache_key";
    }

    # 今まで組み立てたプロキシ設定でキャッシュを実行
    location / {
        proxy_no_cache $do_not_cache;
        proxy_cache_bypass $do_not_cache;
        proxy_cache_key $proxy_cache_key;

        proxy_pass http://unix:/var/run/nginx.sock;
    }

}


# ウェブサーバ設定
server {
    listen unix:/var/run/nginx.sock;
    # WordPress カスタム パーマネントリンク対応
    try_files $uri $uri/ /index.php?q=$uri&$args;

    # PHP-FPM 設定
    location ~ \.php$ {
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
        fastcgi_pass_header "X-Accel-Redirect";
        fastcgi_pass_header "X-Accel-Buffering";
        fastcgi_pass_header "X-Accel-Charset";
        fastcgi_pass_header "X-Accel-Expires";
        fastcgi_pass_header "X-Accel-Limit-Rate";
        fastcgi_read_timeout 1200;
    }

}
いきなり再起動せずに、service nginx configtest で記述ミスが無いか確認しましょう。

次はWordpressの管理画面にIP制限を仕込みたいと思います。


0 コメント