需求
nginx作为反向代理,需要设置两个后端服务器(backend),其中一台backend作为备机(backup),另外一台backend作为24小时在线的小贴心,只有这台backend不小心挂了,才由备机接管服务。
配置方法
- upstream配置
1
2
3
4upstream backend {
server IP:port max_fails=3 fail_timeout=30s;
server IP:port max_fails=3 fail_timeout=30s backup;
} - server配置
- nginx与后端通过http协议通信
1
2
3
4
5
6
7
8
9
10
11server {
listen port;
server_name hostname;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass http://backend; //nginx与后端通过http协议通信
}
} - nginx与后端通过https协议通信
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17server {
listen port;
server_name hostname;
ssl on;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_certificate /etc/nginx/server.pem;
ssl_certificate_key /etc/nginx/server.key;
ssl_dhparam /etc/nginx/dhparams.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass https://backend; //nginx与后端通过https协议通信
}拓展
- ip_hash策略用于均衡负载,根据用户的源IP分发流量到各个backend。比如我(我的IP是个特定值)的第一个http请求到了backend1,nginx会记住我的选择,以后凡是我发起的请求,都将转发到backend1。这种方式常用于做会话保持。
- ip_hash策略可以搭配down使用。也就是可以设置永久移除某个backend。比如:
1
2
3
4
5upstream backend {
ip_hash; //负载均衡策略
server IP:port max_fails=3 fail_timeout=30s;
server IP:port max_fails=3 fail_timeout=30s down; //永久移除该backend,nginx不会把流量转发到该backend。down就是把它打入冷宫。
} - ip_hash策略可以搭配weight使用,设置各个backend的权重值。就是给后宫娘娘们排个头衔,皇后的地位就比妃嫔的地位高。比如:这个例子中,皇后和普通妃嫔的权重比是6:3。如果我发起了9次请求,其中6次请求会转发给皇后,其中3次请求转发给普通妃嫔。虽然权重差距大,还是雨露均沾的。
1
2
3
4
5upstream backend {
ip_hash; //负载均衡策略
server IP:port max_fails=3 fail_timeout=30s weight=6; //这个是皇后,位高权重
server IP:port max_fails=3 fail_timeout=30s weight=3; //这个是普通妃嫔,权重一般
}