此前,网络架构上使用入口 Nginx + Kong,相关配置简单,可快速上手。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 入口 Nginx 配置实例
server {
listen 443 ssl;
ssl_certificate ……;
ssl_certificate_key ……;
server_name *.fangcha.net;

location / {
proxy_read_timeout 300;
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
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 $scheme;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header Host $host;
}
}

但伴随业务服务规模上升,存在以下不便

  1. 网关宿主机需要额外安装 Nginx
  2. Nginx 配置及证书文件需要存放在宿主机中,迁移不便
  3. 需配置的证书、网关机器较多时,Nginx 配置维护复杂度上升

在新增、调整网关机器时,额外的琐碎工作较多。

入口 Nginx 工作:

  1. 将 HTTP 流量强制重定向为 HTTPS
  2. 维护各域名 SSL 证书及 Nginx 配置
  3. 流量转发到 Kong

直接由 Kong 去接管入口 Nginx 的工作,是一个可行的方案

  1. 《Kong Route - 强制使用 HTTPS》,可以对 Kong Route 进行设置使其支持强制 HTTPS
  2. 《Kong Admin API - Certificates》,可以直接在 Kong 中配置 SSL 证书
  3. 将 80 端口映射到容器 8000 端口,443 端口映射到容器 8443 端口启动 Kong
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
docker run -d --restart=unless-stopped \
--name kong \
-p 80:8000 \
-p 443:8443 \
-p 8001:8001 \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=${KONG_PG_HOST}" \
-e "KONG_PG_DATABASE=kong" \
-e "KONG_PG_USER=${KONG_PG_USER}" \
-e "KONG_PG_PASSWORD=${KONG_PG_PASSWORD}" \
-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001" \
kong/kong-gateway:3.0.0.0-alpine