Błąd Bad Gateway 502 z Apache mod proxy i Tomcat

Uruchamiamy aplikację internetową na Tomcat 6 i Apache mod_proxy 2.2.3. Widząc wiele 502 błędów takich jak ten:

Zła Bramka! Serwer proxy otrzymał nieprawidłową odpowiedź od serwera macierzystego.

Serwer proxy nie mógł obsłużyć żądania GET / the / page. do.

Powód: Błąd odczytu ze zdalnego serwera

Jeśli uważasz, że jest to błąd serwera, skontaktuj się z webmasterem.

Error 502

Tomcat ma mnóstwo wątki, więc nie jest ograniczona wątkiem. Naciskamy 2400 użytkowników za pośrednictwem JMeter na aplikację. Wszystkie skrzynki znajdują się wewnątrz naszej zapory sieciowej w szybko rozładowanej sieci, więc nie powinno być żadnych problemów z siecią.

Ktoś ma jakieś propozycje co do rzeczy do obejrzenia lub wypróbowania? Teraz jedziemy do tcpdump.

UPDATE 10/21/08: jeszcze tego nie rozgryzłem. Widząc tylko bardzo małą ich liczbę pod obciążeniem. Poniższe odpowiedzi nie dostarczyły żadnych magicznych odpowiedzi...jeszcze. :)

Author: Alex Miller, 2008-10-04

8 answers

Aby dodać jakieś konkretne ustawienia, miałem podobną konfigurację (z Apache 2.0.63 reverse proxying na Tomcat 5.0.27).

Dla niektórych adresów URL serwer Tomcat może zająć około 20 minut, aby zwrócić stronę.

Zakończyłem modyfikację następujących ustawień w pliku konfiguracyjnym Apache, aby zapobiec jego synchronizacji z działaniem serwera proxy (z dużym współczynnikiem nadmiernego rozlania na wypadek, gdyby Tomcat potrzebował więcej czasu na zwrócenie strony):

Timeout 5400
ProxyTimeout 5400

Niektóre backgound

ProxyTimeout sam nie wystarczył. Patrząc na dokumentację Timeout jestem domyślam się (nie jestem pewien), że dzieje się tak dlatego, że podczas gdy Apache czeka na odpowiedź Tomcat, nie ma ruchu między Apache a przeglądarką (lub jakimkolwiek klientem http) - i tak Apache zamyka połączenie z przeglądarką.

Odkryłem, że jeśli opuściłem domyślne ustawienie Timeout( 300 sekund), to jeśli proxied żądanie do Tomcat uzyskanie odpowiedzi zajęło więcej niż 300 sekund przeglądarka wyświetli stronę "Błąd Proxy 502". Uważam, że ta wiadomość jest generowana przez Apache, ze świadomością, że działa jako odwrotne proxy, zanim zamyka połączenie z przeglądarką(to jest moje obecne zrozumienie - może być wadliwe).

Strona błędu proxy mówi:

Błąd Proxy

Serwer proxy otrzymał nieprawidłową odpowiedź z serwera upstream. Na serwer proxy nie mógł uchwyt na Prośba o pomoc.

Powód: Błąd odczytu ze zdalnego serwera

...co sugeruje, że to ustawienie ProxyTimeout jest zbyt krótkie, podczas gdy dochodzenie pokazuje, że ustawienie Timeout Apache (timeout między Apache a klientem) również ma na to wpływ.

 39
Author: Neil Salter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-05 16:59:00

Więc, odpowiadając na własne pytanie tutaj. Ostatecznie ustaliliśmy, że widzimy błędy 502 i 503 W load balancer z powodu wyłączenia wątków Tomcat. W krótkim czasie zwiększyliśmy limit czasu. W dłuższej perspektywie naprawiliśmy problemy z aplikacją, które w pierwszej kolejności powodowały timeouty. Dlaczego timeouty Tomcat były postrzegane jako błędy 502 i 503 W load balancer, nadal pozostaje zagadką.

 13
Author: Alex Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-01 15:30:52

