使用Nginx做为HTTP负载均衡器

 提示:转载请注明原文链接

 本文永久链接:https://www.360us.net/article/59.html

Nginx支持的负载均衡方案:

  • 轮训:循环分发请求;
  • 最少连接:下一个请求会分发给连接数最少的服务器;
  • ip-hash:用基于ip的hash方法计算来决定使用哪个服务器。

最简单的负载均衡配置

http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
        }
    }
}

测试Nginx是1.10.3版本,系统是ubuntu17.04。

默认80端口是主机用来做负载均衡,8080 - 8082三个端口分布做三个服务主机用来测试。

/etc/nginx/nginx.conf http项添加配置:

#放在include /etc/nginx/sites-enabled/*;之前就可以了
upstream myapp1 {
            server 192.168.1.120:8080;
            server 192.168.1.120:8081;
            server 192.168.1.120:8082;
        }

然后修改/etc/nginx/sites-available/default文件,添加三台不同端口的虚拟主机:

server {
        listen 8080;
        listen [::]:8080;

        server_name example.com;

        root /var/www/srv1;
        index index.html;

        location / {
                try_files $uri $uri/ =404;
        }
}

server {
    listen 8081;
    listen [::]:8081;

    server_name example2.com;
    root /var/www/srv2;
    index index.html;
    location / {
        try_files $uri $uri/ = 404;
    }
}

server {
    listen 8082;
    listen [::]:8082;

    root /var/www/srv3;
    index index.html;
    location / {
        try_files $uri $uri/ =404;
    }
}

在各个虚拟主机目录下面新建一个index.html,输出能分辨是那个主机的内容即可。

默认80端口配置,除了监听端口其他全注释掉,修改location配置为下面这样:

location / {
                proxy_pass http://myapp1;
        }

可以用sudo nginx -t命令测试一下配置,配置OK后用命令sudo nginx -s reload重载配置,然后访问 http://192.168.1.120可以看到每次输出都是来自不同的主机。

上面这种是最简单的负载均衡方法,默认是轮训的,每次请求循环给到三台机器。

Nginx的反向代理负载均衡实现支持HTTP,HTTPS,FastCGI,uwsgi,SCGI和memcached。

最少连接负载均衡

开启最少连接均衡方式的方法只要使用least_conn指令即可:

upstream myapp1 {
            least_conn;
            server 192.168.1.120:8080;
            server 192.168.1.120:8081;
            server 192.168.1.120:8082;
        }

会话保持

前面两种负载方式,不能保证相同客户端的请求总是转发到相同的服务器上面去。

如果你要客户端会话和特定的一台服务器绑定的话,上面的两种方法就不行了,可以用ip-hash负载方式实现。

只需要添加ip-hash指令即可:

upstream myapp1 {
            ip_hash;
            server 192.168.1.120:8080;
            server 192.168.1.120:8081;
            server 192.168.1.120:8082;
 }

权重负载均衡

以上例子是没有配置服务器权重的,意味着所有服务器都是平等的。

要配置服务器的权重,只需要使用weight参数即可:

upstream myapp1 {
            server 192.168.1.120:8080 weight=3;
            server 192.168.1.120:8081;
            server 192.168.1.120:8082;
 }

服务器健康检查

Nginx自带有服务器健康检查组件。假如某台服务器响应失败了,Nginx是标记这台服务器失效,然后暂时不会分发请求到这台服务器上面去。

我们把其中一台虚拟主机的配置注释掉或者换一个端口,再去访问负载均衡节点,那台不可用的主机是不会分发请求到这上面的。

主要两个指令max_failsfail_timeout,含义是在fail_timeout设置的时间段内,连续超过max_fails个连接失败,即认为后端服务器不可用。

max_fails默认值是1,设置为0则禁用健康检查,fail_timeout指令的默认值是10s

示例:

upstream backend {
    server backend1.example.com weight=5;
    server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;

    server backup1.example.com backup; #备用服务器
}

上面是最简单的使用方法了,其他更多高级使用方法可以看这里的底部链接。

 评论
暂无评论