nginx-WordPress リバースプロキシにおける バッファの最適化

Webサーバー サイトの運用
nginx Reverse Proxy System
プロキシバッファの最適な設定
 
nginx で構築したリバースプロキシの下で、nginx + WordPressのブログサイトを、ドメイン別Webサーバーで3台運用しいる。稼働を開始して4か月余り、順調に稼働しているが、キャッシュのバッファーサイズは適当に設定してきたので、見直しを行ってみる。
 
「proxy_cache」が【HIT】で、「fastcgi_cache」も【HIT】のケース
 
以下、proxy_cache と fastcgi_cache のバッファーサイズを再設定した記録。
 
 

 

スポンサー リンク

 

 
 
 
 
 
1. proxy_cache と fastcgi_cache
 
proxy_cache と fastcgi_cache の位置づけ。
proxy_cache と fastcgi_cache
 
フロントエンドのリバースプロキシサーバーで、proxy_cache が機能し、バックエンドのWebサーバーで、fastcgi_cache が使われる。
 
nginxでの、キャッシュに関する設定箇所。
nginxでの、キャッシュに関する設定箇所
 
リバースプロキシサーバーでは、nginx.conf で proxy_cache に関する設定を行い、バックエンドの proxy_pass を設定する location ディレクティブで、proxy_cache の条件を設定する。
リバースプロキシでは、fastcgi_cache に関する設定は行わない
 
バックエンドのWebサーバーの nginx.conf で fastcgi_cache に関する設定を行い、location ディレクティブで、fastcgi_cache の条件を設定する。
 
 
 
2. proxy_cacheのバッファー設定
 
 
フロントエンドの「Reverse Proxy 」での、【proxy_cache】の設定。
①.「nginx.conf 」での、【proxy_cache】の設定。
②.「proxy_pass」で指定する、バックエンドのWebサーバーの【proxy_cache 条件】の設定。
 
 
①.「nginx.conf 」での、【proxy_cache】の設定。

変更前。
proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 100 8k;
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
 
変更後(黄色部分)。
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 60 32k;
proxy_busy_buffers_size 64k;
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 404 10m;
proxy_cache_valid any 1m;
 
2020.09.02:エラーが出るので、再修正(変更部分のみ記載)。
client_body_buffer_size 2m;
-----
proxy_buffer_size 64k;
proxy_buffers 100 64k;
proxy_busy_buffers_size 128k;
 
proxy_buffer_size。
バックエンドサーバーからのデータ受信に使うバッファーで、
最初の受け皿としての数値を設定する。
ワードプレスの記事やCSSなどは、20KB程度なので「32k」がちょうど良い。
画像以外はほぼこのバッファ一つで対応できる。
 
proxy_buffers。
最初の受け皿で対応できなかった場合に使うバッファー。
「100 32K」は「32Kのバッファを最大100個使う(最大3200K)」という意味で、3MBの画像(多くの画像を貼り付けているので)まで可能とした。
 
proxy_busy_buffers_size。
「proxy_buffer_size」の2倍とした。
 
proxy_cache_valid。
キャッシュを有効にするステータスコードとその有効期限を設定する。
 
 
HTTPステータスコード
200 :リクエスト成功で、要求された情報を返す。
301 :リクエストしたリソースが恒久的に移動されている時に返される。
302 :リクエストしたリソースが一時的に移動されている時に返される。
404 :Not Found/未検出 。 要求されたリソースが存在しない。
any :
 
※:有効期限を長く設定すると、記事の内容を変更した結果がなかなか反映されない。
 
 
②.「proxy_pass」で指定する、バックエンドの【proxy_cache 条件】の設定。

変更前。
location / {
    proxy_pass https://192.168.11.106;
 
    # 基本はキャッシュしない
    set $do_not_cache 1;
 

    # 画像のみキャッシュさせる
    if ($uri ~* "\.(jpg|jpeg|png|gif|css|js|ico)$") {
    set $do_not_cache 0;
    }
    proxy_no_cache $do_not_cache;

    # キャッシュの検索
    proxy_cache_bypass $do_not_cache;

    # バックエンド no-cache を無視
    proxy_ignore_headers Cache-Control;

    # キャッシュのキーゾーンを指定
    proxy_cache arakan60;

    # キャッシュの有効時間を指定
    proxy_cache_valid 200 302 60m;
    proxy_cache_valid 404 10m;

    # キャッシュのステータスヘッダーを追加
    add_header X-Cache-Status $upstream_cache_status;
}
 
