为什么我收到Apache Proxy 503错误?

dam*_*mon 48 apache

我的服务器直到昨天都做得很好.它正在运行Redmine,它是最快乐的小服务器,直到我的"朋友"导入了我的小家伙无法接受的SQL表.不幸的是,经过一个小时的尝试让小伙伴做出回应,我们不得不重新启动他.

现在重启后,我们在尝试访问连接到Redmine的域时遇到503错误.它连接到Mongrel守护程序,我们使用Apache Proxy将所有连接定向到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>
Run Code Online (Sandbox Code Playgroud)

这是Apache的错误日志输出:

[debug] mod_proxy_http.c(54): proxy: HTTP: canonicalising URL //localhost:8000
[debug] proxy_util.c(1335): [client 216.27.137.51] proxy: http: found worker http://localhost:8000 for http://localhost:8000/
[debug] mod_proxy.c(756): Running scheme http handler (attempt 0)
[debug] mod_proxy_http.c(1687): proxy: HTTP: serving URL http://localhost:8000/
[debug] proxy_util.c(1755): proxy: HTTP: has acquired connection for (localhost)
[debug] proxy_util.c(1815): proxy: connecting http://localhost:8000/ to localhost:8000
[debug] proxy_util.c(1908): proxy: connected / to localhost:8000
[debug] proxy_util.c(2002): proxy: HTTP: fam 2 socket created to connect to localhost

[error] (13)Permission denied: proxy: HTTP: attempt to connect to 127.0.0.1:8000 (localhost) failed
[error] ap_proxy_connect_backend disabling worker for (localhost)

[debug] proxy_util.c(1773): proxy: HTTP: has released connection for (localhost)

exs*_*ydr 87

只要检测到后端服务器出现故障,Apache就会用503响应至少60秒.这是默认行为.在您的示例中,如果您重新启动后端服务器(在此示例中为Rails)并且有人在Rails准备好之前尝试通过Apache代理访问它,那么Apache将在接下来的60秒内返回503,无论您的后端现在是"up" .请参阅ProxyPass上的apache文档,其中说明:

重试60

连接池工作程序以秒为单位重试超时.如果后端服务器的连接池工作程序处于错误状态,则Apache将不会将任何请求转发到该服务器,直到超时到期为止.这样可以关闭后端服务器以进行维护,并在以后将其重新联机.值为0表示始终在没有超时的情况下重试处于错误状态的工作程序.

因此,如果您将Proxy Pass设置为包含retry = 0,则在重新启动后端服务时将看不到503.在开发过程中使用Apache作为反向代理时,这也很有用!例如:

ProxyPass/http:// localhost:8000 retry = 0

  • 供参考,指向[Apache 2.2的ProxyPass文档]的链接(http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass). (7认同)

小智 44

运行以下命令

# /usr/sbin/setsebool httpd_can_network_connect 1
Run Code Online (Sandbox Code Playgroud)

要么

# /usr/sbin/setsebool httpd_can_network_connect true
Run Code Online (Sandbox Code Playgroud)

然后重启httpd

# service httpd restart
Run Code Online (Sandbox Code Playgroud)

  • setsebool -P ...使更改持续存在. (6认同)
  • 这对我没有帮助.Apache + mongrel这是禁用SELinux,我看不出与该问题的任何关系. (2认同)