为什么我得到一个Apache Proxy 503错误?

直到昨天,我的服务器一直很好。 它正在运行Redmine ,它是最快乐的servlets器, 直到我的“朋友”导入了一个我的小家伙不能拿的SQL表。 不幸的是,经过一个小时的努力,我们不得不重新启动他。

现在重新启动后,尝试访问连接到Redmine的域时会出现503错误。 它连接到一个Mongrel守护进程,我们使用Apache Proxy将所有连接指向Redmine正在运行的端口。

在服务器上使用Lynx( http://localhost:8000 ),你可以看到Ruby应用程序正常工作。 但是这个位在我的Apacheconfiguration文件中不起作用:

 <VirtualHost *:80> ServerName sub.example.com ProxyPass / http://localhost:8000 ProxyPassReverse / http://localhost:8000 ProxyPreserveHost on LogLevel debug </VirtualHost> 

以下是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 http:// localhost:8000 worker http:// localhost:8000 /
 [debug] mod_proxy.c(756):运行schemehttp处理程序(尝试0)
 [debug] mod_proxy_http.c(1687):proxy:HTTP:服务URL http:// localhost:8000 /
 [debug] proxy_util.c(1755):proxy:HTTP:已经获得连接(localhost)
 [debug] proxy_util.c(1815):proxy:连接http:// localhost:8000 /到localhost:8000
 [debug] proxy_util.c(1908):proxy:connected / to localhost:8000
 [debug] proxy_util.c(2002):proxy:HTTP:为连接本地主机而创build的fam 2套接字

 [错误](13)权限被拒绝:代理:HTTP:尝试连接到127.0.0.1:8000(本地主机)失败
 [错误] ap_proxy_connect_backend禁用worker(localhost)

 [debug] proxy_util.c(1773):proxy:HTTP:已经释放连接(localhost)

只要检测到后端服务器closures,Apache就会以503响应至less60秒。 这是默认行为。 就像在你的例子中一样,如果你重新启动你的后端服务器(在这个例子中是Rails),并且在Rails准备就绪之前有人试图通过Apache代理来访问它,那么无论你的后端是否已经启动,Apache都会在接下来的60秒内返回503, 。 请参阅ProxyPass上的apache文档,其中声明:

重试60

连接池工作人员重试超时秒数。 如果连接池工作者到后端服务器处于错误状态,Apache将不会转发任何请求到该服务器,直到超时到期。 这可以closures后端服务器进行维护,并在稍后重新联机。 值为0意味着总是重试工作在错误状态,没有超时。

所以如果你设置你的Proxy Pass包含retry = 0,那么当你重新启动后端服务时你将看不到503。 在开发过程中使用Apache作为反向代理时,这也很有用! 例如:

ProxyPass / http:// localhost:8000重试= 0

运行以下命令

 # /usr/sbin/setsebool httpd_can_network_connect 1 

要么

 # /usr/sbin/setsebool httpd_can_network_connect true 

之后重新启动httpd

 # service httpd restart 

你确定他们正在以正确的顺序重新启动吗? 在Apache启动的时候,我有奇怪的问题,然后Mongrel启动,虽然Mongrel正在运行,但Apache仍然会抛出代理错误。

过去我用各种咒语和重启阿帕奇解决了这个问题,最终神灵们感到高兴。 看来有时候Mongrel进程不能正常closures,所以你必须手动杀死它们。 这里有一些[可能]帮助的链接 。

我最终为我的/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> 

可能不是一个很好的解决scheme,但邪恶消失了。

尝试运行monit来监视Apache后面的mongrels,这样一来,如果它们死亡或者对内存太饿,它可以重新启动mongrels。 如果由于某种原因,Apache仍然感到困惑,那么你可能只需要适度地重新启动apache,并且应该自己解决,但是对于你的mongrels中有99%的情况应该避免这种情况发生。 另一种select是调查Phusion乘客。

首先通过以下命令检查端口8080是否正在侦听

 netstat -tlpn 

如果不是,用下面的命令重启jenkins服务器

 sudo /etc/init.d/jenkins start 

它应该现在工作。 希望能帮助到你。

首先,你必须安装selinux :(SELinux代表安全增强的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!

为了得到这个工作,我需要closuresSELinux,然后在“localhost:8000”行中添加尾部的斜线。

这里是closuresSELinux的代码:

 echo 0 >/selinux/enforce