Saya menggunakan Nginx sebagai reverse proxy yang mengambil permintaan kemudian melakukan proxy_pass untuk mendapatkan aplikasi web sebenarnya dari server upstream yang berjalan pada port 8001.
Jika saya membuka mywebsite.com atau melakukan wget, saya mendapatkan 504 Gateway Timeout setelah 60 detik ... Namun, jika saya memuat mywebsite.com:8001, aplikasi akan dimuat seperti yang diharapkan!
Jadi ada sesuatu yang mencegah Nginx berkomunikasi dengan server upstream.
Semua ini dimulai setelah perusahaan hosting saya mengatur ulang mesin tempat barang saya berjalan, sebelum itu tidak ada masalah apa pun.
Ini blok server vhosts saya:
server {
listen 80;
server_name mywebsite.com;
root /home/user/public_html/mywebsite.com/public;
access_log /home/user/public_html/mywebsite.com/log/access.log upstreamlog;
error_log /home/user/public_html/mywebsite.com/log/error.log;
location / {
proxy_pass http://xxx.xxx.xxx.xxx:8001;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Dan output dari log kesalahan Nginx saya:
2014/06/27 13:10:58 [error] 31406#0: *1 upstream timed out (110: Connection timed out) while connecting to upstream, client: xxx.xx.xxx.xxx, server: mywebsite.com, request: "GET / HTTP/1.1", upstream: "http://xxx.xxx.xxx.xxx:8001/", host: "mywebsite.com"
nginx
reverse-proxy
proxypass
http-status-code-504
Dave Roma
sumber
sumber
Jawaban:
Mungkin dapat menambahkan beberapa baris lagi untuk menambah periode waktu tunggu ke hulu. Contoh di bawah menyetel batas waktu menjadi 300 detik:
sumber
proxy_read_timeout
saat debugging di backend. Terima kasih!Meningkatkan batas waktu kemungkinan tidak akan menyelesaikan masalah Anda karena, seperti yang Anda katakan, server web target yang sebenarnya merespons dengan baik.
Saya memiliki masalah yang sama dan saya menemukan itu ada hubungannya dengan tidak menggunakan keep-hidup pada koneksi. Saya tidak dapat benar-benar menjawab mengapa ini terjadi tetapi, dalam membersihkan tajuk koneksi saya menyelesaikan masalah ini dan permintaan itu diproksikan dengan baik:
Lihatlah posting ini yang menjelaskannya secara lebih rinci: nginx menutup koneksi upstream setelah permintaan Klarifikasi header Keep-hidup http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive
sumber
proxy_set_header Connection "";
lol, jangan gunakan runclouduser2540984 , serta banyak lainnya telah menunjukkan bahwa Anda dapat mencoba meningkatkan pengaturan waktu tunggu Anda. Saya sendiri menghadapi masalah serupa dengan yang satu ini dan mencoba mengubah pengaturan batas waktu saya di file /etc/nginx/nginx.conf , seperti yang disarankan oleh hampir semua orang di utas ini. Ini, bagaimanapun, tidak membantu saya sedikit pun; tidak ada perubahan yang jelas dalam pengaturan batas waktu NGINX. Setelah berjam-jam mencari, saya akhirnya berhasil menyelesaikan masalah saya.
Solusinya terletak pada utas forum ini , dan yang dikatakannya adalah Anda harus meletakkan pengaturan batas waktu di /etc/nginx/conf.d/timeout.conf (dan jika file ini tidak ada, Anda harus membuatnya). Saya menggunakan pengaturan yang sama seperti yang disarankan di utas:
Ini mungkin bukan solusi untuk masalah khusus Anda, tetapi jika ada orang lain yang memperhatikan bahwa perubahan batas waktu di /etc/nginx/nginx.conf tidak melakukan apa-apa, saya harap jawaban ini membantu!
sumber
server{}
atau yang lain? Kesalahan ini muncul tepat setelah 5 menit. Saya memuat ulang, memulai ulang, dan tidak pernah berhasil melewati 5 menit atau 300 detik tersebut. Adakah ide lain yang harus diperbaiki itu?Tambahkan baris di bawah ini ke
http
bagian/usr/local/etc/nginx/nginx.conf
atau/etc/nginx/nginx.conf
file.Jika baris di atas tidak ada dalam
conf
file, tambahkan, jika tidak tambahfastcgi_read_timeout
danproxy_read_timeout
pastikan bahwa nginx dan php-fpm tidak timeout.dan setelah menambahkan baris ini
nginx.conf
, jangan lupa restart nginx.atau, jika Anda menggunakan valet, cukup ketik
valet restart
.sumber
fastcgi_read_timeout 600;
proxy_read_timeout 600;
Anda juga dapat menghadapi situasi ini jika server upstream Anda menggunakan nama domain, dan alamat IP-nya berubah (misalnya: upstream Anda mengarah ke AWS Elastic Load Balancer)
Masalahnya adalah nginx akan menyelesaikan alamat IP satu kali, dan menyimpannya dalam cache untuk permintaan selanjutnya hingga konfigurasi dimuat ulang.
Anda dapat memberi tahu nginx untuk menggunakan server nama untuk menyelesaikan kembali domain setelah entri yang di-cache kedaluwarsa:
Dokumen di proxy_pass menjelaskan mengapa trik ini berhasil:
Kudos to "Nginx with dynamic upstreams" (tenzer.dk) untuk penjelasan mendetail, yang juga berisi beberapa informasi relevan tentang peringatan pendekatan ini terkait URI yang diteruskan.
sumber
Punya masalah yang sama. Ternyata itu disebabkan oleh pelacakan koneksi iptables di server upstream. Setelah menghapus
--state NEW,ESTABLISHED,RELATED
dari skrip firewall dan pembilasan denganconntrack -F
masalah itu hilang.sumber
NGINX sendiri mungkin bukan penyebab utamanya.
JIKA "port minimum per instance VM" yang disetel di Gateway NAT - yang berada di antara instance NGINX Anda &
proxy_pass
tujuan - terlalu kecil untuk jumlah permintaan serentak, itu harus ditingkatkan.Solusi: Tingkatkan jumlah port yang tersedia per VM di NAT Gateway.
Konteks Dalam kasus saya, di Google Cloud, proxy balik NGINX ditempatkan di dalam subnet, dengan Gateway NAT. Instance NGINX mengalihkan permintaan ke domain yang terkait dengan API backend kami (upstream) melalui NAT Gateway.
Dokumentasi dari GCP ini akan membantu Anda memahami relevansi NAT dengan waktu tunggu NGINX 504.
sumber
Dalam kasus saya, saya me-restart php dan itu menjadi ok.
sumber