nginx використовувати кеш-проксі, якщо бекенд не працює


11

Мені потрібно 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;
    }
  }
}

Питання полягає в тому, як я можу обійти проксі-кеш, якщо сервер запущений? І коли сервер сервера не працює, кеш взагалі не використовує кеш.


Яке саме питання?
Jenny D

Питання полягає в тому, як я можу обійти проксі-кеш, якщо сервер запущений?
потік

Одне з віконних рішень може бути: 2 запущених "сервери", один з кешем, один без кеш-пам’яті та використання верхнього модуля nginx.org/en/docs/http/ngx_http_upstream_module.html ? Найкращим рішенням, мабуть, буде можливість використовувати proxy_cache_bypass з перевіркою, чи є резервний сервіс чи ні ... хоча я не маю уявлення, як налагодити цю роботу ... цікавий випадок.
SvennD

Вирішення проблеми XY можна знайти в SO
Dayo

Відповіді:


8

Здається, це дублікат:

/programming/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

З апашем, що виступає як вихідний, обслуговуючи лише статичний файл, я зробив цей тест:

  1. Apache вгору, nginx вгору, вказуючи веб-переглядачу на зворотну проксі-адресу, яку обслуговує nginx, я бачу проксі-вміст від Apache. У цей момент nginx зберігає це в кеші.
  2. Зупинився апаш
  3. підключившись до nginx, я бачу кешований файл, який раніше Apache обслуговував.

Я використовував nginx config (лише цікаві частини):

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

Не працює взагалі спробуйте.
потік

У випадку, якщо ви повинні повідомити про помилку команді nginx. Що ви пробували BTW? У випадку, якщо я спробую відтворити це
Fredi

Гаразд, я зробив тест, і він працював чудово. Оновив мою відповідь деталями тесту.
Фреди

Тому моє читання оригінального питання про те, що в стані як Apache, так і nginx вгору всі запити повинні переходити до бекенда Apache. Запити потрібно подавати лише з кешу NginX, якщо iff Apache вниз
abhishekmukherg

@abhishekmukherg, ти можеш робити те, що ти кажеш, але чому? Коли обидва вгору, а файли статичні (думаю, jpg / css / html), навіщо їхати в бекенд, використовуючи більше мережевих / cpu / ecc ресурсів, коли у вас фактичний фронтменд? До речі, це питання ще одного питання
Fredi

0

Використовуйте proxy_intercept_errors та proxy 500s на сервері, який увімкнено кешування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.