2009-08-31 36 views
4

我们的设置是标准的nginx(ver 0.7.59)+ Debian lenny上的精简上游服务器。现在我们在网页/应用程序和1分贝框的1牛腩框。最近我们开始注意到最终会开始“挂起”,即他们将不再接收来自nginx的请求。我们有15个运行,10-15分钟后,第一个或第二个将被挂起。如果整天离开,那些相同的几个加上几个将继续挂起。我们目前唯一的解决方法是重新启动nginx。重新启动后,挂起的薄片马上会再次接收请求。正因为如此,看起来这些稀有物可能已经被排除在上游泳池之外。Nginx从池中删除上游服务器

如果我正确理解了文档(http://wiki.nginx.org/NginxHttpUpstreamModule#server),并使用默认值(我们有),如果nginx在10秒内无法与后端服务器“通信”3次,则会将该上游服务器设置为“无效“状态。然后等待10秒钟,然后再次尝试该服务器。这是有道理的,但我们无限期地看到了瘦身吊挂。我试图将max_fails设置为0,但这并没有帮助。我找不到会导致上游服务器永久“失效”的原因。

我们已经看到最近增长率的大幅增长,所以我们不确定它是否可以与此相关,或者由于更短时间内的更多流量而更加明显。

在nginx中是否还有其他的东西(一个可改变的指令或其他条件)会导致它将服务器完全移出池?

回答

5

我们在nginx的反向代理支持方面遇到了很多问题,最终通过在Mongrel和nginx之间放置HAProxy实现了更好的体系结构。因此,我们的架构是:

网=> nginx的=> HAProxy的=>的Mongrels

我们前面所看到的(前HAProxy的)是nginx的可能淹没的Mongrels太多的请求和杂种的请求队列不可靠,而且很快就会遇到太多排队的请求。 HAProxys队列更加稳定,它比nginx更好地平衡了后端之间的所有请求。当真正像最少连接这样的算法更好时,nginx只提供循环平衡。我不知道Thin是否与Mongrel有同样的问题。

在我们的新设置中,nginx只是代理一个haproxy实例,而haproxy已经配置了所有已注册的Mongrels。 HAProxy更好地支持上游的ok/fail检测,并且还可以将每个应用服务器限制为1个连接(maxconn指令),这对于Mongrel来说很关键,对Thin不是很确定。

maxconn指令非常关键,EngineYard为nginx提供了一个补丁,它使它成为nginx的本地补丁,所以您不需要部署HAProxy来利用它。

参见:nginx-ey-balancer

+0

是的,我们会看到,之前,我忘了提,我们使用的公平代理平衡器插件(http://brainspl.at/articles/2007/11/09/a-fair- proxy-balancer-for-nginx-and-mongrel; http://wiki.nginx.org/NginxHttpUpstreamFairModule),它使用最不忙的算法而不是循环法。它运作良好,#request/thin甚至可以随时间变得非常接近。 我希望不必引入像HAProxy这样的其他图层,只要我们能够找出导致图层不再接收来自nginx的请求的原因。 那么nginx-ey-balancer基本上模仿了HAProxy的w/max H算法需要HAProxy? – 2009-08-31 16:45:54

+1

是的,nginx-ey-balancer模仿HAProxy需要HAProxy的maxconn算法。这几乎是我们转向haproxy开始的全部原因,现在它只是我们架构的一部分。 – 2009-08-31 16:50:18

+0

非常感谢您的帮助。想想我会尝试nginx-ey-balancer。虽然它只有nginx v 0.6.34/35和0.8.0的补丁。我会看看哪一个更接近0.7.59,并希望最好..或等到0.8.x稳定。 – 2009-08-31 17:00:07