Эта ошибка сводила меня с ума. У нас есть сервер под управлением Apache и Tomcat, обслуживающий несколько разных сайтов. Обычно сервер работает нормально, но иногда возникает ошибка, когда людям предоставляется неправильная страница - страница, которую кто-то другой запросил!
Улика:
- Доставляются те страницы, которые недавно запрошен другим пользователем, и в противном случае они доставляются правильно. Известно, что два одновременных запроса меняются местами. Насколько я могу судить, ни одна из неправильно доставленных страниц не старше нескольких минут.
- Влияет только на файлы, которые обслуживает Tomcat. Статические файлы, такие как изображения, не затрагиваются.
- Это не происходит постоянно. Когда это случается, это случается для всех.
- Кажется, это происходит во времена пикового спроса. Тем не менее, спрос еще не очень высок - он, безусловно, находится в пределах того, с чем может справиться Apache.
- Перезапуск Tomcat исправил это, но только на несколько минут. Перезапуск Apache исправил это, но только на несколько минут.
- Сервер работает под управлением Apache 2 и Tomcat 6, используя виртуальную машину Java 6 в Gentoo. Соединение с AJP13, и директивы
JkMount
в пределах блоков <VirtualHost>
являются правильными.
- Нет ничего полезного ни в одном из файлов журнала.
Дополнительная информация:
В Apache не включена ни одна форма кэширования. Все записи, связанные с кэшированием в httpd.conf и связанных импорте, говорят, например:
<IfDefine CACHE>
LoadModule cache_module modules/mod_cache.so
</IfDefine>
Хотя параметры для Apache не включают этот флаг:
APACHE2_OPTS="-D DEFAULT_VHOST -D INFO -D LANGUAGE -D SSL -D SSL_DEFAULT_VHOST -D PHP5 -D JK"
Tomcat также не имеет включенных опций кэширования, которые я могу найти.
предложение инструментария было хорошим, но в данном случае неуместным. Что заставляет меня верить, что ошибка не может быть в моем собственном коде, так это то, что передаются не просто несколько значений, а весь запрос, включая URL-адрес, параметры, сеансовые куки-файлы и все такое. Люди возвращаются к страницам с надписью «Вы вошли как Джон», когда они явно нет.
Обновление:
Исходя из предложений нескольких людей, я собираюсь добавить следующие заголовки HTTP на страницы, обслуживаемые Tomcat, чтобы отключить все формы кэширования:
Cache-Control: no-store
Vary: *
Надеюсь, эти заголовки будут уважаться не только Apache, но и любыми другими кешами или прокси, которые могут быть на пути. К сожалению, у меня нет возможности преднамеренно воспроизвести эту ошибку, поэтому мне просто придется подождать и посмотреть, не появится ли она снова.
Я заметил, что включены следующие заголовки - могут ли они быть связаны каким-либо образом?
Connection: Keep-Alive
Keep-Alive: timeout=5, max=66
Обновление:
Очевидно, это случилось снова, когда я спал, но теперь это прекратилось, и я не сплю, чтобы увидеть это. Опять же, нет ничего полезного в журналах, которые я вижу, поэтому у меня нет никаких подсказок о том, что на самом деле происходило или как это предотвратить.
Есть ли какая-либо дополнительная информация, которую я могу поместить в журналы Apache или Tomcat, чтобы упростить диагностику?
Обновление:
С тех пор, как это повторилось пару раз, мы изменили способ подключения Apache к Tomcat, чтобы увидеть, влияет ли он на вещи. Мы использовали mod_jk
с такой директивой:
JkMount /portal ajp13
Мы перешли на использование mod_proxy_ajp
, вот так:
ProxyPass /portal ajp://localhost:8009/portal
Посмотрим, будет ли это иметь значение. Эта ошибка всегда была неожиданно непредсказуемой, поэтому мы никогда не сможем однозначно сказать, сработала она или нет.
Обновление:
Мы только что получили короткую ошибку на сайте, который был оставлен с использованием mod_jk
, в то время как дочерний сайт на том же сервере с использованием mod_proxy_ajp
не показывал ошибку. Это ничего не доказывает, но предоставляет доказательства того, что подмена на mod_proxy_ajp
, возможно, помогла.
Обновление:
Мы только что получили ошибку вчера вечером на сайте, используя mod_proxy_ajp
, настолько ясно, что это не решило - mod_jk
не было источником проблемы. Я собираюсь попробовать анонимное предложение отключить постоянные соединения:
KeepAlive Off
Если и это не поможет, я буду достаточно отчаянным, чтобы начать исследование GlassFish.
Обновление:
Проклятье! Проблема только что вернулась. Я не видел это некоторое время, поэтому я начинал думать, что мы наконец разобрали это. Я ненавижу гейзенбагов.