为啥我收到 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

为啥我在上网几个小时后收到 503 错误?节点/快递

HttpURLConnection 通过代理访问时返回 503 错误

nginx 代理在响应时间过长时导致错误

websocket._exceptions.WebSocketProxyException:通过代理连接失败状态:503

Apache 反向代理 Unix 套接字