レンタルサーバー・自宅サーバー設定・構築のヒント
レンタルサーバー・自宅サーバー設定・構築のヒント - レンタルサーバー・自宅サーバーの設定・構築情報を公開しています。

Nginx をリバースプロキシ(キャッシュ) として使ってみた

2011年6月29日 2015年5月16日
nginx reverse proxy cache

前回「Nginx + php-fpm をさくらのVPSで使ってみた」では、 nginxをウェブサーバーとして使ってみました。実際にさくらのVPSでの設定を行って、動作させてみました。 nginxのウェブサーバーとしてのパフォーマンスは、十分に感じられたと思います。

今回は、nginxの真骨頂であるリバースプロキシを使ってみます。
よくあるパターンは、nginx (リバースプロキシ) + apache (ウェブサーバー本体) の組み合わせです。
ここでは、nginx (リバースプロキシ) + nginx (ウェブサーバー本体) の1サービスで実施することで、リソースの消費を最小限におさえてみました。

リバースプロキシ(Reverse Proxy) または逆プロキシ とは、
特定のサーバへの要求を必ず経由するように設置されたプロキシサーバのことで、一般的なプロキシとは、文字通りの意味あいを持ち、不特定多数のサーバを対象としません。
リバースプロキシは、不特定多数のクライアントから寄せられる要求に対して、応答を肩代わりすることにより特定のサーバの負担を軽減したり、 アクセスを制限することにより特定のサーバのセキュリティを高めたりする目的に用いられます。

リバースプロキシ
リバースプロキシサーバーの例
プロキシ
プロキシサーバーの例

上の図は、リバースプロキシサーバーと一般的なプロキシサーバーの違いです。
いずれのプロキシサーバーもインターネットに接続されています。

違いは、インターネットと逆向きの接続先が
  • リバースプロキシサーバー :
    ウェブサーバーなどのサーバー(インターネットサーバー)
  • プロキシサーバー :
    個人のパソコン(インターネットユーザ)
となっていることです。

リバースプロキシサーバーをおくこともメリットは、もちろんキャッシュサーバーとしてのメリットもありますが、 ロードバランサーの機能を使っての以下の図のような負荷分散のイントラネットを構築できることです。
リバースプロキシ2
リバースプロキシー(reverse proxy server)としてnginxを利用する場合のキャッシュ削除モジュール nginx cache purge を組み込みたい場合は、
を参照してください。
また、以下の記事も参考になるかと思います。
nginx でリバースプロキシ、FastCGIキャッシュのキャッシュを削除する方法をまとめて解説してみた
Nginxのキャッシュ機能だけを利用したい方は、さらに効率的、高速化が図れる Nginx のFastCGIキャッシュ(fastcgi cache )を使ってみた が参考になるかと思います。

さくらのVPSでのnginx の設定例

以下は、Nginx + php-fpm をさくらのVPSで使ってみた で使用した さくらのVPS での nginx の設定例を リバースプロキシ用に編集したものです。

今回のリバースプロキシに関する編集箇所は、 赤:追加青:Wordpress関連事項の追加灰:変更箇所で それぞれ表しています。


/etc/nginx/nginx.confの設定例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
user       apache apache;
worker_processes  2;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
worker_rlimit_nofile 1024;

