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

Posted by 彭超 on 2019-09-30
Estimated Reading Time 3 Minutes
Words 821 In Total
Viewed Times

需求

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

  • tomcat 服务器 1:192.168.127.130:8080
  • tomcat 服务器 2:192.168.127.130:8081
  • tomcat 服务器 3:192.168.127.130:8082
  • nginx 反向代理服务器:192.168.127.130

什么是反向代理

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

负载均衡

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

部署 Tomcat 集群

创建 docker-compose.yml,定义 tomcat 服务集群,分别对外映射端口 808080818082

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

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


If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !