У нас есть экземпляр apache, находящийся внутри нашей DMZ, который настроен на прокси-запросы к внутреннему экземпляру tomcat с NAT внутри нашей сети. Он работает нормально, но внезапно запросы от apache к экземпляру tomcat перестают проходить со следующим в журналах apache:
[ошибка] (70007) Указанный тайм-аут истек: ajp_ilink_receive () не может получить заголовок
Изучение средства просмотра журналов Cisco показывает следующее:
Сообщение об ошибке % ASA-6-106015: Запретить TCP (без подключения) от IP-адреса / порта к IP-адресу / флагам порта tcp_flags на интерфейсе имя_интерфейса. Пояснение Устройство адаптивной защиты отклонило пакет TCP, не связанный с подключением в таблице подключений устройства адаптивной безопасности. Устройство адаптивной защиты ищет в пакете флаг SYN, который указывает на запрос на установление нового соединения. Если флаг SYN не установлен и соединение отсутствует, устройство адаптивной защиты отклоняет пакет.
Рекомендуемое действие Не требуется, если устройство адаптивной защиты не получает большой объем этих недопустимых пакетов TCP. Если это так, проследите пакеты до источника и определите причину, по которой эти пакеты были отправлены.
Все машины виртуализированы с помощью VMware, и по умолчанию на машинах используется эмулированный сетевой адаптер Intel E1000. Наш сетевой администратор изменил это на драйвер VMXNET3 в попытке исправить проблему, нам просто нужно подождать и посмотреть, сохраняется ли проблема, поскольку это временная проблема.
Есть ли что-то еще, что могло вызвать эту проблему? Это не первый сервис, где у нас были подобные проблемы.
Наш хост apache работает под управлением Ubuntu 11.10 с версией ядра 3.0.0-17-server. У нас также была эта проблема в RHEL5 (5.8) с ядром 2.6.18-308.16.1.el5, на этой машине также есть сетевая карта E1000.
НОТА: Я не администратор сети, а архитектор программного обеспечения и программист-аналитик, отвечающий за эти системы.
Было обнаружено, что проблема заключается в том, что ASA закрывает постоянные соединения по прошествии определенного периода времени, когда он закрывает соединения, которые также были настроены так, чтобы не отправлять RST
сообщения при повторном звонке.
Чтобы понять, почему это вызывает проблему, я могу проиллюстрировать это здесь.
TimeOut
- по умолчанию 300 секундПроблема здесь усугубляется, если несколько объединенных соединений все еще открыты. Например, если Apache запущен с 5 объединенными соединениями и после закрытия вышеупомянутого, он все равно будет демонстрировать такое поведение еще 4 раза, прежде чем клиент получит успешный запрос.
Есть несколько способов преодолеть это.
RST
сообщения клиентам, которым он доверяет.mod_proxy:ProxyPass - keepalive
к On
mod_proxy:ProxyPass - ttl
на что-то меньшее, чем время сброса брандмауэра.Не пытайтесь настроить mod_proxy:ProxyPass - timeout
и mod_proxy:ProxyPass - connectiontimeout
слишком низко, как если бы у вас есть какие-либо длительные операции, существующие в вашем экземпляре tomcat, например, любые веб-службы или конечные точки ReST, тогда они могут начать отказывать, если они займут больше времени.
Наше решение - использовать оба первых варианта.