events {
    worker_connections  1024;
}
 
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" "$gzip_ratio"';

    access_log  /var/log/httpd/access.log  main;

    sendfile        on;
    tcp_nopush      off;

    keepalive_timeout  0;

    gzip              on;
    gzip_http_version 1.0;
    gzip_types        text/plain 
                      text/html 
                      text/xml 
                      text/css 
                      application/xml 
                      application/xhtml+xml 
                      application/rss+xml 
                      application/atom_xml 
                      application/javascript 
                      application/x-javascript 
                      application/x-httpd-php;
    gzip_disable      "MSIE [1-6]\.";
    gzip_disable      "Mozilla/4";
    gzip_comp_level   2;
    gzip_vary         on;
    gzip_proxied      any;
    gzip_buffers      4 8k;

    server_names_hash_bucket_size 128;    #    32/64/128

    proxy_buffering       on;
    proxy_buffer_size     8k;
    proxy_buffers         100 8k;
    proxy_cache_path      /var/cache/nginx/domain1.com levels=1:2 keys_zone=cache_domain1.com:15m inactive=7d max_size=1000m;
    proxy_temp_path       /var/cache/nginx/temp 1 2; 
    proxy_connect_timeout 60;
    proxy_read_timeout    90;
    proxy_send_timeout    60;
    proxy_cache_valid     200 2h;
    proxy_cache_valid     302 2h;
    proxy_cache_valid     301 4h;
    proxy_cache_valid     any 1m;
    
    # set header
    proxy_set_header Host            $http_host;
    proxy_set_header X-Remote-Addr   $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    # backend
    upstream www.domain1.com.backend {
        ip_hash;
        server 127.0.0.1:8080;
    }

    server {
        listen 80;
        server_name domain1.com www.domain1.com;
        access_log   /var/log/httpd/domain1.com.access.log;
        error_log    /var/log/httpd/domain1.com.error.log;
    
        if ($http_host = domain1.com) {
            rewrite  (.*)  http://www.domain1.com$1;
        }
        
        # for wordpress custom url.
        try_files $uri $uri/ /index.php?q=$uri&$args;
        
        # Proxy Setting.
        location / {
            set $do_not_cache 0;
            
            ### wordpress cache common settings.
            # check to do not cache
            #  -- POST ?
            # if ($request_method = "POST") {
            #  -- POST or HEAD ?
            if ($request_method != "GET") {
                set $do_not_cache 1;
            }
    
            #  -- Login or Comment or Post Editting ?
            if ($http_cookie ~ ^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$) {
                set $do_not_cache 1;
            }
    
            #  -- mobile ?
            if ($http_x_wap_profile ~ ^[a-z0-9\"]+) {
                set $do_not_cache 1;
            }
    
            #  -- Mobile ?
            if ($http_profile ~ ^[a-z0-9\"]+) {
                set $do_not_cache 1;
            }
    
            #  -- Kei-tai ?
            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 $do_not_cache 1;
            }
    
            #  -- Mobile ?
            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 $do_not_cache 1;
            }
    
            #  -- Kei-tai ?
            if ($http_user_agent ~ ^(DoCoMo/|J-PHONE/|J-EMULATOR/|Vodafone/|MOT(EMULATOR)?-|SoftBank/|[VS]emulator/|KDDI-|UP\.Browser/|emobile/|Huawei/|IAC/|Nokia|mixi-mobile-converter/)) {
                set $do_not_cache 1;
            }
    
            #  -- Kei-tai ?
            if ($http_user_agent ~ (DDIPOCKET\;|WILLCOM\;|Opera\ Mini|Opera\ Mobi|PalmOS|Windows\ CE\;|PDA\;\ SL-|PlayStation\ Portable\;|SONY/COM|Nitro|Nintendo)) {
                set $do_not_cache 1;
            }
            ### wordpress cache common settings.
            
            proxy_no_cache     $do_not_cache;
            proxy_cache_bypass $do_not_cache;
            
            proxy_pass http://$host.backend;
            proxy_cache_key $scheme://$host$request_uri;
            
            proxy_cache        cache_domain1.com;
        }
    }
    server {
        listen      80;
        listen      8080;
        server_name domain1.com www.domain1.com;
        index       index.php index.html index.htm;
        root        /var/www/html;
        access_log  /var/log/httpd/domain1.com.access.log;
        error_log   /var/log/httpd/domain1.com.error.log;

        if ($http_host = domain1.com) {
            rewrite  (.*)  http://www.domain1.com$1;
        }
        location / {
            try_files $uri $uri/ /index.php?q=$uri&$args;
            
            location ~* \.(gif|jpg|png|ico|css|js)$ {
                access_log        off;
            }
            
            location ~ /wp-admin {
                access_log     off;
                include        php_exec;
            }
            location ~ /wp-content {
                access_log     off;
                include        php_exec;
            }
            location ~ /wp-includes {
                access_log     off;
                include        php_exec;
            }
            location ~ /wp-cron.php {
                access_log     off;
                include        php_exec;
            }
            location ~ /wp-login.php {
                access_log     off;
                include        php_exec;
            }
            location ~ /wp-comments {
                access_log     off;
                include        php_exec;
            }
            
            include        php_exec;
        }
    }
}

/etc/nginx/php_execの設定例

1
2
3
4
5
6
location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

nginx http部

proxy_buffering       on;
プロキシサーバの応答のバッファリングを有効(on)、無効(off)にします。デフォルトは、有効(on)です。
バッファリングを有効(on)にした場合、高速な応答を実現するために、プロキシサーバの応答を読み込み、proxy_buffer_size、proxy_buffersによって決まったバッファエリアに格納します。
ここでは、バッファリングを有効(on)にしています。
proxy_buffer_size     8k;
プロキシサーバのレスポンス用バッファサイズ(4k or 8k)を設定します。デフォルトは、proxy_buffersの1つのバッファサイズと同じです。
ここでは、バッファサイズを8kにしています。
proxy_buffers         100 8k;
プロキシサーバの応答のバッファサイズ(4k or 8k)とその個数を設定します。デフォルトは、個数は 8 個で、バッファサイズはシステムに依存します。
ここでは、バッファサイズを8kにし、個数を100個まで持つように設定しています。
proxy_cache_path      /var/cache/nginx/domain1.com levels=1:2 keys_zone=cache_domain1.com:15m inactive=7d max_size=1000m;
キャッシュのパス、キャッシュパラメータを設定します。
キャッシュされたデータはファイルに格納されています。 プロキシされたURLのMD5ハッシュは、キャッシュエントリのキーとして使用され、応答の内容とメタデータのキャッシュのパスにファイル名としても使用されます。
レベルのパラメータは、キャッシュ内のサブディレクトリレベル数を設定します。

