Поэтому мы используем apache в качестве обратного прокси для отправки запроса нашему solr (поисковому приложению), которое размещено в tomcat.
У нас есть еще один сервер, размещенный в jboss, который отправляет данные в двоичном формате в apache, который, в свою очередь, отправляет их в tomcat для индексации и помещения в базу данных solr. Данные отправляются как составной POST-запрос. Этот процесс может занять до 8 часов.
Итак, вот проблема: когда мы отправляем данные через apache, в течение примерно 30-40 минут в середине индексации (часть отправляемых данных) мы получим много ошибок прокси и плохого шлюза в jboss (отправляющая data), а в журнале 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 linux@application.com
# 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 нет.
У нас была проблема, похожая на вашу. Мы полностью обошли Apache, используя iptables для перенаправления всего трафика с порта 80 на 8080. Не уверен, сработает это для вас или нет.
Вы также можете просто настроить tomcat для прослушивания порта 80 (не уверен, есть ли у вас другие сайты, прослушивающие 80 или нет).