В постоянном HTTP-соединении Apache не обрабатывает запросы, отличные от первого - PullRequest
0 голосов
/ 21 января 2019

Некоторый контекст о моей настройке

У меня есть докер-контейнер, который запускает 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 всегда выполняются последовательные запросы.

Что я могу сделать, чтобы исследовать проблему?

...