[Moscow.pm] FastCGI

Sergey Skvortsov skv на protey.ru
Пн Май 26 23:10:28 PDT 2008


Anton Yuzhaninov wrote:
> On 26.05.2008 23:24, Sergey Homenkow wrote:
>>> Что в мире перла сейчас наиболее правильно использовать для написания
>>> fastcgi сервисов ?
>> Предлагаю дискуссию на тему "протокол FastCGI против HTTP".
>>
>> Последние два сервиса делал на HTTP::Daemon

Чем больше я смотрю на FastCGI, тем меньше вижу в нём смысла.

Рассмотрим связку nginx + perl-backend/fastcgi.

Что позволяет FastCGI? Ничего интересного.

1. Frontend парсит входящий запрос и преобразует его в FastCGI
2. Backend берет request и что-то с ним делает (зачастую - тупо 
преобразует в HTTP::Request).
3. Отдаёт ответ.

Всё то же самое позволяет делать просто HTTP.

Плюсы HTTP:
- нет overhead'а на преобразование HTTP -> FastCGI -> HTTP
- легко отлаживать соединения через tcpdump
- понятный log tracing
- не надо знать ещё один протокол (сколь бы ни простым он был)
- текстовые протоколы рулят!

Что могло бы быть интересным плюсом FastCGI?

- authorizer. Nginx этот режим не поддерживает - да особо и не надо.

- filters. Аналогично. Лучше задачу template system на frontend как-то 
другим образом решить (если в такой задаче вообще есть смысл)

- мультиплексирование. Мало FastCGI-managers в принципе это умеют, да и 
мало кто из программирует в расчёте на мультиплексирование.
Даже если хочется мультиплексирования (а keep-alive backend в nginx пока 
и нет), то лучше это сделать как-то более системно (ну скажем такой 
экзотический вариант: HTTP-over-BEEP).

В общем, FastCGI - это для PHP.

Вывод:
- важна скорость/изолированность: пишите свой http backend daemon (это 
просто!)
- важна функциональность: mod_perl2

imho оптимальный вариант из Engine для Catalyst сейчас - 
Catalyst-Engine-HTTP-Prefork (надо только туда добавить поддержку unix 
sockets).

Интересно было бы сравнить memory overhead для Perl-backend'а на:
- FastCFI
- HTTP::Daemon / Net::Server
- mod_perl2

Есть сильное подозрение, что разница не столь уж значительна - даже в 
сравнении с mod_perl2.

> FastCGI позволяет писать логи на фронтенде (stderr можно отправлять на фронтенд).
> 
> В случае HTTP::Daemon надо сомому реализовывать запись логов в файлы и их переоткрытие по сигналу для ротации.

Используйте Log::Log4perl - там _всё_ что надо уже есть.
В т.ч. ротацию по сигналу, watching логов.

-- 
Sergey Skvortsov
mailto: skv на protey.ru


Подробная информация о списке рассылки Moscow-pm