levels=1:2
levelは、キャッシュパスの配下のサブディレクトリの文字数を設定するものです。最大で3階層( ex. 1:2:3 )まで指定できます。
ここでは、levels=1:2と指定しています。つまり、1階層目は1文字、2階層目は2文字でサブディレクトリが作成されることを意味します。
keys_zone=cache_domain1.com:15m
keys_zoneは、キャッシュパスのゾーン名、ゾーンサイズを設定するものです。最大で3階層( ex. 1:2:3 )まで指定できます。
ここでは、ゾーン名をcache_domain1.comとし、ゾーンサイズを15MBで指定しています。ここで、メモリが15MB消費されることに注意してください。
inactive=7d
inactiveは、非アクセス時間を設定します。ここで設定した日時を越えたキャッシュ情報は、自動的に削除されます。
ここでは、7日間( 7d )を指定しています。つまり、特別に何もなければキャッシュは、一週間保存されることになります。
max_size=1000m;
max_sizeは、キャッシュのファイルサイズ(ゾーン内の全てのキャッシュファイルサイズ)の最大値を設定します。
ここでは、1000MBつまり1GBと指定しています。ここでは、zone_size と max_sizeのいずれかががサイズオーバーになった時点でキャッシュが停止します。
proxy_temp_path       /var/cache/nginx/temp; 
キャッシュのテンポラリパスを設定します。
ここでもproxy_cache_pathと同じようにlevelを追加で指定することができます。しかし、一般的には使わないことが多いようです。
proxy_connect_timeout 60;
上位サーバ(upstream server)への接続のタイムアウト(秒)を設定します。60(秒)がデフォルト値で、75(秒)以上は設定できません。
ここでは、60(秒)を設定しています。
proxy_read_timeout    90;
プロキシサーバの応答の読み取りタイムアウトを設定します。 それは、nginxへの要求に対して応答を取得するためにどれくらい待つかを決定します。 60(秒)がデフォルト値です。
ここでは、90(秒)と若干長めに設定しています。
phpの処理などで応答までの最大となる時間を設定するのが良いとされています。
proxy_send_timeout    60;
上位サーバ(upstream server)へのリクエストの転送タイムアウト(秒)を設定します。 60(秒)がデフォルト値です。
ここでは、60(秒)を設定しています。
proxy_cache_valid     200 2h;
proxy_cache_valid     302 2h;
proxy_cache_valid     301 4h;
proxy_cache_valid     any 1m;
HTTPステータスコード毎にキャッシュ時間を設定します。
ここでは、以下のように設定しています。
HTTPステータスコードキャッシュ時間
200
(OK:OK)
2時間 (2h)
302
(Moved Temporarily:一時的に移動)
2時間 (2h)
301
(Moved Permanently:恒久的に移動)
4時間 (4h)
上記以外1分 (1m)
この設定では、正常なページ応答は、2時間の間キャッシュされ、同じものが返信されることになります。
proxy_set_header Host            $http_host;
proxy_set_header X-Remote-Addr   $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
ヘッダ情報を再設定 あるいは、追加設定します。
ここでは、以下のように設定しています。
ヘッダキーPHPでの取得キー概要
Host
$_SERVER[‘HTTP_HOST’]
HTTPホスト名
X-Remote-Addr
$_SERVER[‘HTTP_X_REMOTE_ADDR’]
リモートホストIPアドレス
X-Forwarded-For
$_SERVER[‘HTTP_X_FORWARDED_FOR’]
転送元のホスト名(or IPアドレス)
ここでは、Wordpressや他のPHPスクリプトの中で、以下の情報を使っている場合は、対応が必要な場合があります。
  • $_SERVER[‘HTTP_HOST’]
    この情報は、proxy_set_headerで要求されたhttp_host名に上書きされます。
  • $_SERVER[‘REMOTE_ADDR’]
    この情報は、上書きされません。そのため、上位サーバ(upstream server)では、呼びだれた元のIPアドレス(ここでは、127.0.0.1 )となります。
    もし、あなたが、本来の意味であるアクセス要求してきたクライアントのIPアドレスを知りたいのなら、$_SERVER[‘HTTP_X_REMOTE_ADDR’]を使うべき、あるいは、$_SERVER[‘REMOTE_ADDR’]に$_SERVER[‘HTTP_X_REMOTE_ADDR’]を上書きするべきです。
upstream www.domain1.com.backend {
    ip_hash;
    server 127.0.0.1:8080;
}
上位サーバ(upstream server)を定義します。
ここでは、
ip_hash;
上位サーバ(upstream server)のIPアドレスによるハッシュテーブルを作成します。
上位サーバ(upstream server)を複数設定して接続先がたくさんある場合は、IPアドレスのCクラスをキーとしてホスト名-IPアドレスのハッシュテーブルを作成します。
上位サーバ(upstream server)が1つの場合、ほとんど意味がありません。
ここでは、今後、分散化を図る可能性があるので、ip_hash;を設定しています。
server 127.0.0.1:8080;
上位サーバ(upstream server)を設定します。
ここでは、ipアドレス:ポート番号を指定していますが、サーバー名でも可。
また、以降にweightパラメータを設定することもできます。
weightパラメータで複数のサーバーを定義し、分散するための重み付け(振り分け確率)を行うことができます。
weightパラメータ以外にも、エラーの回数を判断するためのmax_failsパラメータ、fail_timeoutパラメータなどがあります。
ここでは、現在1つのサーバーのみの設定なので、パラメータなしとなっています。