Możesz użyć proxy-initial-not-pooled

Zobacz http://httpd.apache.org/docs/2.2/mod/mod_proxy_http.html :

Jeśli ta zmienna jest ustawiona, żadne połączenie zbiorcze nie zostanie ponownie użyte, jeśli połączenie klienckie jest połączeniem początkowym. Pozwala to uniknąć Komunikatu o błędzie "proxy: error reading Status line from remote server" spowodowanego warunkiem wyścigu, że serwer zaplecza zamknął połączenie zbiorcze po sprawdzeniu połączenia przez proxy i przed danymi wysłanymi przez proxy dotarło do zaplecza. Należy pamiętać, że ustawienie tej zmiennej obniża wydajność, szczególnie w przypadku klientów HTTP/1.0.

My też mieliśmy ten problem. Poprawiliśmy to dodając
SetEnv proxy-nokeepalive 1
SetEnv proxy-initial-not-pooled 1

I wyłączenie keepAlive na wszystkich serwerach.

Mod_proxy_http jest w porządku w większości scenariuszy, ale uruchamiamy go z dużym obciążeniem i nadal mamy pewne problemy z czasem, których nie rozumiemy.

Ale sprawdź, czy powyższa dyrektywa pasuje do Twoich potrzeb.

 8
Author: Janning,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-23 11:24:50

Przykład z Apache conf:

#Wartość domyślna to 2 minuty.
Timeout 600
ProxyRequests off
ProxyPass /app balancer: / / MyApp stickysession=JSESSIONID lbmethod=bytraffic nofailover = On
ProxyPassReverse / app balancer: / / MyApp
ProxyTimeout 600

BalancerMember http://node1:8080/ route=node1 retry = 1 max = 25 timeout=600
.........

 3
Author: sibnick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-03 05:58:01

Zgaduję, że używasz mod_proxy_http (lub proxy balancer).

Zajrzyj do swoich dzienników tomcat (localhost.log, albo catalina.log) podejrzewam, że widzisz wyjątek w stosie internetowym bulgotający i zamykający gniazdo, do którego jest podłączony Tomcat worker.

 2
Author: Dave Cheney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-04 03:17:01

Powinieneś być w stanie rozwiązać ten problem poprzez parametr timeout i proxyTimeout ustawiony na 600 sekund. Zadziałało na mnie po dłuższej walce.

 2
Author: tallguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-06 15:17:24

Możesz uniknąć globalnych ograniczeń czasowych lub konieczności posiadania wirtualnych hostów, określając limity czasowe proxy w dyrektywie ProxyPass w następujący sposób:

ProxyPass /svc http://example.com/svc timeout=600
ProxyPassReverse /svc http://example.com/svc timeout=600

Uwaga timeout=600 sekund.

Jednak nie zawsze działa to w przypadku load balancer. W takim przypadku musisz dodać timeouty w obu miejscach (testowane w Apache 2.2.31)

Przykład Load Balancer:
<Proxy "balancer://mycluster">
     BalancerMember "http://member1:8080/svc" timeout=600
     BalancerMember "http://member2:8080/svc" timeout=600
</Proxy> 

ProxyPass /svc "balancer://mycluster" timeout=600
ProxyPassReverse /svc "balancer://mycluster" timeout=600

A side note: the timeout=600 on ProxyPass nie był wymagany, gdy Chrome był klientem (Nie wiem dlaczego), ale bez tego timeout w ProxyPass Internet Explorer (11) przerywa Resetowanie połączenia przez serwer.

Moja teoria jest taka, że:

ProxyPass timeout jest używany między Klientem (przeglądarką) a Apache.

BalancerMember timeout jest używany między Apache i backend.

Dla tych, którzy korzystają z Tomcat lub innych wspieranych możesz również zwrócić uwagę na timeouts złącza HTTP.

 2
Author: bhantol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-04 14:53:33

Najprawdopodobniej powinieneś zwiększyć parametr Timeout w Apache conf (wartość domyślna 120 sec)

 1
Author: sibnick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-02 11:16:55