2013-06-06 9 views
8

Używam tornada za apache. Stworzyłem serwer proxy.nieskończony limit czasu dla odwrotnego proxy w Apache

ProxyRequests On 
ProxyPass /chat/ http://localhost:8888/chat/ 

Ten kod działa doskonale i przekazuje wszystkie moje prośby do tornada i zwraca odpowiedź z powrotem do klienta.

Teraz używam tornada do długiego głosowania. Niektóre żądania, które kończą się w krótkim odstępie czasu, powiedzą mniej niż 1 minuta tego odwrotnego proxy działa dobrze. Ale niektóre długie żądania pollingu powodują 502 błąd serwera proxy. Powodem tego błędu serwera proxy jest to, że Apache może przechowywać długie żądanie pollingu przez minutę (domyślnie). Zamyka żądanie, a zatem otrzymuje błąd serwera proxy.

Teraz zmieniła dyrektywę do

ProxyRequests On 
ProxyPass /chat/ http://localhost:8888/chat/ timeout=12000 

t j zmieniłem domyślny czas do 12000 sekund.

To obecnie działa dobrze dla mnie. Bu nie jest to najlepsze rozwiązanie tego problemu. Idealnie długie żądania pollingu mogą przekroczyć określony limit czasu. Więc moje pytania są

  1. Jak ustawić limit czasu nieskończoności? tzn. prośba nie jest nigdy zamknięta przez Apache.
  2. Proszę również skomentować: czy wydajność tornada jest obniżana przez przechodzenie przez serwer Apache jako serwer proxy?
+0

Hej, czy moja odpowiedź w ogóle Ci pomogła? Czy możesz skomentować odpowiedź? – vaidik

Odpowiedz

1

Doświadczyłem podobnego problemu z Nginx i rozwiązałem go w taki sam sposób jak Ty. Ale zmieniłem limit czasu na 1 dzień, ponieważ był wystarczająco duży w moim przypadku.

Myślę, że nie można tego znieść. Uzasadnieniem tego jest to, że Apache (lub jakikolwiek serwer proxy w tej kwestii) musi utrzymywać swoją wydajność, której wyraźnie nie może, jeśli musi utrzymywać nieaktualne lub nieaktywne połączenia. Wolisz, aby serwer proxy był bardziej aktywny niż połączenia nieaktywne.

Dlatego nie ma możliwości wyłączenia ProxyTimeout w Apache lub nawet w Nginx (skonfigurowane za pomocą proxy_read_timeout). Jeśli serwer proxy nie wysyła odpowiedzi w określonym limicie czasu, oznacza to, że serwer aplikacji zabiera zbyt dużo czasu na odpowiedź lub coś jest nie tak z serwerem aplikacji lub klient nie żąda żadnej odpowiedzi. W pierwszym przypadku możesz wykonać bezpieczne prognozy, aby ustawić odpowiedni limit czasu. W drugim przypadku musisz naprawić swój serwer aplikacji. W trzecim przypadku musisz z wdziękiem obsłużyć sytuację na kliencie i ponownie nawiązać połączenie w razie potrzeby.

Przechodząc do drugiego pytania, nie powinna być żadnej różnicy poza opóźnieniem związanym z serwerem Apache i serwerem Tornado. Możesz bardzo dobrze wystawić swój serwer Tornado bezpośrednio na świat, ale będzie to oznaczało kilka wyzwań: 1. Więcej pracy ops - upewnij się, że proces Tornado jest zawsze uruchomiony. 2. Proxying i równoważenie obciążenia staną się trudniejsze. 3. Gorsze bezpieczeństwo, ponieważ napisałeś ten kod zamiast tysięcy ekspertów. Nie powinieneś więc myśleć o uruchamianiu tego serwera jako root. Ale nadal możesz bezpiecznie robić to samo z Apache lub Nginx.

Oczywiście powyższe problemy można rozwiązać, ale dlaczego rozwiązać już rozwiązany problem. :)