Używam Nginx jako zwrotnego proxy, które przyjmuje żądania, a następnie wykonuje proxy_pass, aby pobrać rzeczywistą aplikację internetową z serwera nadrzędnego działającego na porcie 8001.
Jeśli przejdę do mywebsite.com lub zrobię wget, po 60 sekundach pojawia się limit czasu bramy 504 ... Jeśli jednak załaduję mywebsite.com:8001, aplikacja ładuje się zgodnie z oczekiwaniami!
Więc coś uniemożliwia Nginx komunikację z serwerem nadrzędnym.
Wszystko zaczęło się po tym, jak moja firma hostingowa zresetowała komputer, na którym działały moje rzeczy, a wcześniej nie było żadnych problemów.
Oto mój blok serwera vhosts:
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;
}
}
I dane wyjściowe z mojego dziennika błędów Nginx:
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
źródło
źródło
Odpowiedzi:
Prawdopodobnie można dodać kilka dodatkowych linii, aby wydłużyć czas oczekiwania na wysyłanie. Poniższe przykłady ustawiają limit czasu na 300 sekund:
źródło
proxy_read_timeout
podczas debugowania na zapleczu. dzięki!Zwiększenie limitu czasu prawdopodobnie nie rozwiąże problemu, ponieważ, jak powiedziałeś, rzeczywisty docelowy serwer WWW działa dobrze.
Miałem ten sam problem i stwierdziłem, że ma to związek z brakiem używania funkcji utrzymywania przy życiu w połączeniu. Właściwie nie mogę odpowiedzieć, dlaczego tak jest, ale podczas czyszczenia nagłówka połączenia rozwiązałem ten problem i żądanie zostało poprawnie przekazane przez serwer proxy:
Spójrz na te posty, które wyjaśniają to bardziej szczegółowo: nginx zamknij połączenie z nadawcą po żądaniu Wyjaśnienie nagłówka Keep-alive http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive
źródło
proxy_set_header Connection "";
lol, nie używaj runclouduser2540984 , a także wielu innych wskazało, że możesz spróbować zwiększyć ustawienia limitu czasu. Sam miałem podobny problem jak ten i próbowałem zmienić ustawienia limitu czasu w pliku /etc/nginx/nginx.conf , jak sugerują prawie wszyscy w tych wątkach. To jednak nie pomogło mi ani trochę; nie było widocznej zmiany w ustawieniach limitu czasu NGINX. Po wielu godzinach poszukiwań w końcu udało mi się rozwiązać mój problem.
Rozwiązanie znajduje się w tym wątku na forum i jest napisane, że powinieneś umieścić ustawienia limitu czasu w /etc/nginx/conf.d/timeout.conf (a jeśli ten plik nie istnieje, powinieneś go utworzyć). Użyłem tych samych ustawień co sugerowane w wątku:
To może nie być rozwiązaniem twojego konkretnego problemu, ale jeśli ktoś zauważy, że zmiana limitu czasu w /etc/nginx/nginx.conf nic nie robi, mam nadzieję, że ta odpowiedź pomoże!
źródło
server{}
czy czegoś innego? Ten błąd pojawia się zaraz po 5 minutach. Ponownie ładuję, uruchamiam ponownie i nigdy nie przekroczy tych 5 minut lub 300 sekund. Czy jest więcej pomysłów do naprawienia to?Dodaj poniższe wiersze do
http
sekcji/usr/local/etc/nginx/nginx.conf
lub/etc/nginx/nginx.conf
file.Jeśli powyższe linie nie istnieją w
conf
pliku, dodaj je, w przeciwnym razie zwiększfastcgi_read_timeout
iproxy_read_timeout
upewnij się, że nginx i php-fpm nie przekroczyły limitu czasu.a po dodaniu tych linii
nginx.conf
nie zapomnij zrestartować nginx.lub, jeśli używasz lokaja, po prostu wpisz
valet restart
.źródło
fastcgi_read_timeout 600;
proxy_read_timeout 600;
Możesz również stawić czoła tej sytuacji, jeśli twój serwer nadrzędny używa nazwy domeny, a jego adres IP zmienia się (np: twój serwer nadrzędny wskazuje na AWS Elastic Load Balancer)
Problem polega na tym, że nginx raz rozwiąże adres IP i zachowa go w pamięci podręcznej dla kolejnych żądań, dopóki konfiguracja nie zostanie ponownie załadowana.
Możesz powiedzieć nginx, aby użył serwera nazw do ponownego rozpoznania domeny po wygaśnięciu buforowanego wpisu:
Dokumentacja na proxy_pass wyjaśnia, dlaczego ta sztuczka działa:
Uznanie dla „Nginx z upstreams dynamicznych” (tenzer.dk) za szczegółowe wyjaśnienie, która zawiera również kilka istotnych informacji na zastrzeżenie tego podejścia w odniesieniu do przekazywanych URI.
źródło
Miałem ten sam problem. Okazało się, że było to spowodowane śledzeniem połączenia przez iptables na serwerze nadrzędnym. Po usunięciu
--state NEW,ESTABLISHED,RELATED
ze skryptu zapory i opróżnieniu zconntrack -F
problemem zniknął.źródło
Sam NGINX może nie być główną przyczyną.
JEŚLI „minimalna liczba portów na instancję maszyny wirtualnej” ustawiona w bramie NAT - która znajduje się między instancją NGINX a
proxy_pass
miejscem docelowym - jest zbyt mała dla liczby jednoczesnych żądań, należy ją zwiększyć.Rozwiązanie: Zwiększ dostępną liczbę portów na maszynę wirtualną w bramie NAT.
Kontekst W moim przypadku w Google Cloud odwrotny serwer proxy NGINX został umieszczony w podsieci z bramą NAT. Instancja NGINX przekierowywała żądania do domeny powiązanej z naszym zapleczem API (nadrzędnym) za pośrednictwem bramy NAT.
Ta dokumentacja z GCP pomoże Ci zrozumieć, w jaki sposób NAT jest powiązany z limitem czasu NGINX 504.
źródło
W moim przypadku ponownie uruchamiam php i wszystko jest w porządku.
źródło