Я работаю над поддержкой Comet для CppCMS Framework через длинные опросы XMLHttpRequest. Во многих случаях такой запрос закрывается клиентом до того, как был получен какой-либо ответ от сервера - например, страница закрыта, пользователь переходит на другую страницу или просто обновляется.
На стороне сервера я ожидаю, что получу уведомление о том, что соединение разорвано. Я протестировал приложение через 3 разъема: FastCGI, SCGI и простой HTTP Proxy.
Из 3 основных веб-серверов UNIX, Apache2, lighttpd и Nginx, закрылся только последний
соединение, как и ожидалось, позволяло моему приложению удалить запрос из очереди ожидания - это работало как для коннекторов FastCGI, так и для HTTP-прокси. (Nginx по умолчанию не имеет модуля scgi).
Другие, Apache и Lighttpd не закрывают соединение и не сообщают бэкэнду об отключении
клиенты, продолжить, как будто клиент все еще на линии. Это происходит для всех 3 поддерживаемых API: FastCGI, SCGI и HTTP Proxy.
Я открыл проблему для Lighttpd , но что
Еще больше меня удивляет тот факт, что Apache - зрелый и хорошо поддерживаемый веб-сервер как lighttpd
и не раскрывает серверную часть, на которую ушел клиент.
Вопросы:
- Это ошибка или это особенность? Есть ли причина не закрывать соединение между веб-сервером и серверной частью приложения?
- Существуют ли реальные приложения Comet, работающие за этими серверами через бэкэнды FastCGI / SCGI / HTTP-Proxy?
- Если вышеизложенное верно, как они справляются с этой проблемой? Я понимаю, что могу тайм-аутить все соединения каждые 10 секунд, но я бы хотел, чтобы они простаивали до тех пор, пока клиент слушает - потому что это позволяет легче масштабировать - каждое соединение очень дешевое - стоимость только открытого сокета.
Спасибо!