Ошибка Apache / Tomcat - доставляются неправильные страницы - PullRequest
9 голосов
/ 29 октября 2008

Эта ошибка сводила меня с ума. У нас есть сервер под управлением 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.


Обновление:

Проклятье! Проблема только что вернулась. Я не видел это некоторое время, поэтому я начинал думать, что мы наконец разобрали это. Я ненавижу гейзенбагов.

Ответы [ 11 ]

0 голосов
/ 29 октября 2008

Я не эксперт, но может ли это быть странно Перевод сетевых адресов Проблема?

...