nginx server部

serverの設定では、以前の設定内容は、バックエンドである上位サーバー(upstream server)として設定しなおし (listen 80 → 8080 )、 前面のプロキシサーバーの追加設定を行っています。

proxy server部

listen       80;
TCPポート番号を設定します。デフォルトでは、80番になります。
一般的に公開するウェブサーバーなら80番を使います。
SSLの場合は、443番を使います。
server_name  domain1.com www.domain1.com;
サーバー名を設定します。
ここでは、domain1.comwww.domain1.com の2つを同時に定義しています。
access_log   /var/log/httpd/domain1.com.access.log main;
アクセスログの保存形式、保存先を設定します。
ここでは、アクセスログをログフォーマットmain の形式で、/var/log/httpd/domain1.com.access.log へ保存します。
ここでは、論理パスを使用しても良いです。その場合、論理パスのルートディレクトリは、linuxでは、/usr/share/nginx/ となります。
error_log   /var/log/httpd/domain1.com.error.log;
エラーログの保存先を設定します。
ここでは、/var/log/httpd/domain1.com.error.log へ保存します。
ここでは、論理パスを使用しても良いです。その場合、論理パスのルートディレクトリは、linuxでは、/usr/share/nginx/ となります。
if ($http_host = domain1.com) {
    rewrite  (.*)  http://www.domain1.com$1;
}
ここでは、$http_host(ホスト名)が、domain1.com(ドメイン名)のみの場合、www.domain1.com へリダイレクトします。
先のserver_nameの設定で、
domain1.comwww.domain1.comいずれも使えるように設定されています。
上記の2つのホスト名でアクセスされて違うコンテンツが表示されるのであれば良いですが、同じものが表示されるのであればSEO的に良くないので、ここでは、www.domain1.comに統一しています。
### wordpress cache common settings.
# check to do not cache
#  -- POST ?
if ($request_method = "POST") {
    set $do_not_cache 1;
}

#  -- Login or Comment or Post Editting ?
if ($http_cookie ~ ^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$) {
    set $do_not_cache 1;
}

#  -- mobile ?
if ($http_x_wap_profile ~ ^[a-z0-9\"]+) {
    set $do_not_cache 1;
}

#  -- Mobile ?
if ($http_profile ~ ^[a-z0-9\"]+) {
    set $do_not_cache 1;
}

#  -- Kei-tai ?
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 $do_not_cache 1;
}

#  -- Mobile ?
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 $do_not_cache 1;
}

#  -- Kei-tai ?
if ($http_user_agent ~ ^(DoCoMo/|J-PHONE/|J-EMULATOR/|Vodafone/|MOT(EMULATOR)?-|SoftBank/|[VS]emulator/|KDDI-|UP\.Browser/|emobile/|Huawei/|IAC/|Nokia|mixi-mobile-converter/)) {
    set $do_not_cache 1;
}

#  -- Kei-tai ?
if ($http_user_agent ~ (DDIPOCKET\;|WILLCOM\;|Opera\ Mini|Opera\ Mobi|PalmOS|Windows\ CE\;|PDA\;\ SL-|PlayStation\ Portable\;|SONY/COM|Nitro|Nintendo)) {
    set $do_not_cache 1;
}
### wordpress cache common settings.
WordPressへの対応を設定しています。
ここでは、以下の場合にキャッシュしないように$do_not_cache を設定しています。
  • post処理中の場合
  • WordPressにログイン中、コメント中、記事作成中の場合
  • 携帯およびモバイル機器からのアクセスの場合
proxy_no_cache     $do_not_cache;
proxy_cache_bypass $do_not_cache;

proxy_pass http://$host.backend;
proxy_cache_key $scheme://$host$request_uri

proxy_cache        cache_domain1.com;
proxy_no_cache     $do_not_cache;
どのような場合に応答情報をキャッシュしないかを設定します。
ブランク以降に指定するパラメータの少なくとも1つ以上の値が0でない場合は、応答情報をキャッシュしません
proxy_cache_bypass $do_not_cache;
どのような場合に応答情報をキャッシュ情報から返信しないかを設定します。
ブランク以降に指定するパラメータの少なくとも1つ以上の値が0でない場合は、キャッシュされた情報から応答を返信しません
proxy_cache_key $scheme://$host$request_uri
キャッシュするときのキー情報を設定します。
ここで設定する情報が、キャッシュ情報を読み込むときのキー情報になります。そのため、正しく設定しないと思わぬキャッシュ情報が表示されてしまうことがあります。
ここでは、$scheme://$host$request_uriと指定しています。
proxy_cache        cache_domain1.com;
キャッシュ用にゾーンの名前を設定します。
http部で設定したproxy_cache_pathのキャッシュゾーン名を指定します。
ゾーン名自体は、複数のlocationで使用することができます。

