У меня есть веб-приложение, написанное с использованием 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 есть такие строки:
[Thu Oct 02 12:55:44 2008] [error] (OS 10048)Only one usage of each socket address (protocol/network address/port) is normally permitted. : proxy: HTTP: attempt to connect to 127.0.0.1:4321 (*) failed
Поиск в Google для этой ошибки показывает, что в 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.
Итак, каков мой следующий шаг, чтобы решить эту проблему?






Вы можете запустить команду netstat и посмотреть, есть ли у вас несколько сокетов в состоянии TIME_WAIT. В зависимости от настроек MaxUserPort вы можете быть серьезно ограничены в количестве портов, доступных для использования. Кроме того, TcpTimedWaitDelay обычно устанавливается на 240 секунд, поэтому любые используемые сокеты не могут быть повторно использованы в течение четырех минут.
Здесь больше полезной информации -> http://smallvoid.com/article/winnt-tcpip-max-limit.html
SetEnv proxy-nokeepalive 1, вероятно, сразу же скажет вам, если проблема в поддержании активности между Apache и CP. См. mod_proxy документы для получения дополнительной информации.