Nginx ters proxy'si 504 Ağ Geçidi Zaman Aşımına neden oluyor


130

Nginx'i, istekleri alan ve ardından 8001 numaralı bağlantı noktasında çalışan yukarı akış sunucusundan gerçek web uygulamasını almak için bir proxy_pass yapan bir ters proxy olarak kullanıyorum.

Mywebsite.com'a gidersem veya bir wget yaparsam, 60 saniye sonra 504 Ağ Geçidi Zaman Aşımı alıyorum ... Ancak, mywebsite.com:8001'i yüklersem, uygulama beklendiği gibi yüklenir!

Yani bir şey Nginx'in yukarı akış sunucusuyla iletişim kurmasını engelliyor.

Tüm bunlar, barındırma şirketim, eşyalarımın çalıştığı makineyi sıfırladıktan sonra başladı, bundan önce hiçbir sorun yok.

İşte vhosts sunucu bloğum:

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

Ve Nginx hata günlüğümün çıktısı:

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"

Sunucu SELinux çalıştırıyor mu?
CrackerJack9

Benim durumumda sorun, NGINX veya arka uç API'si değil, NAT ağ geçidiydi. stackoverflow.com/a/62351959/9956279
Sushilinux

Yanıtlar:


152

Muhtemelen yukarı akış için zaman aşımı süresini artırmak için birkaç satır daha ekleyebilir. Aşağıdaki örnekler zaman aşımını 300 saniyeye ayarlar:

proxy_connect_timeout       300;
proxy_send_timeout          300;
proxy_read_timeout          300;
send_timeout                300;

5
Ağınızın / hizmetinizin her zaman veya bazı durumlarda çok yavaş yanıt vereceğini bilmiyorsanız, zaman aşımını artırmanın nadiren cevap olduğunu düşünüyorum. Günümüzde az sayıda web isteği, içerik (dosyalar / resimler) indirmediğiniz sürece birkaç saniyeden fazla
sürmelidir

@Almund Ben de aynı şeyi düşündüm (neredeyse bunu denemeye zahmet etmedim), ama her ne sebeple olursa olsun bu benim için çalıştı. (Önceden 60 saniye sonra zaman aşımına uğradı, şimdi hemen yanıt alın).
Dax Fohl

@Dax Fohl: Bu çok ilginç. Kaynağı aşağı çektim ve hızlıca bir göz attım ve görebildiğim kadarıyla, proxy_pass dışında herhangi bir proxy_ ayarı yapmak, proxy'yi farklı bir şekilde çalıştıracağını varsaydığım bir dizi ayarı başlatacak, bu yüzden belki herhangi bir şeyi ayarlamak aynı şeyi verecektir. davranışı.
Almund

Problemi bir nodejs sunucusuyla kullanarak çözmedi
vpx

3
Yalnızca proxy_read_timeoutarka uçta hata ayıklarken ihtiyacım olduğunu görüyorum . Teşekkürler!
Jeff Puckett

79

Zaman aşımını artırmak sorununuzu muhtemelen çözmeyecektir, çünkü sizin de söylediğiniz gibi gerçek hedef web sunucusu gayet iyi yanıt veriyor.

Aynı sorunu yaşadım ve bağlantıda bir canlı tutma kullanmamakla ilgisi olduğunu fark ettim. Bunun nedenini gerçekten cevaplayamıyorum, ancak bağlantı başlığını temizlerken bu sorunu çözdüm ve isteğin proxy'si gayet iyi:

server {
    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_pass http://localhost:5000;
    }
}

Daha ayrıntılı olarak açıklayan bu gönderilere bir göz atın: nginx istekten sonra yukarı akış bağlantısını kapatın Canlı tutma başlığı açıklaması http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive


7
proxy_set_header Connection "";MONTHS sorun tek satır lol çözüldü , runcloud kullanmayın
nodws

22

user2540984 ve diğerleri, zaman aşımı ayarlarınızı artırmayı deneyebileceğinize işaret ettiler. Ben de buna benzer bir sorunla karşılaştım ve bu iş parçacıklarındaki hemen hemen herkesin önerdiği gibi /etc/nginx/nginx.conf dosyasındaki zaman aşımı ayarlarımı değiştirmeye çalıştım . Ancak bu bana hiç yardımcı olmadı; NGINX'in zaman aşımı ayarlarında görünür bir değişiklik yoktu. Saatler süren araştırmalardan sonra nihayet sorunumu çözmeyi başardım.

Çözüm bu forum başlığında yatıyor ve söylediği şey, zaman aşımı ayarlarınızı /etc/nginx/conf.d/timeout.conf içine koymanız gerektiğidir (ve bu dosya yoksa, onu oluşturmalısınız). Konu başlığında önerilenle aynı ayarları kullandım:

proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;

Bu sizin sorununuzun çözümü olmayabilir, ancak /etc/nginx/nginx.conf dosyasındaki zaman aşımının değiştiğini fark eden başka biri olursa , bu yanıtın yardımcı olacağını umuyorum!


