如何修复 apache2“proxy_http:error”AH01102:从远程服务器 localhost:4382 读取状态行时出错。
我有一个 apache2 网络服务器,用于在后端提供一些 nodejs 应用程序。
Apache2 网络服务器版本:服务器版本:Apache/2.4.41 (Ubuntu) 服务器构建时间:2019-08-21T20:43:05
Nodejs版本:v10.18.1
Mongo 数据库版本:v4.0.15
我们所有的后端应用程序“proxy_http:error”AH01102:从远程服务器 localhost:4382 读取状态行时出错,以下错误(参见日志)一直困扰着我们。
[Mon Apr 27 20:09:05.697271 2020] [proxy_http:error] [pid 26792:tid 140063099688704] (70007)The timeout specified has expired: [client 178.153.198.97:52385] AH01095: prefetch request body failed to 127.0.0.1:4381 (localhost) from 178.153.198.97 (), referer: https://www.example.com/sub-admin/menus/add-menu
[Mon Apr 27 20:21:51.617095 2020] [proxy_http:error] [pid 26764:tid 140062901626624] (104)Connection reset by peer: [client 178.153.195.206:61268] AH01102: error reading status line from remote server localhost:4382, referer: http://www.example.com/restaurant/dashboard
[Mon Apr 27 20:21:51.617117 2020] [proxy:error] [pid 26764:tid 140062901626624] [client 178.153.195.206:61268] AH00898: Error reading from remote server returned by /restaurant/assets/img/avatars/5.jpg, referer: http://www.example.com/restaurant/dashboard
[Tue Apr 28 03:51:28.498423 2020] [proxy_http:error] [pid 26793:tid 140062868055808] (104)Connection reset by peer: [client 89.211.117.185:57622] AH01102: error reading status line from remote server localhost:4382, referer: http://www.example.com/restaurant/dashboard
[Tue Apr 28 03:51:28.498455 2020] [proxy:error] [pid 26793:tid 140062868055808] [client 89.211.117.185:57622] AH00898: Error reading from remote server returned by /restaurant/static/css/main.f8d32764.chunk.css, referer: http://www.example.com/restaurant/dashboard
到目前为止我已经尝试了这些方法来修复这个错误。
ProxyPreserveHost On-没有起到作用。
disablereuse=on。它不起作用。
超时=600,然后超时=900。没有用。
重试=1 获取=3000 超时=600 Keepalive=On。无效。
SetEnv 强制代理请求-1.0 1
SetEnv 代理无存活 1
工作时间很短(12 小时)。同样的错误再次出现,频率与之前几乎相同。
- SetEnv 代理初始未池化 1
SetEnv 代理不存活 1
这个程序运行了 24 小时。然后 24 小时后,这个错误又重现了。虽然这次 24 小时后,错误一小时才出现一次,有时两小时才出现一次,有时两到五小时才出现一次。
1Q. 首先为什么会发生这个错误。
2Q. 此错误是否仅因为 apache 而发生,或者 nodejs 应用程序也可能是罪魁祸首
(但是当此 apache 错误发生时,几乎没有任何应用程序的错误日志)。
3Q. 如何/什么是识别、诊断和解决此错误的最佳方法,因为在搜索了各种论坛后,似乎没有人能够完美地解决此错误或对此有正确的答案,而且从 2006 年以来一直如此,查看一些论坛。
这是我的 apache 配置文件
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName www.example.com
ServerAlias example.com
SSLEngine On
SSLProxyEngine On
SSLCertificateFile "/etc/ssl/private/server.crt"
SSLCertificateKeyFile "/etc/ssl/private/server.key"
ProxyRequests Off
#Admin
ProxyPass /admin http://localhost:4380/
ProxyPassReverse /admin http://localhost:4380/
SetEnv proxy-nokeepalive 1
SetEnv proxy-initial-not-pooled 1
ProxyPass /restaurant http://localhost:4382/
ProxyPassReverse /restaurant http://localhost:4382/
SetEnv proxy-nokeepalive 1
SetEnv proxy-initial-not-pooled 1
ProxyPass /sub-admin http://localhost:4385/
ProxyPassReverse /sub-admin http://localhost:4385/
SetEnv proxy-nokeepalive 1
SetEnv proxy-initial-not-pooled 1
#API
ProxyPass /admin-api/ http://localhost:4381/
ProxyPassReverse /admin-api/ http://localhost:4381/
SetEnv proxy-nokeepalive 1
SetEnv proxy-initial-not-pooled 1
ProxyPass /restaurant-api/ http://localhost:4379/
ProxyPassReverse /restaurant-api/ http://localhost:4379/
SetEnv proxy-nokeepalive 1
SetEnv proxy-initial-not-pooled 1
</VirtualHost>
答案1
如果你查看你的日志,首先出现(70007)指定的超时已过期:[客户端 178.153.198.97:52385] AH01095日志的其余部分就是这种情况的结果。
这里发生的事情是,您的 localhost 实现需要很长时间才能返回答案。也许您可以在您的实现中验证为什么会这样,并尝试对其进行优化。但在 apache 中,您可以定义等待 localhost 实现的连接时间和超时时间
ProxyPass /餐厅 http://localhost:4382/连接超时=[时间(秒)]超时=[时间(秒)]
例如 60 秒(1 分钟)
ProxyPass /餐厅 http://localhost:4382/连接超时=60 超时=60