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_fails
和fail_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; #备用服务器
}
上面是最简单的使用方法了,其他更多高级使用方法可以看这里的底部链接。
本来链接:https://360us.net/article/59.html