nginx использует кеш прокси, если бэкэнд не работает

Мне нужно, чтобы прокси nginx использовал кеш, если внутренний сервер не работает:

это моя конфигурация. но похоже, что nginx использует кеш без проверки внутреннего сервера.

http {

  # ...

  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_cache_path /tmp/nginx levels=1:2 keys_zone=tmpzone:10m inactive=60m;
  proxy_cache_key "$scheme$request_method$host$request_uri";


  server {
    server_name _;

    location / {
      proxy_connect_timeout 5s;
      proxy_read_timeout 5s;
      proxy_cache tmpzone;
      proxy_cache_valid      200 304 1d;
      proxy_cache_use_stale  error timeout invalid_header updating http_500 http_502 http_503 http_504;
      proxy_set_header X-Real-IP  $remote_addr;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header Host 'www.example.com';
      proxy_pass http://www.example.com;
    }
  }
}

Вопрос в том, как я могу обойти кеш прокси, если внутренний сервер работает? это моя конфигурация. но, похоже, nginx использует кеш без проверки внутреннего сервера. http {# ... proxy_set_header Host $ host; ...

Мне нужно, чтобы прокси nginx использовал кеш, если внутренний сервер не работает:

это моя конфигурация. но похоже, что nginx использует кеш без проверки внутреннего сервера.

http {

  # ...

  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_cache_path /tmp/nginx levels=1:2 keys_zone=tmpzone:10m inactive=60m;
  proxy_cache_key "$scheme$request_method$host$request_uri";


  server {
    server_name _;

    location / {
      proxy_connect_timeout 5s;
      proxy_read_timeout 5s;
      proxy_cache tmpzone;
      proxy_cache_valid      200 304 1d;
      proxy_cache_use_stale  error timeout invalid_header updating http_500 http_502 http_503 http_504;
      proxy_set_header X-Real-IP  $remote_addr;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header Host 'www.example.com';
      proxy_pass http://www.example.com;
    }
  }
}

Вопрос в том, как я могу обойти кеш прокси, если внутренний сервер работает? это моя конфигурация. но, похоже, nginx использует кеш без проверки внутреннего сервера. http {# ... proxy_set_header Host $ host; ...

Мне нужно, чтобы прокси nginx использовал кеш, если внутренний сервер не работает:

это моя конфигурация. но похоже, что nginx использует кеш без проверки внутреннего сервера.

http {

  # ...

  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_cache_path /tmp/nginx levels=1:2 keys_zone=tmpzone:10m inactive=60m;
  proxy_cache_key "$scheme$request_method$host$request_uri";


  server {
    server_name _;

    location / {
      proxy_connect_timeout 5s;
      proxy_read_timeout 5s;
      proxy_cache tmpzone;
      proxy_cache_valid      200 304 1d;
      proxy_cache_use_stale  error timeout invalid_header updating http_500 http_502 http_503 http_504;
      proxy_set_header X-Real-IP  $remote_addr;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header Host 'www.example.com';
      proxy_pass http://www.example.com;
    }
  }
}

Вопрос в том, как я могу обойти кеш прокси, если внутренний сервер работает? А когда бэкэнд-сервер работает, мой прокси-сервер вообще не использует кеш.

11
задан 31 January 2016 в 12:23
2 ответа

Использовать proxy_intercept_errors и прокси 500 для сервера, на котором включено кэширование.

0
ответ дан 2 December 2019 в 21:54

Похоже на дубликат:

https://stackoverflow.com/questions/16756271/how-to-configure-nginx-to-serve-cached-content-only-when-backend-is-down-5xx-re

Короче говоря, используйте proxy_cache_use_stale

В качестве обновления, я протестировал это, и оно работает нормально. Я сделал тест на своей рабочей станции, где у меня есть (для полноты):

Fedora 23 nginx 1.8.1 сконфигурирован как ssl терминатор + кэш + обратный прокси Apache 2.4.18 настроен на прослушивание на порту 80

С apache, работающим как upstream, обслуживающим только статический файл я сделал этот тест:

  1. Apache up, nginx up, указывающий браузеру на обратный проксированный URL обслуживаемый nginx, я вижу проксированный контент от Apache. На данный момент Нингинкс держит это в кэше.
  2. Прекращено подключение к nginx
  3. Я вижу кэшированный файл, который ранее обслуживался Apache.

Конфигурация nginx, которую я использовал:

nginx.conf :

http {
[...]
location
    proxy_cache_path        /var/lib/nginx/tmp/proxy/ levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1g;
    include /etc/nginx/conf.d/*.conf;
}

/etc/nginx/conf.d/local.conf :

upstream localhost {
    server 127.0.0.1:80;
[...]
}


server {
    listen       127.0.0.1:443 ssl;

[...]

    location /be/ {
        proxy_pass              http://localhost;
        proxy_cache             STATIC;
        proxy_cache_valid       200 1d;
        proxy_cache_use_stale   error;
}
8
ответ дан 2 December 2019 в 21:54

Теги

Похожие вопросы