为啥我收到 Apache 代理 503 错误?
Posted
技术标签:
【中文标题】为啥我收到 Apache 代理 503 错误?【英文标题】:Why am I getting an Apache Proxy 503 error?为什么我收到 Apache 代理 503 错误? 【发布时间】:2010-10-15 13:06:13 【问题描述】:直到昨天,我的服务器都运行良好。它正在运行Redmine,它是最快乐的小服务器直到我的“朋友”导入了我的小家伙无法接受的 SQL 表。不幸的是,经过一个小时试图让小家伙做出回应后,我们不得不重新启动他。
现在重启后,我们在尝试访问连接到 Redmine 的域时收到 503 错误。它连接到Mongrel 守护进程,我们使用 Apache 代理将所有连接定向到运行 Redmine 的端口。
在服务器 (http://localhost:8000
) 上使用 Lynx,您可以看到 Ruby 应用程序运行良好。但这一点在我的 Apache 配置文件中不起作用:
<VirtualHost *:80>
ServerName sub.example.com
ProxyPass / http://localhost:8000
ProxyPassReverse / http://localhost:8000
ProxyPreserveHost on
LogLevel debug
</VirtualHost>
这是 Apache 的错误日志输出:
[调试] mod_proxy_http.c(54): 代理: HTTP: 规范化 URL //localhost:8000 [debug] proxy_util.c(1335): [client 216.27.137.51] proxy: http: found worker http://localhost:8000 for http://localhost:8000/ [调试] mod_proxy.c(756):运行方案 http 处理程序(尝试 0) [调试] mod_proxy_http.c(1687):代理:HTTP:服务 URL http://localhost:8000/ [调试] proxy_util.c(1755):代理:HTTP:已获得(本地主机)的连接 [debug] proxy_util.c(1815): proxy: 连接 http://localhost:8000/ 到 localhost:8000 [调试] proxy_util.c(1908):代理:连接/到 localhost:8000 [debug] proxy_util.c(2002): proxy: HTTP: fam 2 socket created to connect to localhost [错误] (13)权限被拒绝:代理:HTTP:尝试连接到 127.0.0.1:8000 (localhost) 失败 [错误] ap_proxy_connect_backend 禁用(本地主机)的工作人员 [调试] proxy_util.c(1773): 代理: HTTP: 已释放 (localhost) 的连接【问题讨论】:
嘿,请回复下面的帖子。作为类似的错误***.com/questions/9461086/… 【参考方案1】:只要检测到后端服务器已关闭,Apache 就会以 503 响应至少 60 秒。这是默认行为。在您的示例中,如果您重新启动后端服务器(在此示例中为 Rails)并且有人尝试在 Rails 准备好之前通过 Apache 代理访问它,那么无论您的后端现在是否“启动”,Apache 将在接下来的 60 秒内返回 503 .请参阅 ProxyPass 上的 apache 文档,其中指出:
重试 60 次
连接池工作程序重试超时(以秒为单位)。如果后端服务器的连接池工作程序处于错误状态,则 Apache 不会将任何请求转发到该服务器,直到超时到期。这可以关闭后端服务器进行维护,并在稍后将其重新联机。值 0 表示总是在没有超时的情况下重试处于错误状态的工作人员。
因此,如果您将代理通行证设置为包含 retry=0,则在重新启动后端服务时将不会看到 503。这在开发期间使用 Apache 作为反向代理时也很有用!例如:
ProxyPass /http://localhost:8000retry=0
【讨论】:
供参考,链接到ProxyPass docs for Apache 2.2。 和nginx一样吗?【参考方案2】:运行以下命令
# /usr/sbin/setsebool httpd_can_network_connect 1
或
# /usr/sbin/setsebool httpd_can_network_connect true
然后重启httpd
# service httpd restart
【讨论】:
setsebool -P ... 使更改持续存在。 这对我没有帮助。 Apache + mongrel 这是禁用 SELinux,我看不出与该问题有任何关系。 这对我有帮助,但我什么都不懂,你能解释一下吗?/usr/sbin/setsebool: No such file or directory
我。我可以看到该目录中没有名为setsebool
的文件。【参考方案3】:
您确定它们以正确的顺序重新启动吗?我在 Apache 启动时遇到了奇怪的问题,然后 Mongrel 启动,虽然 Mongrel 正在运行,但 Apache 仍然抛出代理错误。
我过去通过各种咒语和重新启动 Apache 解决了这个问题,最终众神很高兴。似乎有时 Mongrel 进程没有正确关闭,因此您必须手动杀死它们。这是一个link,提供一些[可能的]帮助。
我最终在我的 /etc/init.d/
mongrel 脚本中添加了一个“kill”选项,因为它发生了很多。它停止 Mongrel,终止所有 Mongrel 会话,启动 Mongrel 并重新启动 Apache。
<snip>
kill)
echo "Stopping, killing, starting, and restarting Apache..."
mongrel_cluster_ctl stop -c $CONF_DIR --clean
killall -u mongrel
mongrel_cluster_ctl start -c $CONF_DIR --clean
/etc/init.d/httpd restart
RETVAL=$?
;;
</snip>
可能不是一个很好的解决方案,但邪恶已经消失了。
【讨论】:
exshovelrydr 的回答解释了为什么启动顺序很重要,以及如何更改 Apache 配置以使启动顺序无关。【参考方案4】:尝试运行 monit 来监控 Apache 后面的 mongrel,这样它可以在 mongrel 死掉或内存不足时为你重新启动。如果出于任何原因 Apache 仍然感到困惑,您可能只需要优雅地重新启动 apache,它应该会自行解决,但是对于 99% 的情况,监控您的杂种应该避免再次发生这种情况。另一种选择是查看 Phusion Passenger。
【讨论】:
【参考方案5】:首先通过以下命令检查8080端口是否在监听
netstat -tlpn
如果不是通过以下命令重启jenkins服务器
sudo /etc/init.d/jenkins start
它现在应该可以工作了。希望对您有所帮助。
【讨论】:
【参考方案6】:拳头,一定要安装selinux
:(SELinux代表Security-Enhanced Linux。)
apt-get install selinux
之后,您可以通过以下命令启用 SElinux 的安全策略:
sed -i 's/SELINUX=.*/SELINUX=permissive/' /etc/selinux/config
注意:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
最后,重启apache!
【讨论】:
您的答案两次更改了 SELINUX 设置?关闭 selinux 已经是公认的答案——我不确定你在这里添加了什么。另外,请评论/解释您的答案的作用 - 这会提高 SO 的长期价值。 对不起,英语不是我的母语,所以我有点卡在文本解释上:) - 我遇到了这个错误,我用上面的语句修复了它。 SELinux 代表安全增强型 Linux。这是一种提高服务器安全性的方法。启用 SELinux 后,Apache 将使用 SELinux 策略而不是 Apache 策略。以上是关于为啥我收到 Apache 代理 503 错误?的主要内容,如果未能解决你的问题,请参考以下文章
Git:在 CONNECT 后从代理收到 HTTP 代码 503
HttpURLConnection 通过代理访问时返回 503 错误
websocket._exceptions.WebSocketProxyException:通过代理连接失败状态:503