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
插入到ProxyPass
configuration行中:
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-pooled
或Keep-Alive
没有。
如果上述解决scheme不起作用,你可以尝试的一件事是启用你所有的apache模块,以确保没有某个你需要的模块被意外禁用。
例如,我发现我的问题的原因是在我所有的Apacheconfiguration文件中用LoadModulereplace#LoadModule的所有实例。 既然这样就解决了我的问题,所以我知道我的问题不是缺less“KeepAlive”指令的说法,而是我的问题是一个缺失的依赖关系。
因为,请记住,.so文件基本上是静态库。 启用模块并不意味着它会被使用,但是禁用一个模块意味着它不能被使用,因此,任何依赖它的东西都将失败。
注意:由于我最初的回答似乎暗示永远保留所有的模块,所以这个答案得到了一些回应。 虽然理论上可以做到这一点,但不一定会破坏任何东西,但这显然不是最佳实践解决scheme。
所以,请理解,我只是提出这是一个故障排除步骤,而不是最终的解决scheme。
另外,请注意:我使用一个特殊的git项目来跟踪所有本地机器的apacheconfiguration文件。 这样我可以在我的apacheconfiguration工作目录中执行这些全局search和replace操作,作为故障排除步骤。 如果启用所有模块成功,然后尝试再一次禁用它们,然后重新启动apache,直到find哪个模块需要保持启用状态。 一旦你已经知道了,然后重置回到原来的状态,只有一个模块需要保持启用。
你也会发现使用git来跟踪你的apacheconfiguration文件会清除这些目录,因为你不再需要这些老式的.bak和.default文件。