Nginx 配置负载均衡
# 20.Nginx 配置负载均衡
随着互联网信息的爆炸性增长,负载均衡(load balance)已经不再是一个很陌生的话题。
顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品。
很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎,Nginx 就是其中的一个,在 Linux 下还有 LVS、Haproxy 等等服务可以提供负载均衡服务。
本文我们就通过 Nginx 来演示如何实现负载均衡。
# 需求
浏览器地址栏输入地址 http://127.0.0.1/F5/a.html
,负载均衡效果,平均分发到 8080 和 8081 端口中。
# 准备工作
- 准备两台 tomcat 服务器,一台 8080,一台 8081
- 在两台 tomcat 里面 webapps 目录中,都创建 F5 文件夹,并在文件夹中创建页面 index.html(内容不同),用于测试
相关命令:
cd /opt/apache-tomcat-9.0.73/webapps/
mkdir F5
echo '<h1>This is 8080 F5 Tomcat</h1>' > F5/index.html
cd /opt/tomcat8181/apache-tomcat-9.0.73/webapps/
mkdir F5
echo '<h1>This is 8081 F5 Tomcat</h1>' > F5/index.html
2
3
4
5
6
7
8
然后分别访问 8080 和 8081 端口,测试能否正常访问:
# Nginx 配置负载均衡
在 http 全局块添加以下配置:
upstream myserver {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
2
3
4
server 中添加一个 location:
server {
location / {
root html;
proxy_pass http://myserver;
index index.html index.htm;
}
}
2
3
4
5
6
7
重启 Nginx
./nginx -s reload
访问测试:每隔一秒刷新下页面,发现轮流访问的是两个 Tomcat 下的项目的 index.html(可通过页面展示内容区分)
完整配置:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream myserver {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 9001;
server_name localhost;
location / {
proxy_pass http://myserver;
}
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
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
32
33
34
35
36
37
38
39
40
41
# 分配方式
Nginx 提供了几种分配方式(策略):
轮询(默认策略):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器挂了,能自动剔除,不会再分发请求到挂了的服务器
权重:weight 代表权,重默认为 1,权重越高被分配的客户端越多。指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。例如:
upstream myserver { server 127.0.0.1:8080 weight=5; server 127.0.0.1:8081 weight=10; }
1
2
3
4第二个 server 比第一个多一倍。
ip_hash:每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。 例如:
upstream myserver { ip_hash; server 127.0.0.1:8080 weight=5; server 127.0.0.1:8081 weight=10; }
1
2
3
4
5fair 方式:按后端服务器的响应时间来分配请求,响应时间短的优先分配
upstream myserver { server 127.0.0.1:8080; server 127.0.0.1:8081; fair; }
1
2
3
4
5