変更後(全面的に見直し)。
location / {

    proxy_pass https://192.168.11.106;

    # キャッシュの制御

    # モバイル判定
    set $mobile "";
    if ($http_user_agent ~* '(Mobile|Android)') {
    set $mobile "SP";
    }

    # WordPress の管理画面にログイン、他
    set $do_not_cache "";
    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 arakan60;
    proxy_cache_key "$mobile//$scheme://$host$request_uri$is_args$args";
    proxy_cache_valid 200 301 302 2h;
    proxy_cache_valid any 10m;

    add_header X-Cache-Status $upstream_cache_status;
}
 
画像のみキャッシュさせる設定から、全てをキャッシュする設定に変更し、WordPress の管理画面にログイン、他の時のみ、キャッシュしない条件とした。
 
モバイル機器の場合、set で変数($mobile)を設定し proxy_cache_key にその変数を入れることで、キャッシュする内容をモバイルとそれ以外とで分ける事にした。
 
 
2020.09.02:再修正と外出し。
    location / {
        proxy_pass https://192.168.11.106;

    ## wordpress cache 制御 外出し設定ファイルの読み込み
    include conf.d/sotodasi/wp-cache.conf;

    proxy_cache arakan60;
    proxy_cache_valid 200 301 302 2h;
    proxy_cache_valid any 10m;

    add_header X-Cache-Status $upstream_cache_status;

    }
外出し部分。
	# キャッシュ有無フラグの初期化。
	# -- (0:キャッシュする、1:キャッシュしない)
	set $do_not_cache 0;

	# クッキーにより、ログイン中、コメント書き込み中、記事書き込み中の判断をする。
	if ($http_cookie ~ ^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$) {
		set $do_not_cache 1;
	}
	# WordPressの専用ディレクトリはキャッシュしない。
	if ($request_uri ~ "^/wp-admin/.*"){
		set $do_not_cache 1;
	}
	if ($request_uri ~ "^/wp-content/.*"){
		set $do_not_cache 1;
	}
	if ($request_uri ~ "^/wp-includes/.*"){
		set $do_not_cache 1;
	}

	# WordPressのcronはキャッシュしない。
	if ($request_uri ~ "^/wp-cron.php.*"){
		set $do_not_cache 1;
	}
	# WordPressのloginはキャッシュしない。
	if ($request_uri ~ "^/wp-login.php.*"){
		set $do_not_cache 1;
	}

	# GET要求以外はキャッシュなし。
	if ($request_method != "GET") {
		set $do_not_cache 1;
	}

	#  リバースプロキシ キャッシュの場合
	#  -- キャッシュするか否か
	proxy_no_cache          $do_not_cache;
	#  -- キャッシュを使用するか否か
	proxy_cache_bypass      $do_not_cache;
 
 
 
3. fastcgi_cacheのバッファー設定
 
 
バックエンドの「Webサーバー 」での、【fastcgi_cache】の設定。
①.「nginx.conf 」での、【fastcgi_cache】の設定。
②.location ディレクティブでの、【fastcgi_cache 条件】の設定。
 
 
①.「nginx.conf 」での、【proxy_cache】の設定。

変更無し。
proxy_buffering on;
fastcgi_buffer_size 8k;
fastcgi_buffers 100 8k;
fastcgi_temp_path /var/cache/nginx/temp 1 2;
fastcgi_connect_timeout 60;
fastcgi_read_timeout 90;
fastcgi_send_timeout 60;
fastcgi_cache_valid 200 2h;
fastcgi_cache_valid 302 2h;
fastcgi_cache_valid 301 4h;
fastcgi_cache_valid any 1m;

# fastcgi cache on arakan60.com
fastcgi_cache_path /var/cache/nginx/arakan60 levels=1:2 keys_zone=arakan60:30m max_size=512M inactive=600m;
 
