登录
注册
node.js 学习社区
nginx 做负载均衡多个node.js 服务

龙大

2015-03-04 16:36

先看一个最普通的 nginx 的 server 配置:

server
{
    listen       80;
    server_name www.test.com;
    root /web/myapp/static;
    location / {
            proxy_http_version  1.1;
            proxy_set_header    X-Real-IP $remote_addr;
            proxy_read_timeout  120;
            proxy_set_header    Host $http_host;
            proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header    Upgrade $http_upgrade;
            proxy_set_header    Connection "upgrade";
            proxy_pass          http://192.168.1.2:3000;
    } 
}
负载均衡,在上面的基础上,先增加一个upstream 配置项:
upstream myapp{  
    server 192.168.1.2:3000;
    server 192.168.1.3:3000;
    server 192.168.1.4:3000;
}
同时把 server 的配置项 proxy_pass 改成:
proxy_pass http//myapp; 

最终修改后成为如下配置:

upstream myapp{
    server 192.168.1.2:3000;
    server 192.168.1.3:3000;
    server 192.168.1.4:3000;
}  
server
{
    listen       80;
    server_name www.test.com;
    root /web/myapp/static;
    location / {
            proxy_http_version  1.1;
            proxy_set_header    X-Real-IP $remote_addr;
            proxy_read_timeout  120;
            proxy_set_header    Host $http_host;
            proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header    Upgrade $http_upgrade;
            proxy_set_header    Connection "upgrade";
            proxy_pass          http//myapp;
    } 
}

————————————————————————————————————————

nginx的upstream  几种方式介绍:

1.默认方式为轮询:时间平均分布,后端服务器宕机,自动忽略掉,不影响网站继续运行;几个配置参数:

  • weight 默认的weight为1,可以设置其他数字,改变某个后端服务器的比重。如下:
    upstream myapp{
        server 192.168.1.2:3000 weight=2;
        server 192.168.1.3:3000;
        server 192.168.1.4:3000;
    }
  • down 标记当前的server不参与负载均衡。如下:
    upstream myapp{
        server 192.168.1.2:3000;
        server 192.168.1.3:3000 down;
        server 192.168.1.4:3000;
    }
  • backup 备用服务器,最初不参与负载均衡,等其他server 全部挂掉后,执行该server。如下:
    upstream myapp{
        server 192.168.1.2:3000;
        server 192.168.1.3:3000;
        server 192.168.1.4:3000 backup;
    }

2.ip_hash 方式:按照IP地址分配后端服务器,ip_hash可以访问时session的一致,因为一直被分配到同一台服务器上。如下:

upstream myapp{
    ip_hash; 
    server 192.168.1.2:3000;
    server 192.168.1.3:3000;
    server 192.168.1.4:3000;
}

3.fair 方式:按照后端服务器响应时间分配。如下:

upstream myapp{
    fair; 
    server 192.168.1.2:3000;
    server 192.168.1.3:3000;
    server 192.168.1.4:3000;
} 
4.url_hash方式:根据url 分配。如下:
upstream myapp{
    ip_hash; 
    server 192.168.1.2:3000;
    server 192.168.1.3:3000;
    server 192.168.1.4:3000;
} 

注意:3和4非nginx自带,需要安装第三方插件。安装插件请参考 文章


回复 · 5

  • 牛逼。

    0

  • 强贴留名.

    0

  • 还有一种是基于cookie的,根据ip_hash有局限性,如果有大量的局域网电脑访问,某台server的压力还是比较大,这样以来就失去了负载均衡的作用,可以使用cookie方式进行分配,cookie方式也是第三方的,需要安装。

    1

  • ip_hash做session粘帖是非常理想的,甚至是配合 socket.io

    0

  • //websocket nginx config

    http {
        map $http_upgrade $connection_upgrade {
            default upgrade;
            '' close;
        }
    
        upstream websocket {
            server 192.168.100.10:8010;
        }
    
        server {
            listen 8020;
            location / {
                proxy_pass http://websocket;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection $connection_upgrade;
            }
        }
    }

    OK?

    0

发表回复

你可以在回复中 @ 其他人