Beberapa konfigurasi proxy reverse nginx berhenti bekerja sekali sehari

12

Saya punya reverse-proxy nginx yang proksi permintaan dari ELB amazon luar ke ELB internal.

Saya punya 6 contoh backend yang menangani permintaan. Konfigurasi yang diaktifkan situs terlihat seperti ini, tetapi ada nomor port dan proxy_pass yang berbeda. Semuanya identik:

server {
    listen 3000;
    location / {
            proxy_pass http://internal-prod732r8-PrivateE-1GJ070M0745TT-348518554.eu-west-1.elb.amazonaws.com:3000;
            include /etc/nginx/proxy.conf;
    }

}

Sekali setiap 24 jam salah satu konfigurasi berhenti bekerja. Semua proxy lainnya berfungsi dengan baik. Jika saya me-restart nginx semua konfigurasi berfungsi kembali. Tidak ada di error.log, tidak ada yang aneh di akses log, syslog atau dmesg.

Apakah ini sesuatu yang diketahui? Apakah saya melakukan sesuatu yang salah dengan konfigurasi proxy saya? Apakah ada log lain yang bisa saya lihat?

pengguna202172
sumber

Jawaban:

22

Jawaban untuk pertanyaan ini adalah bahwa ELB terkadang mengubah alamat ip dan nginx tidak menyelesaikan nama saat mulai.

Untuk memperbaiki ini selalu ada server DNS di VPC Anda di 0,2. Jadi jika ip CIDR lokal adalah 10.0.0.0/16 server DNS berada di 10.0.0.2.

Tambahkan ini ke konfigurasi nginx.

resolver 10.0.0.2 valid=10s;

Proxy_pass juga perlu didefinisikan sebagai variabel jika tidak, nginx hanya akan menyelesaikannya sekali. Jadi berdasarkan konfigurasi di atas ini adalah konfigurasi yang benar:

server {
    listen 3000;
    location / {
            resolver 10.0.0.2 valid=10s;
            set $backend "http://internal-prod732r8-PrivateE-1GJ070M0745TT-348518554.eu-west-1.elb.amazonaws.com:3000"
            proxy_pass $backend;
            include /etc/nginx/proxy.conf;
    }
}
pengguna202172
sumber
apakah ada yang tahu versi nginx apa yang mendukung variabel dalam pengaturan proxy_pass? Saya mencoba elastis beanstalk (nginx versi 1.6.2) dan tidak mau menerima variabel, saya memasukkannya.
Stephen C
Terima kasih untuk ini, benar-benar membuat kami gila sekitar sebulan sekarang!
Jim.R
Artikel tentang blok nginx ini juga mengulangi konfigurasi ini. nginx.com/blog/dns-service-discovery-nginx-plus
Morgan Christiansson
1

Jika proxy_pass Anda tidak diteruskan langsung ke satu URL seperti contoh Anda tunjukkan ( http://amazonaws.com ), tetapi alih-alih ke proxy hulu pertanian, seperti ini:

upstream my_upstream {
 server1 127.0.0.1:1337;
 server2 127.0.0.1:1338; 
}
location / {
 proxy_pass         http://my_upstream;
}

Maka Anda tidak akan terlalu khawatir dengan salah satu upstream yang gagal sementara. Karena mereka semua akan melakukan pekerjaan yang sama. Jika seseorang gagal menjawab, maka yang berikutnya akan diproksi untuk respons itu. Ketenangan pikiran.

Nginx akan melewati mesin yang gagal selama x detik secara otomatis. Sampai Anda memperbaikinya, atau sampai kembali dengan sendirinya. ( http://wiki.nginx.org/HttpUpstreamModule )

Jadi, apa pun alasan interupsi Anda, dengan mendistribusikannya di farm upstream, ini dikonversi menjadi pengaturan yang lebih mudah.

pengguna18099
sumber
Terima kasih untuk balasan Anda! Yang aneh adalah bahwa saya dapat melakukan permintaan ke instance backend secara langsung tetapi tidak melalui nginx. Jika saya baru saja me-restart nginx permintaan diproksi lagi. Karena ini sudah dalam lingkungan produksi saya benar-benar ingin mencari tahu mengapa salah satu konfigurasi tampaknya "diturunkan" atau bagaimana saya dapat mengetahui apa yang sebenarnya dilakukan nginx di belakang layar.
user202172
Anda mungkin ingin mencari info log masuk nginx lainnya. Ini adalah masalah di mana seseorang mencoba, seperti Anda, untuk mencari tahu lebih lanjut tentang "masalah yang terputus-putus [...] Saya sedang melakukan proxy" stackoverflow.com/questions/9914792/... Dia menjelaskan cara menarik lebih banyak log yang relevan. Semoga ini bisa membantu.
user18099