Apache сокеты не закрываются?
Вопрос
У меня есть веб-приложение, написанное с использованием CherryPy, которое запускается локально в 127.0.0.1:4321
. Мы используем mod-rewrite и mod-proxy, чтобы Apache действовал как обратный прокси; Apache также обрабатывает наше SSL-шифрование и может в конечном итоге использоваться для передачи всего нашего статического контента.
Все это отлично работает для небольших рабочих нагрузок. Однако недавно я использовал urllib2
для написания сценария стресс-тестирования, имитирующего рабочую нагрузку в 100 клиентов. Через некоторое время каждый клиент получает ошибку 503 от Apache, указывающую, что Apache не может подключиться к 127.0.0.1:4321
. CherryPy работает нормально, но в моем журнале ошибок Apache обнаруживаются следующие строки:
[Чт, 02 октября 12:55:44 2008] [ошибка] (OS 10048) Обычно разрешено только одно использование каждого адреса сокета (протокол / сетевой адрес / порт). : proxy: HTTP: попытка подключения к 127.0.0.1:4321 (*) не удалась
Поиск этой ошибки показывает, что Apache, вероятно, исчерпал дескрипторы файлов сокетов. Поскольку у меня работает только 100 клиентов, это означает, что соединения не закрываются ни между моим подключением urllib2
и Apache (я определенно вызываю .close ()
на возвращаемое значение urlopen
) или между Apache и CherryPy.
Я подтвердил, что мой запрос urllib2
отправляет заголовок HTTP Connection: close
, хотя Apache настроен на KeepAlive On
, если это вопросы.
В случае необходимости я использую Python 2.5, Apache 2.2, CherryPy 3.0.3, а сервер работает под управлением Windows Server 2003.
Так, каков мой следующий шаг, чтобы остановить эту проблему?
Решение
SetEnv proxy-nokeepalive 1
, скорее всего, сразу же сообщит вам, если проблема заключается в поддержании активности между Apache и CP. См. документы mod_proxy для получения дополнительной информации.
Другие советы
Вы можете запустить команду netstat и посмотреть, есть ли у вас несколько сокетов в состоянии TIME_WAIT. В зависимости от настроек MaxUserPort у вас может быть строго ограничено количество доступных для использования портов. Кроме того, TcpTimedWaitDelay обычно устанавливается на 240 секунд, поэтому любые используемые сокеты нельзя использовать повторно в течение четырех минут.
Здесь больше полезной информации - > http://smallvoid.com/article/winnt-tcpip-max-limit.html р>