代理错误502“原因:使用Apache 2.2.3(Debian)mod_proxy和Jetty 6.1.18从远程服务器读取时出错”

Apache正在接收80端口的请求,并通过端口8080将它们代理到Jetty

The proxy server received an invalid response from an upstream server The proxy server could not handle the request GET /. 

我的困境:一切正常正常 (快速请求,几秒或几十秒长的请求处理 )。 处理请求需要很长时间 (几分钟?) 会发生问题

如果我直接发送请求到端口:8080的Jetty请求处理确定。 所以问题可能会在我使用mod_proxy的 Apache和Jetty之间。 如何解决这个问题?

我已经尝试了一些与KeepAlive设置有关的“技巧” ,但没有运气。 这是我目前的configuration,有什么build议吗?

 #keepalive Off ## I have tried this, does not help #SetEnv force-proxy-request-1.0 1 ## I have tried this, does not help #SetEnv proxy-nokeepalive 1 ## I have tried this, does not help #SetEnv proxy-initial-not-pooled 1 ## I have tried this, does not help KeepAlive 20 ## I have tried this, does not help KeepAliveTimeout 600 ## I have tried this, does not help ProxyTimeout 600 ## I have tried this, does not help NameVirtualHost *:80 <VirtualHost _default_:80> ServerAdmin [email protected] ServerName www.mydomain.fi ServerAlias mydomain.fi mydomain.com mydomain www.mydomain.com ProxyRequests On ProxyVia On <Proxy *> Order deny,allow Allow from all </Proxy> ProxyRequests Off ProxyPass / http://www.mydomain.fi:8080/ retry=1 acquire=3000 timeout=600 ProxyPassReverse / http://www.mydomain.fi:8080/ RewriteEngine On RewriteCond %{SERVER_NAME} !^www\.mydomain\.fi RewriteRule /(.*) http://www.mydomain.fi/$1 [redirect=301L] ErrorLog /var/log/apache2/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /var/log/apache2/access.log combined ServerSignature On </VirtualHost> 

这也是来自失败请求的debugging日志:

 74.125.43.99 - - [29/Sep/2010:20:15:40 +0300] "GET /?wicket:bookmarkablePage=newWindow:com.mydomain.view.application.reports.SaveReportPage HTTP/1.1" 502 355 "https://www.mydomain.fi/?wicket:interface=:0:2:::" "Mozilla/5.0 (Windows; U; Windows NT 6.1; fi; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10" [Wed Sep 29 20:20:40 2010] [error] [client 74.125.43.99] proxy: error reading status line from remote server www.mydomain.fi, referer: https://www.mydomain.fi/?wicket:interface=:0:2::: [Wed Sep 29 20:20:40 2010] [error] [client 74.125.43.99] proxy: Error reading from remote server returned by /, referer: https://www.mydomain.fi/?wicket:interface=:0:2::: 

我已经解决了这个问题。 应该将Keepalive=On插入到ProxyPassconfiguration行中:

 ProxyPass / http://www.dom.fi:8080/ retry=1 acquire=3000 timeout=600 Keepalive=On 

看到了

 Keepalive=On 

那里? 这是至关重要的;)

你有没有尝试设置setenv proxy-initial-not-pooled 1

在这里引用

如果您不使用/结束您的代理url,也会发生此错误。 两个path都应该以/或者两者都结束。

看日志,有5分钟(= 300秒)的时间。 等待回应的时间相当长。 当你直接访问Jetty服务器时,这个资源真的需要很长时间来产生响应吗?

如果五分钟真的在可能的响应时间内,您可以尝试调整ProxyTimeoutconfiguration指令。

根据您的networking设置,很可能是没有理由甚至尝试使用任何keepalive系统(应用程序服务器和代理之间是否有防火墙,可能会configuration为删除闲置时间太长的会话)? ,但是ProxyTimeout会影响代理本身的行为。

如果同一个代理也服务于其他后端,最好保留当前的ProxyTimeout,并在ProxyPass指令中configuration超时(参见mod_proxy文档)。

但是,如果没有代理服务器的响应总是远远低于五分钟的时间,那么在这里可以看到,代理服务器和应用服务器之间确实存在一些奇怪的干扰,但是您并没有提供任何价值来确定它可能是什么。

对我来说,在我的服务器应用程序(PHP)中删除名为Transfer-Encoding" (binary)的标题值Transfer-Encoding" (binary) )解决了以下问题:

[proxy_http:error] [pid 17623](22)无效参数:[client 127.0.0.1:44929] AH01102:从远程服务器读取状态行时出错0.0.0.0:80

所有其他build议,如SetEnv proxy-initial-not-pooledKeep-Alive没有。

如果上述解决scheme不起作用,你可以尝试的一件事是启用你所有的apache模块,以确保没有某个你需要的模块被意外禁用。

例如,我发现我的问题的原因是在我所有的Apacheconfiguration文件中用LoadModulereplace#LoadModule的所有实例。 既然这样就解决了我的问题,所以我知道我的问题不是缺less“KeepAlive”指令的说法,而是我的问题是一个缺失的依赖关系。

因为,请记住,.so文件基本上是静态库。 启用模块并不意味着它会被使用,但是禁用一个模块意味着它不能被使用,因此,任何依赖它的东西都将失败。

注意:由于我最初的回答似乎暗示永远保留所有的模块,所以这个答案得到了一些回应。 虽然理论上可以做到这一点,但不一定会破坏任何东西,但这显然不是最佳实践解决scheme。

所以,请理解,我只是提出这是一个故障排除步骤,而不是最终的解决scheme。

另外,请注意:我使用一个特殊的git项目来跟踪所有本地机器的apacheconfiguration文件。 这样我可以在我的apacheconfiguration工作目录中执行这些全局search和replace操作,作为故障排除步骤。 如果启用所有模块成功,然后尝试再一次禁用它们,然后重新启动apache,直到find哪个模块需要保持启用状态。 一旦你已经知道了,然后重置回到原来的状态,只有一个模块需要保持启用。

你也会发现使用git来跟踪你的apacheconfiguration文件会清除这些目录,因为你不再需要这些老式的.bak和.default文件。