Apache2 + Tomcat: Получение запроса через apache2 приводит к тайм-ауту и ​​ошибке прокси

Apache2 + Tomcat: Получение запроса через apache2 приводит к тайм-ауту и ​​ошибке прокси

Поэтому мы используем Apache в качестве обратного прокси-сервера для отправки запросов в наше приложение Solr (поисковое приложение), размещенное в Tomcat.

У нас есть еще один сервер, размещенный в jboss, который отправляет данные в двоичном формате в apache, который в свою очередь отправляет их в tomcat для индексации и помещения в базу данных solr. Данные отправляются как многокомпонентный POST-запрос. Этот процесс может занять до 8 часов.

Итак, вот в чем проблема: когда мы отправляем данные через Apache, в течение примерно 30-40 минут в середине индексации (часть отправки данных) мы получим много ошибок proxy и bad gateway в jboss (тот, который отправляет данные), а в журнале tomcat будет сказано, что полученные данные имеют недопустимый EOF. Поэтому очевидно, что данные не отправляются должным образом. И если мы посмотрим на журналы Apache, там будет много таких ошибок:

[Wed Jan 08 16:10:45 2014] [error] [client 10.60.6.6] (70007)The timeout specified has expired: proxy: error reading status line from remote server localhost:8080
[Wed Jan 08 16:10:45 2014] [error] [client 10.60.6.6] proxy: Error reading from remote server returned by /application-path/application-url

и эта ошибка:

[Mon Jan 13 11:38:49 2014] [error] (103)Software caused connection abort: proxy: pass request body failed to [::1]:8080 (localhost)
[Mon Jan 13 11:38:49 2014] [error] proxy: pass request body failed to [::1]:8080 (localhost) from 10.3.40.76 ()

Странно, что если мы обойдём apache (:80) и отправим данные напрямую tomcat (:8080), мы никогда не столкнёмся с этой проблемой. Сначала эта проблема может выглядеть так же, какэтот.

Но у tomcat и apache функция keep-alive не включена.

Timeout 120
KeepAlive Off

<VirtualHost *:80>
  ServerName application.com
  ServerAlias x.application.com
  DocumentRoot /var/www/something/
  ServerAdmin [email protected]

  # Possible values include: debug, info, notice, warn, error, crit,
  # alert, emerg.
  LogLevel warn
  LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" \"%{soapAction}i\"" logging
  CustomLog /log/httpd/access.log logging
  ErrorLog /log/httpd/error.log

  ServerSignature On

  RewriteEngine On
  RewriteLogLevel 2

  # ensure that Tomcat sees the original host and port (and not the proxy-host and -port)
  ProxyPreserveHost On

  # Rewrite Rules 
  RewriteRule ^/application-path/(.*) http://localhost:8080/application-path/$1 [P]
</VirtualHost>

и в коте

<Connector connectionTimeout="10000" port="8080" protocol="HTTP/1.1"
redirectPort="8443" maxThreads="1000" processorCache="1000" maxKeepAliveRequests="1"
keepAliveTimeout="10" socket.soReuseAddress="true" socket.soKeepAlive="true"
compression="on" compressionMinSize="10"
compressableMimeType="text/html,text/xml,text/plain,application/javascript,application/json,text/javascript,text/css"
socket.soLingerOn="false" socket.soLingerTime="0" URIEncoding="UTF-8" />

И для тех, кто задается вопросом, да, у Apache тайм-аут больше, чем у Tomcat, и у обоих отключена функция keep-alive, поэтому неясно, почему Apache возвращает тайм-аут, а Tomcat — нет.

решение1

У нас была похожая проблема. Мы полностью обошли Apache, используя iptables для перенаправления всего трафика с порта 80 на 8080. Не уверен, сработает ли это у вас или нет.

Вы также можете просто настроить tomcat на прослушивание порта 80. (Не уверен, прослушивают ли другие сайты порт 80 или нет.)

Связанный контент