今回設定で、ほとんどの場合、この設定でもOKだと思います。
しかし、まだまだ設定できる情報も多いので、詳しい(設定できる)ディレクティブ情報は、nginxのホームページ( http://wiki.nginx.org/HttpProxyModule )を参照してください。

このリバースプロキシを導入すると(設定にもよりますが)かなり高速化が望めます。
もし、速度に不満のある方は、一度、試すのもありだと思います。その場合、WordpressのWP Super Cacheプラグインは、外してもOKだと思います。
(Nginxのキャッシュ機能だけを利用したい方は、さらに効率的、高速化が図れる Nginx のFastCGIキャッシュ(fastcgi cache )を使ってみた が参考になるかと思います。)

ここでは、さくらのVPS の最もリソースの少ない512プラン1Gプラン (無償機能UPされました) を使用しています。
さくらのVPSのお申し込みは、http://vps.sakura.ad.jp/ からどうぞ。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない検索ができないことがあります。


関連記事 :

Nginxのproxyでキャッシュを削除する方法

前回「Nginx をリバースプロキシ(キャッシュ) として使ってみた」では、 nginxをリバースプロキシサーバーとして使ってみま ...

Nginx のFastCGIキャッシュ(fastcgi cache )を使ってみた

ウェブサーバーのキャッシュ機能は、動的なページの高速化にかなり役立ちます。 例えば、Wordpressなどは覿面(てきめん)で ...

nginx でupstream timed outエラーが発生した時の対処

nginx では、以下のようなエラーが発生しました。 2013/02/18 14:30:11 [error] 8068#2316: *1 ...

ConoHa VPSイメージ

ConoHa VPS の Wordpressテンプレート を使ってみた

ConoHa VPS で、ちょっとだけ話題になっている WordPress テンプレートを使ってみました。 Wordpress ...

Wordpress Nginx proxy cache integratorというプラグインの働きは?

「Nginx をリバースプロキシ(キャッシュ) として使ってみた」では、nginxをリバースプロキシサーバーとして使ってみました。 「Ngin ...


15 件 コメントがあります。 コメントを投稿する
  1. […] […]

  2. […] […]

  3. […] […]

  4. […] […]

  5. tetuya0703
    2014年2月27日, 2:01 PM

    管理人様

    こんにちは
    HPを拝見させて頂きまして、勉強をさせて頂いています
    私は今回、
    Nginx→apache(wordpress)をそれぞれ、別サーバーで構築をしています
    Nginx,apahce(wordpress)は同一セグメントで通信が出来る状態です

    通信の流れとしては
    Internet→(80)Nginx→(80)apahce(wordpress)
    という、流れでNginxがreverse proxy且つcache サーバーとして動作させapache(wordoress)の負荷をさげてアクセスの高速化をしたいと考えています

    色々と識者の皆様が公開されている情報を参考にしながら、Nginxがreverse proxyとして動作する事は確認できたのですが、Nginxのcacheのデレクトリィーには何も情報が保存されていませんでした
    これは、Nginxがcahceサーバーとしては動作していなからだと思うのですが、認識に間違いなどがありましたらご指導をいただけませんでしょうか

    また、Nginxをcacheサーバーとして動作させるには、どの様に設定をすればよろしいでしょうか

    不躾な質問ですが、ご教授いただけますと幸いです

    よろしくお願い申し上げます。

    【/etc/nginx/nginx.conf】

    user  nginx;
    worker_processes  1;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for" "$gzip_ratio"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile        on;
        tcp_nopush      off;
    
        keepalive_timeout  65;
    
        gzip  on;
        gzip_http_version 1.0;
        gzip_types        text/plain 
                          text/xml 
                          text/css 
                          application/xml 
                          application/xhtml+xml 
                          application/rss+xml 
                          application/atom_xml 
                          application/javascript 
                          application/x-javascript 
                          application/x-httpd-php;
        gzip_disable      "MSIE [1-6]\.";
        gzip_disable      "Mozilla/4";
        gzip_comp_level   2;
        gzip_vary         on;
        gzip_proxied      any;
        gzip_buffers      4 8k;
    
        server_names_hash_bucket_size 128;    #    32/64/128
    
        include /etc/nginx/conf.d/*.conf;
    }
    

    【/etc/nginx/conf.d/proxy.conf】

    # ヘッダの設定 
    proxy_redirect                          off;
    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;
    add_header X-Cache $upstream_cache_status;
     
    # タイムアウトの設定                           
    proxy_connect_timeout 60;
    proxy_read_timeout    90;
    proxy_send_timeout    60;
     
    # バッファサイズの設定                          
    proxy_buffering  on;
    proxy_buffer_size       8k;
    proxy_buffers           100 8k;
     
    # キャッシュの設定                              
    proxy_cache_path      /var/cache/nginx/night-walker.asia levels=1:2 keys_zone=cache_night-walker.asia:15m inactive=7d max_size=512m;
    proxy_temp_path       /var/cache/nginx/temp;
     
    proxy_cache_valid     200 2h;
    proxy_cache_valid     302 2h;
    proxy_cache_valid     301 4h;
    proxy_cache_valid     any 1m;
    
    【/etc/nginx/conf.d/virtual.conf】
    upstream backend {
           ip_hash;
           server 172.16.1.5:80;
    }
     
    server {
           listen 80;
           server_name wp01.night-walker.asia;
           proxy_set_header        Host            $host;
           proxy_set_header        X-Real-IP       $remote_addr;
           proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
           access_log  /var/log/nginx/wp01.night-walker.asia/access_log  main;
           error_log  /var/log/nginx/wp01.night-walker.asia/error_log;
    
           if ($http_host = night-walker.asia) {
                rewrite  (.*)  http://wp01.night-walker.asia;
            }
    
           try_files $uri $uri/ /index.php?q=$uri&$args;
    
           location / {
                    set $do_not_cache 0;
    
                    #  -- POST or HEAD ?
                    if ($request_method != "GET") {
                        set $do_not_cache 1;
                    }
    
                    #  -- Login or Comment or Post Editting ?
                    if ($http_cookie ~ ^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$) {
                        set $do_not_cache 1;
                    }
    
                    #  -- mobile ?
                    if ($http_x_wap_profile ~ ^[a-z0-9\"]+) {
                        set $do_not_cache 1;
                    }
    
                    #  -- Mobile ?
                    if ($http_profile ~ ^[a-z0-9\"]+) {
                        set $do_not_cache 1;
                    }
    
                    #  -- Kei-tai ?
                    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 $do_not_cache 1;
                    }
    
                    #  -- Mobile ?
                    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 $do_not_cache 1;
                    }
    
                    #  -- Kei-tai ?
                    if ($http_user_agent ~ ^(DoCoMo/|J-PHONE/|J-EMULATOR/|Vodafone/|MOT(EMULATOR)?-|SoftBank/|[VS]emulator/|KDDI-|UP\.Browser/|emobile/|Huawei/|IAC/|Nokia|mixi-mobile-converter/)) {
                        set $do_not_cache 1;
                    }
    
                    #  -- Kei-tai ?
                   if ($http_user_agent ~ (DDIPOCKET\;|WILLCOM\;|Opera\ Mini|Opera\ Mobi|PalmOS|Windows\ CE\;|PDA\;\ SL-|PlayStation\ Portable\;|SONY/COM|Nitro|Nintendo)) {
                       set $do_not_cache 1;
                    }
     
                    proxy_no_cache	$do_not_cache;
                    proxy_cache_bypass	$do_not_cache;
    		resolver 127.0.0.1; 
                    proxy_pass http://$host;
                    proxy_cache_key $scheme://$host$request_uri;
           }
    }
    
  6. 管理人
    2014年2月28日, 4:03 AM

    tetuya0703 さん
    管理人です。コメントありがとうございます。

    細かく見てませんが、もっと簡単なテストから始められてはいかがでしょうか。

    せっかく2台のサーバーで分散させたいのですから、単純にキャッシュサーバーとしてnginxを使えば良いはず?なのではないかと思います。
    $do_not_cache などでキャッシュの有無など後で良いものは、全部とっぱらって、キャッシュの有無だけを確認されてはいかがでしょうか。

    で、ログにキャッシュの有無を出力させるようにしたら良いか・・・と、それである程度デバックできるんじゃないかと・・・思います。

    ログフォーマットは、こんな感じ。

    log_format rt_cache '$remote_addr - $upstream_cache_status [$time_local]  '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent"';
    

    $upstream_cache_status : HITが出ればキャッシュから読み込んだ証拠・・・だったと思います。
    詳しくは、マニュアル読むと良いでしょう。

    こんな感じでしょうでしょう。答えになっていなかったらごめんなさい。

  7. tetuya0703
    2014年3月1日, 12:07 AM

    管理人様

    こんばんは
    tetuya0703です

    ご指導、ありがとうございました
    いただいたアドバイスを元に切りわけを行いました

    最初は単純なcacheサーバーとしての動作をさせる為の設定の設定のみにして
    動作させた所、cacheのデレクトリィーにはcache情報が保存されました

    その後、順番に設定を追加していてわかったのですが、管理人様のサイトで
    wordpress用の設定で

    if ($request_method != "GET") {
                    set $do_not_cache 1;
    }
    

    という記載があるのですが
    良く、サイト情報を確認すると、説明の部分では上記の部分が

    if ($request_method = "POST") {
                    set $do_not_cache 1;
    }
    

    となっていました
    両方ともGET以外の指定だとは思うのですが、!=GETでは

    do_not_cache 1
    

    に設定されてしまい
    X-Cacheがbypassされてしまうようです

    時間があればご確認頂ければと思います

    ご教授ありがとうございました

  8. 管理人
    2014年3月1日, 4:00 AM

    tetuya0703 さん
    管理人です。コメントありがとうございます。

    if ($request_method != "GET") {
        set $do_not_cache 1;
    }
    

    if ($request_method = "POST") {
        set $do_not_cache 1;
    }
    

    も基本的に同じです。上の判定の違いについて動作確認しましたけど、いずれも 通常のファイル参照であれば、$do_not_cache に 1 がセットされることはありませんでした。

    これが違う結果が出る?ということなんですよね?

    んーーーーっ、詳しく設定を確認しないとわかりませんが、
    $request_method , $do_not_cache をログに出力してみられたらどうでしょう。

  9. tetuya0703
    2014年3月1日, 8:46 PM

    管理人様

    アドバイスありがとうございます
    logに$request_method , $do_not_cacheを出力して確認したのですが
    私の勘違いで、被疑箇所は

    #  -- Login or Comment or Post Editting ?
    if ($http_cookie ~ ^.*(çwordpress_logged_in|wp-postpass_).*$) {
        set $do_not_cache 1;
    }
    

    で$do_not_cacheに1が設定されるようです

    $http_cookieをlogに出力したところ、wp01.domain.comのwordpressをreloadするとlogには

    wp-settings-time-1=1393349537; wp-settings-1=libraryContent%3Dbrowse; comment_author_4116c94503ab7348f3be47beac224a89=test; comment_author_email_4116c94503ab7348f3be47beac224a89=mail_address
    

    となります。
    条件式としてcomment_author_から始まる場合は、cacheをbypassするようにしていますが、ホーム画面でreloadするとcomment_author_がcookieに記載されるようですが、これはwordpressのバージョンの問題なのでしょうか

    条件式からcomment_author_を外すと、$do_not_cacheは1に競ってされず、条件はスルーされます

    これはどの様に考えればよろしいでしょうか

    ご教授頂けますと助かります

    よろしくお願い申し上げます。

  10. tetuya0703
    2014年3月1日, 8:58 PM

    管理人様

    追加で確認してみました
    現状はworddpressの条件のなかで、comment_author_を削除しています
    それで、logの中では$do_not_cacheは0と記録されているのですが

    私のローカル環境から
    curl http://wp01.domain.com –head
    を実行すると

    HTTP/1.1 200 OK
    Server: nginx/1.4.5
    Date: Sat, 01 Mar 2014 11:48:42 GMT
    Content-Type: text/html; charset=UTF-8
    Connection: keep-alive
    Vary: Accept-Encoding
    X-Powered-By: PHP/5.3.3
    X-Cached: Sat, 01 Mar 2014 11:48:42 GMT
    X-Pingback: http://wp01.domain.com/xmlrpc.php
    Last-Modified: Sat, 01 Mar 2014 11:48:42 GMT
    X-Cache: BYPASS
    

    となり、”X-Cache: BYPASS”されてしまいます

    # — POST or HEAD ?
    の条件式を
    $request_method != “GET”
    から
    $request_method = “POST”
    に変更すると
    X-Cache: HIT
    になります
    $do_not_cacheは1以外であれば
    X-Cache: BYPASSされず、HITになるとおもうのですが
    これは、何か他の問題が内在しているのでしょうか

    それとも私のlogの見方が間違っているのでしょうか
    ご教授頂けますと幸いです

  11. 管理人
    2014年3月1日, 10:32 PM

    tetuya0703 さん
    管理人です。コメントありがとうございます。

    ちょっと、厳しいですね。

    WordPressの問題は、ちょっとバージョンから何からいろんな問題がありますから、まずは、最新バージョンでログインせずに、キャッシュを削除、クッキーを削除して確認されてはいかがでしょうか。

    テストをする環境がきれいにできていないと、何が問題か整理できなくなりますから、まずは、そのあたりから、一つ一つされてはいかがでしょうか。

    もう少し、ご自身で問題点を整理されてから、質問されるといろんなサイトでも皆さん回答しやすいかもです。

  12. tetuya0703
    2014年3月2日, 5:30 PM

    管理人様

    こんにちは
    ご指導ありがとうございます

    現状の自身の環境を整理してみます
    また、不明点が出たときはご指導をお願い申し上げます

  13. 管理人
    2014年3月4日, 1:49 PM

    tetuya0703 さん
    管理人です。
    コメントありがとうございます。
    またコメントください。
    お仕事なら、いつでもお引き受けしますよ。

  14. Tetuya0703
    2014年3月6日, 8:14 PM

    管理人様

    こんにちは
    tetuya0703です
    お仕事としての依頼では無くて恐縮です

    あれから、私なりに色々と環境 お調査を進めました
    まず、cookieのdo_not_cacheの件なのですがブラウザにより振る舞いが異なる事がわかりました
    firefoxのばあいはhttp request headerにcookieの情報が内包されていました
    具体的にはcomment_authoer等です
    手元にある他のブラウザー(Safari.ie)でhttp request headerを確認した所、firefoxのようなcookieのrequestは内包されていませんでした

    これは、どのブラウザーの振る舞いが正しいのでしょうか
    こじんてきにはSafari、IEの振舞いの方が正しいとおもうのですが…

    それと、nginxのcacheの有効期限なのですが、proxy_cache_valid 200 2hを1mに変更しても1mでcacheが削除されず古い情報がブラウザーに帰ってしまいます

    これは設定の問題なのでしょうか
    それともこの振る舞いがせいじょうなのでしょうか

    ご教授よろしくお願いします。

  15. 管理人
    2014年3月7日, 12:18 AM

    tetuya0703 さん
    管理人です。
    コメントありがとうございます。

    ブラウザの動作が正しいか?ですか?
    それは、ここじゃなくってブラウザのところで確認された方が間違いないと思いますよ。

    削除されずに古い情報がブラウザーに帰ってくる?ですか?
    本当にそうなら、設定でしょうね。

    ごめんなさい、質問の意図?が・・・・わかっていないようです。
    思ったとおりにキャッシュが削除されないんですよね、それは、設定が間違っているようにおもいますけど・・・。

    すみません、そのまんまのような気がして・・。


コメントを投稿 :

お名前 *

メールアドレス *
( メールアドレスが公開されることはありません。)

サイトアドレス

コメント *

* 印の項目は、入力が必要な項目です。




最近投稿の記事

[ 画像提供元 : Amazon ] 先日、1TBのディスクの入れ替え時にバックアップをとろうとディスクコピーを行いました。 その際 ...

Windows で Linux ファイルシステム Ext4 のディスクをマウントするには? Ext3Fsd が、おそらく、最も簡単なツール ...

今回は、Windows で Compass を使ってみました。 Compass とは、 Sass(サス、Syntactica ...

今回は、Anti Adblock を使ってみました。 Anti Adblock とは、 そもそも Adblock という ウェブ ...

デスクトップ環境でない サーバーで、Webページのキャプチャー画像をコマンドで撮る には、wkhtmltoimage, CutyCapt ...


さくらのVPS 全プラン リニューアルです。(石狩(北海道)も選択可)


root権限ありで ¥685 / 月 ~ と非常にリーズナブルな CPU 1(core)の 512 プランから、 最高 CPU 10(core), メモリ 32(GB), SSD容量 800(GB) までとプランが充実。
ディスクは、SSDとHDDの選択が可能になった他、データセンターは人気の東京、石狩(北海道)となりました。

また、どのプランでも好きなOSが選べます
( CentOS, Fedora, Scientific Linux, FreeBSD, Ubutu, Debian )

管理人もおすすめのVPSです。
試用期間がありますから、一度、お試しを!!

詳しくは、http://vps.sakura.ad.jp/さくらのVPSのサイトへ へどうぞ!!

カテゴリ


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。
最近、スワップにも対応した Serverman@VPS は、かなりリーズナブルかもです。

  • メモリ1GB~2GBのEntryプラン :月額:490円
  • メモリ2MB~4GBのStandardプラン :月額:980円
  • メモリ4GB~8GBのProプラン :月額:1,980円

新規申し込みで1ヶ月間完全無料となるキャンペーンを実施中です。
Serverman@VPSの特徴は、安さとIPv6対応です。また、初期設定費0円もポイントです。

IPv6でちょっと遊んでみたい方には、おすすめかもしれませんね。最低利用期間もありませんから、気に入らないときは即解約もできます。

Serverman@VPSの詳細については、 http://dream.jp/vps/ Serverman@VPSのサイトへへどうぞ。



KVM採用 ConoHa VPSは、時間単位で借りれる便利なVPSです。


ConoHa VPS は、初期設定費0円最低利用期間無し時間単位で清算可能、 さらに、Web APIを使って自動化を図ることもできる便利なVPSです。

海外サーバー設置も可能で、ローカル接続にも対応と、かなり、機能豊富なサーバーです。

新規ユーザ登録で、クーポンもらえますから、まずは、お試しですね。

ConoHa VPSの詳細については、
http://www.conoha.jp/ へどうぞ。

KVM採用 お名前.com VPS(KVM) 2G プラン 初期設定費無料 キャンペーン 実施です。


メモリ2GBプラン CPU:3core、Disk:200GB
月額:1,153円から (初期設定:1,680円0円)

さくらのVPSがリニューアルされてもなんのその。
1GBメモリ / 2Core を ¥834 – の格安価格で提供中です!
間違いなくスペックからすると割安感ありです。
年間割引時の途中解約で返金がないのは、 ちょっと残念ですが、それでもこの割安感は魅力です。

まずは、お試しですね。

お名前.com VPS(KVM)の詳細については、
http://www.onamae-server.com/vps/ へどうぞ。(お試し期間が15日あります。)



  • ソーシャルブックマーク

  • はてなブックマークへ追加するはてな登録数
ページトップへ
Time : 0.2537 [s]