如何配置Docker+Nginx反向代理对接本地Node服务解决502报错
配置方案说明
方案1:前后端服务运行在宿主机(符合你最初的需求)
报错原因
- Nginx的Dockerfile中COPY指令的目标路径末尾多了斜杠,会把配置文件错误写入目录而非覆盖默认配置,导致配置不生效
- 原生Linux系统的Docker默认不支持
host.docker.internal地址,需要显式配置宿主机映射 - Node服务默认绑定
127.0.0.1,仅能本地访问,Docker容器无法通过宿主机IP访问该端口 proxy_pass未加末尾斜杠,会将/api/前缀一同转发给后端服务,导致路由匹配错误
正确配置
docker-compose.yml
version: '3.9' services: reverse-proxy: build: ./nginx ports: - "4000:8080" # Windows/macOS可删除下面这行配置,Linux系统必须保留 extra_hosts: - "host.docker.internal:host-gateway"
nginx/Dockerfile
FROM nginx:1.21.3 # 去掉目标路径末尾的斜杠,直接覆盖配置文件 COPY ./default.conf /etc/nginx/conf.d/default.conf
nginx/default.conf
server { listen 8080; # 转发请求到宿主机运行的SvelteKit开发服务,端口按需修改 location / { proxy_pass http://host.docker.internal:5173/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 转发请求到宿主机运行的Fastify API服务 location /api/ { # 末尾斜杠会自动移除匹配到的/api/前缀,后端不需要额外加/api路由前缀 proxy_pass http://host.docker.internal:3000/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
额外操作要求
- Fastify启动时添加
--host 0.0.0.0参数,绑定到所有网卡地址 - SvelteKit启动时添加
--host 0.0.0.0参数,绑定到所有网卡地址
方案2:API服务运行在Docker容器内(你修改后的配置修正)
报错原因
- 配置的API构建路径为
./api,但实际代码存放在./server目录,容器内未正确加载代码导致服务启动失败 - Fastify服务未绑定
0.0.0.0,容器内的回环地址无法被其他容器访问 proxy_pass未加末尾斜杠,路径转发错误
修正后配置
docker-compose.yml
version: '3.8' services: nginx: image: nginx:1.19.4 volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf ports: - '4000:8080' depends_on: - api # 保留该配置用于访问宿主机运行的前端服务 extra_hosts: - "host.docker.internal:host-gateway" api: # 改为实际代码存放的server目录 build: ./server volumes: - ./server/src:/home/usr/app/src ports: - "3000:3000"
nginx/default.conf
server { listen 8080; # 转发到宿主机运行的前端服务 location / { proxy_pass http://host.docker.internal:5173/; proxy_set_header Host $host; } # 转发到容器内的API服务 location /api/ { proxy_pass http://api:3000/; proxy_set_header Host $host; } }
server/Dockerfile(将原api目录的Dockerfile移动到server目录下)
FROM node:16.9.0 WORKDIR /home/usr/app COPY package*.json ./ RUN npm ci COPY . . EXPOSE 3000 # 启动时绑定0.0.0.0 CMD ["node", "--host", "0.0.0.0", "src/app.js"]
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

