Nginx 负载均衡

负载均衡SLB(Server Load Balancer)是一种对流量进行按需分发的服务,通过将流量分发到不同的后端服务来扩展应用系统的服务吞吐能力,并且可以消除系统中的单点故障,提升应用系统的可用性。
即将项目部署在多台服务器,通过 nginx 负载均衡策略转发请求至不同的服务器。

域名 项目路径 监听端口 配置文件
sev.test.com /data/project/test; 80 sev.test.com.conf
sev.test.com /data/project/test; 8001 sev.test.com.8001.conf
sev.test.com /data/project/test; 8002 sev.test.com.8002.conf

配置并运行

sev.test.com.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
log_format main
'$remote_addr $remote_user [$time_local] $http_x_Forwarded_for $request '
'$http_x_forwarded_for '
'$upstream_addr '
'ups_resp_time: $upstream_response_time '
'request_time: $request_time';

upstream sev.test.com {
server localhost:8001;
server localhost:8002;
}

server {
listen 80;
server_name sev.test.com;

root /data/project/test;

access_log /data/logs/sev-test-com.log main;

location / {
proxy_pass http://sev.test.com;
}

location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/usr/local/var/run/php74-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

sev.test.com.8001.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 8001;
server_name sev.test.com;

root /data/project/test;

location / {
index index.php index.html index.htm;
}

location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/usr/local/var/run/php74-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

sev.test.com.8002.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 8002;
server_name sev.test.com;

root /data/project/test;

location / {
index index.php index.html index.htm;
}

location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/usr/local/var/run/php74-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

/data/project/test/index.php

1
2
3
<?php

echo $_SERVER['REMOTE_ADDR'] . ' - ' . $_SERVER['SERVER_PORT'];

访问 sev.test.com,每次输出的端口在 8001 和 8002 交替


负载均衡配置说明

轮询(默认)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1. nginx 负载默认采用「轮询」试,顾名思义,所有请求都按照时间顺序分配到不同的服务上
2. 在轮询中,如果服务器down掉了,会自动剔除该服务器。
3. 此策略适合服务器配置相当,无状态且短平快的服务使用。

# 参数说明
fail_timeout 与 max_fails 结合使用
max_fails 设置在 fail_timeout 参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了
fail_time 服务器会被认为停机的时间长度,默认为10s。
backup 标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。
down 标记服务器永久停机了。
# 配置示例
server localhost:8001;
server localhost:8002 backup;
server localhost:8003 max_fails=3 fail_timeout=20s;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
upstream sev.test.com {
server localhost:8001;
server localhost:8002;
}

# 请求 10次 结果:8001 与 8002 处理的请求数相等
8001
8002
8001
8002
8001
8002
8001
8002
8001
8002

权重

1
2
3
4
1. 在轮询策略的基础上制定沦陷的几率
2. 权重越高分配到需要处理的请求越多。
3. 此策略可以与 least_conn 和 ip_hash 结合使用。
4. 此策略比较适合服务器的硬件配置差别比较大的情况。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
upstream sev.test.com {
server localhost:8001 weight=1;
server localhost:8002 weight=2;
}

# 请求 10次 结果:8002 处理的请求数是 8001 的两倍
8001
8002
8002
8001
8002
8002
8001
8002
8002
8001

iphash

1
2
3
4
5
1. 负载均衡器按照客户端IP地址的分配方式,可以确保相同客户端的请求一直发送到相同的服务器。这样每个访客都固定访问一个后端服务器。
2. 在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)。
3. ip_hash 不能与 backup同时使用。
4. 此策略适合有状态服务,比如session。
5. 当有服务器需要剔除,必须手动down掉。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
upstream sev.test.com {
ip_hash;
server localhost:8001;
server localhost:8002;
}

# 请求 10次 结果:127.0.0.1 的 访问全是 8002 端口
8002
8002
8002
8002
8002
8002
8002
8002
8002
8002

最小连接

1
2
1. 把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果
2. 此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
upstream sev.test.com {
least_conn;
server localhost:8001;
server localhost:8002;
}

# 请求 10次 结果:8001 与 8002 处理的请求数大致相等(根据连接数变化)
8002
8001
8002
8002
8001
8002
8001
8002
8001
8002
0%