merhaba config.d dizinimde timeout.conf yok. Oluştur dediniz ve sadece yukarıdaki ayarı timeout.conf'a eklemeyi onaylamak istiyorum.
tktktk0711

Evet, sadece ekleyin. Bunları kendi ihtiyaçlarınız için değiştirebilirsiniz, ancak bunlar benim için çalıştı!
Andreas Forslöw

Ne yazık ki, ubuntu ve Nginx'in bulunduğu Laravel çiftliğinde bu işe yaramıyor. :( Sadece bu satırları mı server{}yoksa başka bir şey olmadan mı eklemek istiyorsunuz ? Bu hata 5 dakika sonra ortaya çıkıyor. Yeniden yüklüyorum, yeniden başlatıyorum ve bu 5 dakika veya 300 saniyenin ötesine geçmiyor. Düzeltilecek başka fikir var mı o?
Pathros

15

Tüm sitelere zaman sınırını artırmak veya eklemek isterseniz aşağıdaki satırları nginx.confdosyaya ekleyebilirsiniz .

Aşağıdaki satırları veya dosyanın httpbölümüne ekleyin ./usr/local/etc/nginx/nginx.conf/etc/nginx/nginx.conf

fastcgi_read_timeout 600;
proxy_read_timeout 600;

Yukarıdaki satırlar confdosyada yoksa, ekleyin, aksi takdirde artırın fastcgi_read_timeoutve proxy_read_timeoutnginx ve php-fpm'nin zaman aşımına uğramadığından emin olun.

Sadece bir site için zaman sınırını artırmak için vim'de düzenleyebilirsiniz /etc/nginx/sites-available/example.com

location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
        fastcgi_pass  unix:/var/run/php5-fpm.sock;
    fastcgi_read_timeout 300; 
}

ve bu satırları ekledikten nginx.confsonra nginx'i yeniden başlatmayı unutmayın.

service php7-fpm reload 
service nginx reload

veya vale kullanıyorsanız yazmanız yeterli valet restart.


1
Teşekkürler benim için çalışıyor: fastcgi_read_timeout 600; proxy_read_timeout 600;
Alejandro

13

Ayrıca yukarı akış sunucunuz bir alan adı kullanıyorsa ve IP adresi değişirse (örneğin: yukarı akışınız bir AWS Elastic Load Balancer'ı işaret ediyorsa) bu durumla karşılaşabilirsiniz.

Sorun, nginx'in IP adresini bir kez çözmesi ve yapılandırma yeniden yüklenene kadar sonraki istekler için önbelleğe almasıdır.

Nginx'e , önbelleğe alınan girişin süresi dolduktan sonra alanı yeniden çözümlemek için bir ad sunucusu kullanmasını söyleyebilirsiniz :

location /mylocation {
    # use google dns to resolve host after IP cached expires
    resolver 8.8.8.8;
    set $upstream_endpoint http://your.backend.server/;
    proxy_pass $upstream_endpoint;
}

Proxy_pass üzerindeki dokümanlar bu numaranın neden işe yaradığını açıklıyor:

Parametre değeri değişkenler içerebilir. Bu durumda, alan adı olarak bir adres belirtilirse, ad, açıklanan sunucu grupları arasında aranır ve bulunamazsa bir çözümleyici kullanılarak belirlenir.

Şeref (tenzer.dk) "dinamik upstreams ile Nginx" ilgili olarak bu yaklaşımın bir ilişkin bazı ilgili bilgileri de içeren ayrıntılı açıklama için .


1
bu cevap altın, bana tam olarak ne oldu. upstream, aws elb'i ve ani Gateway zaman aşımını gösterir.
Nathan Do

2

Aynı sorunu yaşadım. Bunun, yukarı akış sunucusundaki iptables bağlantı izlemesinden kaynaklandığı ortaya çıktı. --state NEW,ESTABLISHED,RELATEDGüvenlik duvarı komut dosyasından kaldırıldıktan conntrack -Fve sorunla birlikte temizleme yapıldıktan sonra ortadan kalktı.


0

NGINX'in kendisi temel neden olmayabilir.

EĞER "VM örneği başına asgari portları" NAT Gateway üzerinde kümesi - senin Nginx örneği & arasında duran proxy_passhedefe - eşzamanlı istek sayısı için çok küçük, bu arttırılmalıdır.

Çözüm: NAT Ağ Geçidi üzerinde VM başına kullanılabilir bağlantı noktası sayısını artırın.

Bağlam Benim durumumda, Google Cloud'da, bir NAT Ağ Geçidi ile bir alt ağın içine bir ters proxy NGINX yerleştirildi. NGINX örneği, istekleri NAT Ağ Geçidi aracılığıyla arka uç API'mizle (yukarı akış) ilişkili bir etki alanına yönlendiriyordu.

GCP'nin bu belgeleri, NAT'ın NGINX 504 zaman aşımı ile ne kadar alakalı olduğunu anlamanıza yardımcı olacaktır.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.