web-dev-qa-db-ja.com

Apache2 + Tomcat:Apache2を介してリクエストを受信すると、タイムアウトとプロキシエラーが発生します

そのため、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がタイムアウトを返す理由は意味がありません。

1
Rowanto

私たちはあなたと同様の問題を抱えていました。iptablesを使用してすべてのトラフィックをポート80から8080に転送することにより、Apacheを完全にバイパスしました。これが機能するかどうかはわかりません。

また、Tomcatにポート80でリッスンさせることもできます(他のサイトが80でリッスンしているかどうかはわかりません)。

1
joeg1ff