そのため、Apacheをリバースプロキシとして使用して、Tomcatでホストされているsolr(検索アプリケーション)にリクエストを送信します。
Jbossでホストされている別のサーバーがあり、データをバイナリ形式でApacheに送信し、ApacheはそれをTomcatに送信してインデックスを作成し、solrデータベースに配置します。データはマルチパートPOSTリクエストとして送信されます。このプロセスには最大8時間かかる場合があります。
したがって、ここに問題があります。Apacheを介してデータを送信すると、インデックス作成の途中(データの送信部分)で約30〜40分間、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)に直接送信した場合、この問題は発生しませんでした。最初、この問題は this と同じように見えるかもしれません。
ただし、TomcatとApacheではキープアライブがオンになっていません。
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>
およびTomcatで
<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よりもタイムアウトが大きく、両方ともキープアライブがオフになっているため、Tomcatがタイムアウトを返さないのにApacheがタイムアウトを返す理由は意味がありません。
私たちはあなたと同様の問題を抱えていました。iptablesを使用してすべてのトラフィックをポート80から8080に転送することにより、Apacheを完全にバイパスしました。これが機能するかどうかはわかりません。
また、Tomcatにポート80でリッスンさせることもできます(他のサイトが80でリッスンしているかどうかはわかりません)。