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

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

そのため、Tomcat でホストされている Solr (検索アプリケーション) にリクエストを送信するために、Apache をリバース プロキシとして使用します。

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) に送信すると、この問題は発生しません。最初は、この問題は次のようになるかもしれません。これ

しかし、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

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

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

関連情報