2020.09.02:エラーが出るので、追記。(変更部分のみ記載)。
client_body_buffer_size 2m;
-----
 
 
②.location ディレクティブでの、【fastcgi_cache 条件】の設定。
 
変更無し。
set $do_not_cache 0;

### wordpress check to do not cache.

# -- 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;
}

fastcgi_cache arakan60;
fastcgi_cache_valid 200 60m;
fastcgi_no_cache $do_not_cache;
fastcgi_cache_bypass $do_not_cache;
add_header X-F-Cache $upstream_cache_status;
 
 
2020.09.02:再修正と外出し。
location ~ \.php$ {
	fastcgi_split_path_info ^(.+\.php)(/.+)$;

	fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
	fastcgi_index index.php;
	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
	include fastcgi_params;

	## wordpress cache 制御 外出し設定ファイルの読み込み
	include conf.d/sotodasi/wp-cache.conf;

	fastcgi_cache farakan60;
	fastcgi_cache_valid 200 60m;
	add_header X-F-Cache $upstream_cache_status;

}
外出し部分。
	# キャッシュ有無フラグの初期化。
	# -- (0:キャッシュする、1:キャッシュしない)
	set $do_not_cache 0;

	# クッキーにより、ログイン中、コメント書き込み中、記事書き込み中の判断をする。
	if ($http_cookie ~ ^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$) {
		set $do_not_cache 1;
	}
	# WordPressの専用ディレクトリはキャッシュしない。
	if ($request_uri ~ "^/wp-admin/.*"){
		set $do_not_cache 1;
	}
	if ($request_uri ~ "^/wp-content/.*"){
		set $do_not_cache 1;
	}
	if ($request_uri ~ "^/wp-includes/.*"){
		set $do_not_cache 1;
	}

	# WordPressのcronはキャッシュしない。
	if ($request_uri ~ "^/wp-cron.php.*"){
		set $do_not_cache 1;
	}
	# WordPressのloginはキャッシュしない。
	if ($request_uri ~ "^/wp-login.php.*"){
		set $do_not_cache 1;
	}

	# FastCGI キャッシュ- 存在するファイルはキャッシュしない。
	if ($request_uri ~* "\.(jpg|jpeg|gif|css|png|js|ico|xml|txt)$"){
		set $do_not_cache 1;
	}

	# GET要求以外はキャッシュなし。
	if ($request_method != "GET") {
		set $do_not_cache 1;
	}

	#  FastCGI キャッシュの場合
	#  -- キャッシュするか否か
	fastcgi_no_cache        $do_not_cache; 
	#  -- キャッシュを使用するか否か
	fastcgi_cache_bypass    $do_not_cache;
 
 
 
4. cacheが効いているか調べる
 
Google Chromeのデベロッパーツールを起動し、「Network」タブでレスポンスヘッダーを確認する。
Google Chromeのデベロッパーツールを起動し、「Network」タブでレスポンスヘッダーを確認する
 
X-Cache-Status」:proxy_cache。
X-F-Cache」:fastcgi_cache。
 
キャッシュステータスの種類と内容。
HIT:キャッシュが有り、キャッシュで応答した。
MISS:キャッシュが無かった。
BYPASS:キャッシュ無効、「返さない」になった。
EXPIRED:キャッシュは存在するが、期限切れの場合。
 
「proxy_cache」が【BYPASS】で、「fastcgi_cache」が【HIT】のケース。
「proxy_cache」が【BYPASS】で、「fastcgi_cache」が【HIT】のケース
 
「proxy_cache」が【HIT】で、「fastcgi_cache」が【EXPIRED】のケース。
「proxy_cache」が【HIT】で、「fastcgi_cache」が【EXPIRED】のケース
 
「proxy_cache」が【HIT】で、「fastcgi_cache」も【HIT】のケース。
「proxy_cache」が【HIT】で、「fastcgi_cache」も【HIT】のケース
 
 
 
5. バッファーサイズの変更結果
 
「PageSpeed Insights」でのスコアに、大きな変化は見られなかった
 
 
参考:
 
 
以上。
(2020.07.30)
 

 

スポンサー リンク

 

             

 

 

 

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください