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


80

Apache正在端口:80接收请求,并将请求代理到端口:8080的Jetty

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

我的困境:一切正常,正常(快速请求,几秒钟或秒长的请求数十处理OK)。请求处理花费很长时间(几分钟?)时,会出现问题

如果我直接在端口:8080上向Jetty 发出请求,则该请求将得到处理。所以问题可能出现在我正在使用mod_proxy的 Apache和Jetty之间。如何解决呢?

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

#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 webmaster@mydomain.fi

    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>

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

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:::

嗨..我仍然坚持这一。尝试了所有上述设置,并且增加码头的maxIdleTime也无济于事。任何指针接下来要尝试什么?
马丁

Answers:


91

我已经解决了问题。该Keepalive=On应插入ProxyPass配置行:

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

看到那个

Keepalive=On

那里?这很关键;)


9
我相信您可以将自己的答案标记为已接受。它会将问题标记为系统中已解决的问题,以供其他人查找。
sysadmin1138

你到底把它放在哪里?
AlxVallejo

1
@AlxVallejo您应该在这里找到您的配置文件/etc/apache2/sites-enabled/[sitename].conf
Steven

1
我们有完全相同的代理错误。它们很少发生(千分之一的请求)。为什么那么Keepalive=On关键呢?
dokaspar '16

可能不是timeout=600retry=1解决了这个问题吗?(或组合)
MattBianco

4

您尝试过设置setenv proxy-initial-not-pooled 1吗?

这里参考


不,这没有帮助。然后,这与比赛条件无关,而是漫长的延迟,并且两者之间发生了某些事情(Jetty和mod_proxy之间存在某种误解)。

4

如果不使用结束代理URL,也会发生此错误/。两条路径均应以a结尾/或都不以。


1

查看日志,发现有些东西在5分钟(= 300秒)后超时。等待回复的时间很长。当您直接访问Jetty服务器时,此资源是否真的需要那么长时间才能产生响应?

如果这五分钟确实在可能的响应时间内,则可以尝试调整ProxyTimeout配置指令。

根据您的网络设置,很可能甚至没有理由甚至尝试使用任何keepalive系统(应用服务器和代理之间是否存在防火墙,可以将其配置为丢弃闲置时间过长的会话?) ,但是ProxyTimeout会影响代理本身的行为。

如果同一代理还为其他后端提供服务,则最好保留当前的ProxyTimeout,并在ProxyPass指令中配置超时(请参见mod_proxy文档)。

但是,如果没有代理的响应始终少于五分钟(此处将其作为截止极限),那么代理和应用服务器之间可能确实存在一些奇怪的干扰,但是您没有提供任何标识可能是什么的值。


“当您直接访问Jetty服务器时,此资源是否真的需要那么长时间才能产生响应?” -是的 我也尝试将ProxyTimeout设置为600。这无济于事。代理服务器和码头之间没有防火墙。超时也是在ProxyPass中配置的。

“您没有提供任何有价值的东西来识别它可能是什么”:我不知道那可能是什么。我得到的只是来自服务器的错误消息:代理错误代理服务器收到来自上游服务器的无效响应。代理服务器无法处理请求GET /。原因:从远程服务器读取错误

至于增加代理超时,这是否还会更改浏览器在出现502错误之前旋转的时间?

然后介绍如何找出应用程序服务器中正在发生的情况:您可以进行几个线程转储,并从它们中查看浏览器等待时正在执行的操作。或者,添加足够的调试日志记录语句,以能够跟踪您的代码以查明运行缓慢的原因。

我知道为什么它很慢。我不知道为什么apache代理最终准备好后会拒绝响应。

0

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

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

所有其他建议都喜欢SetEnv proxy-initial-not-pooledKeep-Alive不喜欢 。


0

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

例如,我发现问题的原因是在我所有的Apache配置文件中将#LoadModule的所有实例替换为LoadModule。由于那为我解决了问题,因此我知道我的问题不是缺少“ KeepAlive”指令参数,而是我的问题是缺少依赖项。

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

注意:由于我的最初答案似乎建议永久禁用所有模块,因此该答案受到了反对。虽然理论上可以做到这一点而不必破坏任何内容,但这显然不是最佳实践解决方案。

因此,请理解,我只是建议将此作为故障排除步骤,而不是最终解决方案。

另外,请注意:我使用特殊的git项目来跟踪本地计算机的所有apache配置文件。这样,我就可以在我的apache config工作目录中进行这类全局搜索和替换操作,作为故障排除步骤。如果启用所有模块均成功,则尝试再次逐个禁用它们,然后在两者之间重新启动apache,直到找到需要保持启用状态的模块为止。确定了这一点后,然后将存储库重置回其原始状态,并仅启用需要保持启用状态的那个模块。

您还会发现使用git跟踪您的apache配置文件会清理这些目录,因为您将不再需要那些老式的.bak和.default文件。


1
每个图书馆都带来不同的功能,不一定与代理无关
Arnold Roa
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.