Substituir o esquema $ em nginx quando por trás do balanceador de carga

4

Eu tenho um servidor nginx sentado atrás de um balanceador de carga. O balanceador de carga manipula a terminação SSL com todas as solicitações atingindo o nginx na porta 80. Também estou usando o módulo SRCache para cache de página inteira usando Redis. O módulo de armazenamento em cache usa o URL como uma chave de cache como $schemeGET$host$request_uri . Eu estava pensando que eu poderia simplesmente substituir a variável $scheme do nginx de alguma forma, então o esquema de chave do cache seria https ao invés de http . Não tenho certeza de como fazer isso ou se é mesmo possível.

Meu aplicativo faz cache de limpeza após vários eventos e gera a chave de cache usando https , mas nginx está armazenando em cache usando http na chave do cache. Isso significa que o cache não é limpo corretamente devido aos nomes das chaves de cache não correspondentes.

Aqui está a configuração do meu site, se isso ajudar:

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

UPDATE Aqui está a configuração de cache

# 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;
}
    
por kingkool68 02.01.2017 / 19:25

1 resposta

4

OK, então aqui vemos sua chave de cache que está sendo usada para pesquisas de redis:

location ~ \.php$ {
  set $key "nginx-cache:$scheme$request_method$host$request_uri";

O problema é que $scheme reflete a conexão que foi feita ao nginx (do balanceador de carga), mas o módulo de cache está usando o esquema de $http_x_forwarded_proto , que reflete o esquema real em uso.

Deve ser suficiente apenas fazer essa alteração.

    
por 02.01.2017 / 22:39