безкрайно изчакване за обратен прокси в Apache

Пускам торнадо зад apache. Създадох прокси сървър.

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

Този код работи чудесно и предава всичките ми заявки на tornado и връща отговора обратно на клиента.

Сега използвам торнадо за дълго анкетиране. Някои от заявките, които завършват за кратък интервал от време, казват, че по-малко от 1 минута този обратен прокси работи добре. Но някои дълги заявки за анкетиране дават 502 прокси грешка. Причината за тази прокси грешка е, че Apache може да задържи дълга заявка за анкета само за една минута (по подразбиране). Той затваря заявката и следователно се получава прокси грешка.

Сега промених директивата на

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

т.е. промених времето за изчакване по подразбиране на 12000 секунди.

В момента това работи добре за мен. Но това не е най-доброто решение на проблема. В идеалния случай дългите заявки за анкета могат да надхвърлят определено време за изчакване. Та въпросите ми са

  1. Как да направя времето за изчакване безкрайно? т.е. заявката никога не се затваря от Apache.
  2. Моля, коментирайте също: дали производителността на tornado се влошава от преминаването през Apache като прокси сървър?

person Kunal Singh    schedule 06.06.2013    source източник
comment
Хей, отговорът ми помогна ли ти изобщо? Можете ли да коментирате отговора, моля?   -  person vaidik    schedule 05.07.2014


Отговори (1)


Имах подобен проблем с Nginx и го реших по същия начин като вас. Но промених времето за изчакване на 1 ден, тъй като беше достатъчно голямо в моя случай.

Мисля, че не можете да се откажете от това. Обосновката зад това е, че Apache (или всеки прокси сървър за този въпрос) трябва да поддържа своята производителност, което очевидно не може, ако трябва да поддържа остарели или неактивни връзки. Предпочитате да позволите на вашия прокси сървър да проксира повече активни връзки, отколкото неактивни връзки.

Следователно няма начин да изключите ProxyTimeout в Apache или дори в Nginx (конфигуриран чрез proxy_read_timeout). Така че, ако вашият прокси сървър не изпраща никакъв отговор в рамките на времето за изчакване, тогава или вашият сървър на приложения отнема твърде много време, за да отговори, или има нещо нередно с вашия сървър на приложения, или клиентът не иска никакъв отговор. В първия случай можете да направите сигурни оценки, за да зададете подходящо време за изчакване. Във втория случай трябва да коригирате вашия сървър за приложения. И в третия случай трябва елегантно да се справите със ситуацията на клиента и да се свържете отново, ако е необходимо.

Стигайки до втория ви въпрос, не би трябвало да има никаква разлика освен латентността между вашия Apache и вашия Tornado сървър. Можете много добре да изложите вашия Tornado сървър директно на света, но това ще дойде с няколко предизвикателства: 1. Повече операционна работа - уверете се, че процесът Tornado винаги работи. 2. Проксирането и балансирането на натоварването ще станат по-трудни. 3. По-лоша сигурност, тъй като ВИЕ сте написали този код вместо хиляди експертни сътрудници. Така че не трябва да мислите да стартирате този сървър като root всеки. Но все още можете безопасно да направите същото с Apache или Nginx.

Разбира се, горните проблеми са разрешими, но защо да решаваме вече решен проблем. :)

person vaidik    schedule 29.06.2014