Nginx 作 WebService 反向代理

WebService 对外提供 SOAP 接口,SOAP 接口基于 HTTP + XML,因此,可以使用 Nginx 作用 WebService 的反向代理,以实现 WebService 请求的负载均衡功能。

本文使用 docker-compose 部署 nginx,有关 docker-compose 的使用,可以参考 《Docker Compose 入门教程》

文件目录结构如下:

1
2
3
4
5
6
7
.
├── conf.d
│ └── ksb.conf
├── docker-compose.yml
└── log
├── access.log
└── error.log

其中,

  • ksb.conf:nginx 的 server 配置文件
  • docker-compose.yml:docker-compose 使用
  • access.log:nginx 访问日志
  • error.log:nginx 异常日志

docker-compose.yml 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
version: '3'
services:
nginx:
image: docker.io/nginx:alpine
container_name: nginx
restart: always
ports:
- "7000:8080"
environment:
TZ : 'Asia/Shanghai'
volumes:
- /home/lihao/docker/nginx/conf.d:/etc/nginx/conf.d
- /home/lihao/docker/nginx/log:/var/log/nginx

其中,

  • environmentTZ : 'Asia/Shanghai' 用于正确设置时区,避免 nginx 日志打印时间不正确
  • volumes:方便直接在宿主机设置 nginx 配置文件,以及查看 nginx 输出日志
  • ports:设置端口映射,方便在外部使用 7000 端口访问 nginx

Nginx 的 server 配置 ksb.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
upstream router {
server 10.88.115.114:5555 weight=2;
server 10.88.115.137:80 weight=1;
}

server {
listen 8080;
server_name 10.88.115.137;
charset utf-8;

proxy_intercept_errors on;
location / {
proxy_pass http://router;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
proxy_set_header Via "nginx";
proxy_read_timeout 660;
proxy_connect_timeout 10;
proxy_send_timeout 60;
}
}

重点关注几个配置项:

  • upstream:用于配置 nginx 后端服务器(即 upstream,上游服务器),这里我们配置了两个后端服务器,并设置转发的权重分别为 2 和 1
  • proxy_pass:配置代码转发,即使用上面 upstream router 作为后端服务器转发
  • proxy_read_timeout:nginx 与后端服务器连接成功后,后端服务器响应的超时时间,即后端服务器处理请求的超时时间,由于后端服务器处理请求的最长时间为 600 秒,这里设置 660 秒
  • proxy_connect_timeout:nginx 与后端服务器连接的超时时间
  • proxy_send_timeout:后端服务器完成请求处理后,传输完整数据的超时时间

先启动两个后端服务器,这两个后端服务器均对处提供 WebService 接口。然后使用 docker-compose up -d 启动 nginx 作为 WebService 接口反向代理。

客户端访问 nginx ,可以看到客户端 WebService 请求被正常转发到了两个 WebService 后端服务器处理,然后客户端通过 nginx 正常获取了后端服务器的返回结果。

参考资料