Некоторый контекст о моей настройке
У меня есть докер-контейнер, который запускает apache (Apache / 2.4.25 (Debian)) на порту 80. К порту 80 контейнера можно получить доступ напрямую с хоста или из других контейнеров докера.
Симптомы
Мне не удалось должным образом изолировать проблему, и у меня не было машины, чтобы попытаться воспроизвести ее без настройки докера, поэтому у меня нет минимального примера для воспроизведения проблемы. Я могу предоставить любую информацию, которая может помочь. А пока я просто объясню, что я наблюдаю.
- Если я подключу один раз (с моего хоста или из другого контейнера докера) к apache движка, он будет работать как положено.
- Если я подожду более 5 секунд и снова подключусь, он все равно будет работать как положено.
- Если я не подожду и не попытаюсь подключиться снова, то Apache навсегда выполнит этот запрос.
Запуск netstat -pantu
сразу после первого соединения дает
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
...
tcp 0 0 172.27.0.9:80 172.27.0.1:36428 ESTABLISHED -
...
Тогда, если я не жду, пока состояние ESTABLISHED
перейдет в CLOSE_WAIT
, перед отправкой другого запроса, оно превращается в
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
...
tcp 742 0 172.27.0.9:80 172.27.0.1:36428 ESTABLISHED -
...
и остается в этом состоянии навсегда. Обратите внимание, что Recv-Q
застрял на 742, что означает, если я правильно понимаю, что apache даже не прочитал содержание запроса.
Как это происходит
Настройка в целом работает нормально. Что-то «вызывает» вышеупомянутую проблему и делает так, чтобы постоянные соединения больше не работали, пока я не перезапущу свой док-контейнер. Иногда я запускаю его, выполняя скрипт, который отправляет несколько сотен (синхронных) запросов в контейнер apache из другого контейнера докера.
Перед запуском этого скрипта я могу отправить несколько запросов в apache за короткое время без проблем. После запуска сценария я часто попадаю в состояние, в котором до перезапуска моего контейнера apache всегда выполняются последовательные запросы.
Что я могу сделать, чтобы исследовать проблему?