You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Docker+Nginx反向代理对接本地Node服务解决502报错

配置方案说明

方案1:前后端服务运行在宿主机(符合你最初的需求)

报错原因

  1. Nginx的Dockerfile中COPY指令的目标路径末尾多了斜杠,会把配置文件错误写入目录而非覆盖默认配置,导致配置不生效
  2. 原生Linux系统的Docker默认不支持host.docker.internal地址,需要显式配置宿主机映射
  3. Node服务默认绑定127.0.0.1,仅能本地访问,Docker容器无法通过宿主机IP访问该端口
  4. 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容器内(你修改后的配置修正)

报错原因

  1. 配置的API构建路径为./api,但实际代码存放在./server目录,容器内未正确加载代码导致服务启动失败
  2. Fastify服务未绑定0.0.0.0,容器内的回环地址无法被其他容器访问
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:24:08