# conf.d/default.conf
server {
listen 80;
# /api1/a/b --> /api1/a/b
location /api1/ {
# 当希望访问宿主机上服务时,就用 host.docker.internal
# 文档见 https://docs.docker.com/desktop/networking/#use-cases-and-workarounds-for-all-platforms
# We recommend that you connect to the special DNS name host.docker.internal which resolves to the internal IP address used by the host.
# 我们刚才本地启动的 express 服务就是在 3000 端口上
proxy_pass http://host.docker.internal:3000;
}
# /api2/a/b --> /a/b
location /api2/ {
proxy_pass http://host.docker.internal:3000/;
}
# /api3/a/b --> /xxx/a/b
location /api3/ {
proxy_pass http://host.docker.internal:3000/xxx/;
}
}
NGINX 中的 proxy_pass 可以转发请求,文档见 https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass 。
直接看测试结果
本地测试环境搭建
因为 proxy_pass 文档上示例和解释较少,就想着干脆自己本地测试一下算了,跑一个后端服务,再跑一个 NGINX 就行了。
先参考 https://expressjs.com/en/starter/hello-world.html 用 express 启动一个后端服务。
启动成功后访问 http://localhost:3000/api/a/b 会显示 path 为
/api/a/b
。然后用 docker compose 来启动 NGINX ,需要本地先安装好 docker ,然后新建
docker-compose.yml
,内容如下:再新建文件夹
conf.d
,在文件夹中新建文件default.conf
,内容如下:执行
docker compose up -d
启动 NGINX ,然后访问 http://localhost:8080/api1/a/b 和 http://localhost:8080/api2/a/b 和 http://localhost:8080/api3/a/b 可以看到不同返回值。PS:如果修改了
conf.d/default.conf
文件,需要执行docker restart my-nginx
来让配置生效。如果要停止 NGINX 服务,执行docker compose down
。补充:NGINX 配置文件中怎么使用环境变量
实际使用时,需要转发的地址一般是定义在环境变量中的,参考 https://github.com/docker-library/docs/tree/master/nginx#using-environment-variables-in-nginx-configuration-new-in-119 处理即可。