nginx gunakan cache proksi jika backend down


11

Saya perlu nginx proxy menggunakan cache jika server backend down:

ini konfigurasi saya. tapi sepertinya nginx menggunakan cache tanpa memeriksa server backend.

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

Pertanyaannya adalah bagaimana saya bisa mem-bypass cache proxy jika server backend aktif? Dan ketika server backend naik, server proxy saya tidak menggunakan cache sama sekali.


Apa sebenarnya pertanyaannya?
Jenny D

Pertanyaannya adalah bagaimana saya bisa mem-bypass cache proxy jika server backend aktif?
sweb

Satu dari solusi kotak mungkin untuk menjalankan 2 "server", satu dengan cache, satu tanpa cache, dan menggunakan modul hulu nginx.org/en/docs/http/ngx_http_upstream_module.html ? Solusi terbaik mungkin dapat menggunakan proxy_cache_bypass dengan cek apakah backend ada atau tidak ... meskipun saya tidak tahu bagaimana membuatnya bekerja ... kasus yang menarik.
SvennD

Solusi untuk masalah XY ini dapat ditemukan pada SO
Dayo

Jawaban:


8

Tampaknya duplikat ini:

/programming/16756271/how-to-configure-nginx-to-serve-cached-content-only-when-backend-is-down-5xx-re

Singkatnya, gunakan proxy_cache_use_stale

Sebagai pembaruan, saya menguji ini dan berfungsi dengan baik. Saya melakukan tes di workstation saya di mana saya miliki (untuk kelengkapan):

Fedora 23 nginx 1.8.1 dikonfigurasi sebagai terminator ssl + cache + reverse proxy Apache 2.4.18 dikonfigurasi untuk mendengarkan di port 80

Dengan apache yang bertindak sebagai upstream, hanya menyajikan file statis yang saya lakukan tes ini:

  1. Apache naik, nginx naik, mengarahkan browser ke URL proksi terbalik dilayani oleh nginx saya melihat konten proksi dari Apache. Pada titik ini, nginx menyimpannya di cache.
  2. Berhenti apache
  3. menghubungkan ke nginx saya melihat file cache seperti yang dilayani sebelumnya oleh Apache.

Konfigurasi nginx yang saya gunakan adalah (hanya bagian yang menarik):

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

Tidak berhasil sama sekali mencobanya.
sweb

Jika Anda harus melaporkan bug ke tim nginx. Apa yang kamu coba btw? Seandainya saya akan mencoba mereproduksinya
Fredi

Ok, saya melakukan tes dan itu bekerja dengan baik. Memperbarui jawaban saya dengan detail tes.
Fredi

Jadi saya membaca pertanyaan asli sweb adalah bahwa, dalam keadaan Apache dan nginx, semua permintaan harus masuk ke backend Apache. Permintaan hanya dapat dilayani dari cache NginX jika Apache turun
abhishekmukherg

@abhishekmukherg, Anda bisa melakukan apa yang Anda katakan, tapi mengapa? Ketika keduanya naik dan file-file itu statis (pikirkan jpg / css / html) mengapa pergi ke backend menggunakan lebih banyak sumber daya jaringan / cpu / ecc ketika Anda memiliki frontend aktual? BTW ini adalah masalah untuk pertanyaan lain
Fredi

0

Gunakan proxy_intercept_errors dan proxy 500s ke server yang memiliki caching diaktifkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.