Веб-приложение Tapestry на Tomcat иногда выдает мусор

У нас есть веб-приложение Tapestry-Spring-Hibernate, работающее на Tomcat 6 и обрабатывающее около 1000 запросов в секунду. Случайно, без видимой причины, страница просто отображает в браузере кучу случайных символов. Однако, когда страница обновляется, она отображается нормально. Вот скриншот источника искаженной страницы в Chrome:

Страница tomcat в Chrome

Вот что я нашел до сих пор:

  1. Кажется, это не зависит от браузера. Я был свидетелем этого в Chrome и Firefox, но пользователи также сообщали об этом в IE 7 и более поздних версиях.
  2. Нагрузка на сервер, похоже, не связана с тем, когда это происходит.
  3. При обновлении страницы страница отображается нормально, как будто ничего и не было.
  4. Я не вижу ничего важного на сервере или в журналах приложений.
  5. Тег типа контента для страницы — <meta content="text/html; charset=utf-8" http-equiv="content-type"/>.
  6. В том же контейнере развернуто еще несколько веб-приложений, одним из которых является Alfresco, но они, похоже, вообще не демонстрируют этого.

Мой вопрос в том, сталкивался ли кто-нибудь с этим раньше, и если да, то могут ли они указать мне, где я должен начать искать? Это проблема со страницей, имеющей что-то вроде неправильного типа контента, или сервер по какой-то причине не может его обработать? Или это может быть ошибка фреймворка в Tapestry или в самом приложении? Любые указатели приветствуются. На данный момент я не уверен, в чем проблема, поэтому я не был уверен, происходит ли это в ServerFault или остается здесь.


person Jeshurun    schedule 23.05.2012    source источник


Ответы (3)


Скорее всего это ошибка в приложении. (Большинство ошибок... несмотря на естественную склонность программистов обвинять кого-то другого.)

Тем не менее, может быть немного сложно отследить эту проблему. Предлагаю начать со стандартных вещей:

  • Посмотрите журналы ошибок сервера, чтобы увидеть, не появляется ли что-нибудь странное в то время, когда происходит одно из этих «событий».
  • Просмотрите журналы доступа к серверу, чтобы узнать, можете ли вы определить запрос, вызвавший ненужные данные.
  • Включите отладчик вашего браузера и посмотрите, сможете ли вы таким образом отследить неверный запрос.

Если вы сможете выяснить, на какой запрос был получен плохой ответ, у вас будет больше возможностей найти причину.


FWIW - это не похоже на проблему с кодировкой символов. Это больше похоже на двоичные или сжатые данные.

person Stephen C    schedule 23.05.2012
comment
Ваше приложение сжимает ответ? Это похоже на заархивированные данные без заголовков, чтобы сообщить браузеру, что они сжаты. Есть ли перед вашим приложением веб-сервер? - person barnyr; 23.05.2012
comment
Да, приложение сжимает ответ. И нет, у нас нет веб-сервера перед ним. Мы привыкли, но это был совершенно другой набор проблем. Я думаю, вы могли бы что-то там с заголовками gzip. начну искать там спасибо! - person Jeshurun; 23.05.2012

Вот одна ситуация, из-за которой я увидел искаженную страницу. На странице ошибки Tapestry устанавливает заголовок ответа X-Tapestry-ErrorMessage. Очевидно, что символы новой строки не разрешены в заголовках (по крайней мере, в некоторых браузерах), поэтому, если в этом заголовке есть новая строка, вы получите тарабарщину. Одно сообщение об ошибке, которое мы устанавливали, имело завершающую новую строку. Я изменил его, чтобы удалить все новые строки перед установкой этого заголовка, и тогда страница с ошибкой отобразилась правильно.

person Brian Deterling    schedule 24.05.2012

Похоже, это связано с проблемами сжатия gzip в фреймворке Tapestry (как было предложено @barnyr) и, возможно, является регрессионной ошибкой в ​​Tapestry 5.3. Процитирую Говарда из ветки списка рассылки:

Я считаю, что это была ошибка, из-за которой при определенных обстоятельствах поврежденный поток GZIP содержимого страницы передавался клиенту; это точно исправлено в 5.2.6, но я думал, что это исправлено и в 5.2.5.

Быстрое исправление состоит в том, чтобы добавить следующий символ конфигурации в метод contributeApplicationDefaults класса модуля приложения:

configuration.add(SymbolConstants.GZIP_COMPRESSION_ENABLED, "false");

Это, конечно, отключает сжатие gzip, но, возможно, стоит пойти на компромисс.

Возможно связанные проблемы:

person Jeshurun    schedule 16.06.2012
comment
Вы можете так же легко включить сжатие gzip на уровне контейнера, например. viralpatel.net/blogs/enable-gzip-compression-in-tomcat или Google для получения дополнительной информации. - person Kalle; 28.01.2013