Имеется сервер lighttpd-1.4.32, который был установлен вместо apache.Стоит на системе freebsd 9.1, обслуживает в среднем 70 запросов в секунду, используется для отдачи статики, запуска cgi-скриптов через mod_cgi, запуска php-скриптов через mod_fastcgi + php_fpm.
Иногда при запросе к серверу (который обрабатывает mod_cgi или mod_fastcgi) происходит обрыв соединения — браузер firefox пишет «Соединение было сброшено», firebug пишет «Статус: aborted», chrome пишет «Ошибка 101 (net::ERR_CONNECTION_RESET): Соединение сброшено».
Это происходит на разных клиентских компьютерах.Ошибку не получается воспроизвести специально: проще всего её увидеть в самообновляющихся страницах внутри фреймов, которые есть на сайте: если загрузить страницу, и смотреть на самообновляюшиеся фреймы (которые обновляются раз в 20-30 секунд), то в течение примерно 10 минут обязательно соединение сбросится в какой-то момент времени. Специально запросить страницу каким-либо образом, чтобы 100% сгенерировать ошибку - не получилось.
Если рядом включить сервер apache например на 81-м порту, настроенный для отдачи того же контента, что и lighttpd, соединения с браузера к apache ни разу не сбрасываются, то есть при работе apache ошибок нет.
На тестовом сервере lighttpd, без нагрузки, тоже не получилось воспроизвести ошибку.В логах lighttpd нет ничего — в error.log пустота, в access.log — только успешно отданные страницы с «200 OK», то есть, сброшенный запрос скорее всего не доходит до логов сервера.
Вывод: наверняка при отправке запроса на сервер lighttpd соединение где-то и кем-то иногда почему-то сбрасывается, но в какой момент и кем — мистика, не понятно. Не придумал, как это вообще возможно отследить.
На apache все работает.
Lighttpd настроен вроде бы стандартно, пытался немного играться с параметрами — например, выключить Keep-alive соединения, не помогло.Может быть кто сталкивался с такой проблемой, или может подсказать, куда рыть, буду благодарен.
Если нужны конфиги — сообщайте какие, сброшу.
Добавлю еще уточнениеНа сервере нагрузки нет, load average все время меньше 1, процессор почти весь свободен (>90%), памяти оперативной хватает, в своп не залазит. При выключенном keep-alive lighttpd обрабатывает максимум 10-30 одновременных запросов, в статусе именно обработки вообще редко больше одного одновременно. Остальные читает запрос или отдаёт ответ. При том что настроен на обработку одновременно более 1000 соединений (про запас).
> Добавлю еще уточнение
> На сервере нагрузки нет, load average все время меньше 1, процессор почти
> весь свободен (>90%), памяти оперативной хватает, в своп не залазит. При
> выключенном keep-alive lighttpd обрабатывает максимум 10-30 одновременных запросов,
> в статусе именно обработки вообще редко больше одного одновременно. Остальные читает
> запрос или отдаёт ответ. При том что настроен на обработку одновременно
> более 1000 соединений (про запас).сравните tcpdump на сервере и клиенте
промежуточные узлы?
Запустил tcpdump на сервере. Если я правильно в нём разобрался, у сбршенных коннектов на сервере в tcpdump-е наблюдаю http-запрос, а http-ответа уже нет.
Так же в error.log у lighttpd появилось много строчек типа
2013-06-21 19:00:04: (connections.c.137) (warning) close: 27 Connection reset by peerНо похоже вариант решения проблемы нашелся.
Все глюки проявлялись, когда KeepAlive соединения в lighttpd были выключены, либо были сконфигурированы по умолчанию:
server.max-keep-alive-requests = 16
server.max-keep-alive-idle = 5Я изменил значения на:
server.max-keep-alive-requests = 100
server.max-keep-alive-idle = 20после этого глюки вроде бы пропали
Но послежу ещё побольше времени, чтобы быть точно уверенным