nginx自动故障转移负载平衡


29

我正在使用nginx和NginxHttpUpstreamModule进行负载平衡。我的配置非常简单:

upstream lb {
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
}

server {
    listen  89;
    server_name localhost;

    location / {
            proxy_pass      http://lb;
            proxy_redirect  off;
            proxy_set_header        Host            $host;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

但是使用此配置时,当2个后端服务器之一关闭时,nginx仍将请求路由到该服务器,这将导致一半时间超时:(

是否有任何解决方案可以使nginx在检测到服务器宕机时自动将请求路由到另一个服务器。

谢谢。

Answers:


33

我认为这是因为nginx并未检测到上游已关闭,因为它位于同一台计算机上。

您正在寻找的选项是: proxy_next_upstreamproxy_connect_timeout

尝试这个:

location / {
        proxy_pass              http://lb;
        proxy_redirect          off;
        proxy_next_upstream     error timeout invalid_header http_500;
        proxy_connect_timeout   2;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
}

我在Apache / PHP设置不完整(缺少PEAR库文件)时遇到了问题,引发了HTTP 500错误。proxy_next_upstream刚在另一台机器上重试-确实返回OK。
Alister Bulman 2010年

5
为什么关闭proxy_redirect?
Seen Osewa'3

2

嘿,请参阅Wiki:http : //wiki.nginx.org/NginxHttpUpstreamModule#server

基本上,如果检测到故障,后端将被标记为关闭x秒钟,然后它将重试。因此,如果您一直看到连接,则可能是nginx一直在检查后端是否可用。

但是,它应该尝试上游块中的下一个条目,因此,如果只有一个关闭,则您实际上不会看到没有后端可用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.