Nginx 实现反向代理及负载均衡配置

彭楷淳发布于 2020-09-30
预计阅读时间 3 分钟
总计 846
浏览

需求


Nginx 作为负载均衡服务器,用户请求先到达 Nginx,再由 Nginx 根据负载配置将请求分发至 Tomcat 服务器。

  • Tomcat 服务器一:192.168.127.130:8080
  • Tomcat 服务器二:192.168.127.130:8081
  • Tomcat 服务器三:192.168.127.130:8082
  • Nginx 反向代理服务器:192.168.127.130

什么是反向代理和负载均衡


反向代理可以防止外网对内网服务器的恶性攻击、缓存以减少服务器的压力和访问安全控制之外,还可以进行负载均衡,将用户请求分配给多个服务器

负载均衡是一种用于优化资源利用率,最大化吞吐量,减少延迟和确保容错配置的常用技术。可以将 Nginx 用作非常有效的 HTTP 负载平衡器,以将流量分配到多个应用程序服务器,并使用 Nginx 改善 Web 应用程序的性能,可伸缩性和可靠性。

部署 Tomcat 集群


使用 Docker Compose 编排部署应用容器。服务器地址:192.168.127.130

创建 docker-compose.yml,定义 Tomcat 服务集群,分别对外映射端口 8080,8081 和 8082:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '3'
services:
tomcat1:
image: tomcat
container_name: tomcat1
ports:
- 8080:8080
tomcat2:
image: tomcat
container_name: tomcat2
ports:
- 8081:8080
tomcat3:
image: tomcat
container_name: tomcat3
ports:
- 8082:8080

启动容器

1
$ docker-compose up -d

Nginx 自带的负载均衡机制


默认(轮询):对应用程序服务器的请求以轮询方式分发:

1
2
3
4
5
upstream tomcatServers {
server 192.168.127.130:8080;
server 192.168.127.130:8081;
server 192.168.127.130:8082;
}

minimum_conn(最少连接):将下一个请求分配给活动连接数量最少的服务器:

1
2
3
4
5
6
upstream tomcatServers {
minimum_conn;
server 192.168.127.130:8080;
server 192.168.127.130:8081;
server 192.168.127.130:8082;
}

ip-hash(会话持久性):—哈希函数用于确定应为下一个固定请求选择哪个服务器(基于客户端的IP地址),解决 session 的问题

1
2
3
4
5
6
upstream tomcatServers {
ip_hash;
server 192.168.127.130:8080;
server 192.168.127.130:8081;
server 192.168.127.130:8082;
}

相关配置说明

  • weight:默认值为 1,值越大,负载的权重就越大
  • down:表示当前的 server 暂时不参与负载
  • max_fails:允许请求失败的次数默认为 1 当超过最大次数时,返回 proxy_next_upstream 模块定义的错误
  • fail_timeout:触发 max_fails 后暂停的时间,过了这段时间,重新探测故障服务器是否可用
  • backup:其它所有的非 backup 机器 down 或者忙的时候,请求 backup 机器。所以这台机器压力会最轻

部署 Nginx


创建 docker-compose.yml,挂载 nginx.conf 文件,对外映射端口 80:

1
2
3
4
5
6
7
8
9
10
version: '3.1'
services:
nginx:
restart: always
image: nginx
container_name: nginx
ports:
- 80:81
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf

配置 Nginx

在 docker-compose.yml 同目录下创建 nginx.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
32
33
34
35
user  nginx;
worker_processes 1;

events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

# 服务器集群,weight是权重的意思,权重越大,分配的概率越大
upstream tomcatServers {
minimum_conn;
server 192.168.127.130:8080 weight = 10;
server 192.168.127.130:8081 weight = 10;
server 192.168.127.130:8082 weight = 10;
}

server {
listen 81;
location / {
# 配置反向代理地址
proxy_pass http://tomcatServers;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
}
}

启动容器

1
$ docker-compose up -d

访问 http://192.168.127.130

更多干货请移步:https://antoniopeng.com


如果你喜欢这个博客或发现它对你有用,欢迎你点击右下角 “OPEN CHAT” 进行评论。也欢迎你分享这个博客,让更多的人参与进来。如果在博客中使用的图片侵犯了您的版权,请联系博主删除它们。谢谢你!