ロードバランサーの後ろにnginxサーバーがあります。ロードバランサーは、ポート80でnginxにヒットするすべてのリクエストでSSL終了を処理します。Redisを使用して全ページキャッシュに SRCache module も使用しています。キャッシュモジュールは、URLを$schemeGET$Host$request_uri
のようなキャッシュキーとして使用します。 nginxの$scheme
変数をなんとかしてオーバーライドできるので、キャッシュキースキームはhttps
ではなくhttp
になると思っていました。その方法がわかりません。可能。
私のアプリはさまざまなイベントの後にキャッシュの消去を実行し、https
を使用してキャッシュキーを生成しますが、nginxはキャッシュキーのhttp
を使用してキャッシュしています。これは、キャッシュキー名が一致しないために、キャッシュが適切にパージされないことを意味します。
これが役立つ場合の私のサイト構成は次のとおりです。
server {
listen 80;
server_name example.com example.org example.net ;
set $redirect_to_https 0;
if ( $http_x_forwarded_proto != 'https' ) {
set $redirect_to_https 1;
}
if ( $request_uri = '/health-check.php' ) {
set $redirect_to_https 0;
}
if ( $redirect_to_https = 1 ) {
return 301 https://$Host$request_uri;
}
# Uncomment the following line for domain mapping
server_name_in_redirect off;
access_log /var/log/nginx/example.com.access.log rt_cache_redis;
error_log /var/log/nginx/example.com.error.log;
root /var/www/example.com/htdocs;
index index.php index.html index.htm;
include common/redis-php7.conf;
include common/wpcommon-php7-modified.conf;
include common/locations-php7.conf;
include /var/www/example.com/conf/nginx/*.conf;
}
更新これはキャッシング構成です
# Redis NGINX CONFIGURATION
# DO NOT MODIFY, ALL CHANGES LOST AFTER UPDATE EasyEngine (ee)
set $skip_cache 0;
# POST requests and URL with a query string should always go to php
if ($request_method = POST) {
set $skip_cache 0;
}
if ($query_string != "") {
set $skip_cache 1;
}
# Don't cache URL containing the following segments
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|wp-.*.php|index.php|/feed/|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
set $skip_cache 1;
}
# Don't use the cache for logged in users or recent commenter
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}
# Use cached or actual file if they exists, Otherwise pass request to WordPress
location / {
try_files $uri $uri/ /index.php?$args;
}
location /redis-fetch {
internal ;
set $redis_key $args;
redis_pass redis;
}
location /redis-store {
internal ;
set_unescape_uri $key $arg_key ;
redis2_query set $key $echo_request_body;
redis2_query expire $key 14400;
redis2_pass redis;
}
location ~ \.php$ {
set $key "nginx-cache:$scheme$request_method$Host$request_uri";
try_files $uri =404;
srcache_fetch_skip $skip_cache;
srcache_store_skip $skip_cache;
srcache_response_cache_control off;
set_escape_uri $escaped_key $key;
srcache_fetch GET /redis-fetch $key;
srcache_store PUT /redis-store key=$escaped_key;
more_set_headers 'X-SRCache-Fetch-Status $srcache_fetch_status';
more_set_headers 'X-SRCache-Store-Status $srcache_store_status';
include fastcgi_params;
fastcgi_pass php7;
}
OK、ここに、redisルックアップに使用されているキャッシュキーが表示されます。
location ~ \.php$ {
set $key "nginx-cache:$scheme$request_method$Host$request_uri";
問題は、$scheme
がnginx(ロードバランサーから)に行われた接続を反映しているのに、キャッシュモジュールが$http_x_forwarded_proto
のスキームを使用しており、実際のスキームが使用されていることを反映していることです。
その変更を行うだけで十分です。