
Daher verwenden wir Apache als Reverse-Proxy, um Anfragen an unser Solr (Suchanwendung) zu senden, das in Tomcat gehostet wird.
Wir haben einen weiteren Server, der in JBoss gehostet wird und Daten im Binärformat an Apache sendet, der sie wiederum an Tomcat sendet, wo sie indiziert und in die Solr-Datenbank eingefügt werden. Die Daten werden als mehrteilige POST-Anfrage gesendet. Dieser Vorgang kann bis zu 8 Stunden dauern.
Hier ist also das Problem: Wenn wir die Daten über Apache senden, erhalten wir etwa 30–40 Minuten lang während der Indizierung (dem Teil, in dem die Daten gesendet werden) viele Proxy- und Bad-Gateway-Fehler im JBoss (der die Daten sendet) und im Tomcat-Protokoll wird angezeigt, dass die empfangenen Daten ein ungültiges EOF haben. Es ist also offensichtlich, dass die Daten nicht richtig gesendet wurden. Und wenn wir uns die Apache-Protokolle ansehen, gibt es viele dieser Fehler:
[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
und dieser Fehler:
[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 ()
Das Seltsame ist, dass wir dieses Problem nie hatten, wenn wir Apache (:80) umgehen und die Daten direkt an Tomcat (:8080) senden. Auf den ersten Blick sieht dieses Problem vielleicht so aus wieDas.
Aber bei Tomcat und Apache ist Keep-Alive nicht aktiviert.
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>
und in Kater
<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" />
Und für alle, die sich das fragen: Ja, Apache hat ein längeres Timeout als Tomcat, und bei beiden ist Keep-Alive deaktiviert. Es macht also keinen Sinn, warum Apache ein Timeout zurückgibt, wenn Tomcat das nicht tut.
Antwort1
Wir hatten ein ähnliches Problem wie Sie. Wir haben Apache vollständig umgangen, indem wir iptables verwendet haben, um den gesamten Datenverkehr von Port 80 an 8080 weiterzuleiten. Ich bin nicht sicher, ob das bei Ihnen funktioniert oder nicht.
Sie können Tomcat auch einfach auf Port 80 lauschen lassen. (Ich bin nicht sicher, ob andere Sites auf 80 lauschen oder nicht.)