coba lagi proxy nginx saat backend mulai ulang

16

Nginx mengembalikan 502 saat backend mulai ulang. Bagaimana saya bisa membuat proxy nginx coba lagi N kali dengan penundaan M detik? Apakah ada plugin atau yang lainnya?

pengguna78416
sumber

Jawaban:

5

Saya menemukan bahwa Nginx membutuhkan waktu ~ 2 detik untuk melelahkan upaya jika Anda menentukan ratusan instance dari backend yang sama:

    server  localhost:8080 max_fails=0;
    server  localhost:8080 max_fails=0;
    server  localhost:8080 max_fails=0;
    server  localhost:8080 max_fails=0;

(.... eh, ulangi seperlunya!)

Ya, kludge yang menghebohkan - tetapi itu menambah tingkat keuletan ...

Lebih buruk dari itu, Anda bisa menggunakan:

    server  localhost:8080 max_fails=0;     
    server  localhost:80 backup;        

Dengan asumsi Nginx berjalan pada port 80, ini akan mencoba untuk terus loop permintaan di sekitar Nginx sampai localhost: 8080 merespons. Yaitu coba lagi jumlah waktu tak terbatas (?) Dengan penundaan nol detik.

Saya akan kembali ke sel empuk saya sekarang ....

dave
sumber
Bukankah pendekatan kedua akan menghasilkan loop rekursif dan membuat server crash?
Seun Osewa
@ SeunOsewa Itu sangat tergantung pada berapa lama waktu yang dibutuhkan untuk backend untuk merespon tapi ya, itu akan meluap di beberapa titik.
Oli
2

Jika instalasi nginx Anda memiliki dukungan Lua maka Anda dapat bertahan pada klien untuk beberapa waktu dengan metode tidur. Operasi ini tidak menghalangi dan tidak mengunci pekerja. Perlu diingat bahwa pengguna tidak dapat ditahan tanpa batas karena beberapa waktu habis jaringan / firewall terkait lainnya mungkin terjadi pada akhirnya.

server {
    listen 8502;
    location / {
        #25 seconds sleep
        content_by_lua_block {
             ngx.sleep(25); 
             ngx.exit(ngx.HTTP_BAD_GATEWAY);
        }
    }
}

Kemudian dalam daftar hulu Anda, Anda perlu menambahkan server di atas sebagai cadangan untuk menampung klien.

upstream backend {
    server 127.0.0.1:3001 fail_timeout=2s; #The backend
    server 127.0.0.1:8502 backup; #Lua holding server in the event backend is restarting
}

Dan ini harus dimasukkan dalam spesifikasi lokasi proksi Anda:

proxy_read_timeout         30;  #Value must be higher than sleep in Lua
proxy_next_upstream error timeout http_502 http_504;
gertas
sumber
Untuk menginstal luamodul ke nginx di ubuntu 17.04 jalankan:sudo apt-get install libnginx-mod-http-lua
Eugene Mala
1

Hal terdekat yang saya tahu adalah proyek ini , tetapi saya tidak pernah menggunakan. Saya tahu bahwa vernis telah memeriksa backend, mungkin Anda ingin melihatnya.

coredump
sumber