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

Docker环境下Nginx代理Node.js应用80/443端口配置求助

Troubleshooting Nginx-Proxy 503 Error When Using Port 80/443

我来帮你搞定这个nginx-proxy返回503的问题!先从你给出的配置里揪出几个关键问题,再给你调整后的正确配置:

你当前配置里的核心问题

  1. 端口不匹配:你的Node应用实际监听8080端口(Dockerfile里EXPOSE 8080),但docker-compose里却expose: - 80,nginx-proxy默认会尝试连接容器的80端口,找不到服务自然返回503。
  2. 路径混乱:Dockerfile里的工作目录是./home/username/website/production,但docker-compose的volumes把本地./home/user/website挂载到容器的/home/user/website,路径不匹配可能导致应用启动异常。
  3. 不必要的端口映射:用nginx-proxy的话,不需要把容器的8080端口映射到宿主机——代理容器会通过内部Docker网络直接访问你的应用,映射反而可能和nginx-proxy占用的80/443端口冲突。
  4. LETSENCRYPT_EMAIL格式错误:你填的是domain.com,这必须是真实的邮箱地址,Let's Encrypt需要用来发送证书通知。

修正后的配置文件

Dockerfile

FROM node:carbon
# 创建应用目录,去掉开头的./让路径更规范
WORKDIR /home/username/website/production
# 拷贝依赖配置文件
COPY package*.json ./
# 安装依赖
RUN npm install
# 拷贝应用源码
COPY . .
# 暴露应用实际监听的端口
EXPOSE 8080
# 启动应用
CMD [ "npm", "start" ]

docker-compose.yml

version: "3"
services:
  website:
    build: .
    volumes:
      # 把本地代码挂载到容器的工作目录,保持路径一致
      - .:/home/username/website/production
      # 用匿名卷挂载node_modules,避免本地空目录覆盖容器内安装的依赖
      - /home/username/website/production/node_modules
    # 移除宿主机端口映射,交给nginx-proxy处理
    # 暴露应用实际监听的8080端口
    expose:
      - 8080
    environment:
      VIRTUAL_HOST: domain.com
      # 关键!告诉nginx-proxy要连接容器的8080端口,而不是默认的80
      VIRTUAL_PORT: 8080
      LETSENCRYPT_HOST: domain.com
      # 替换成你的真实邮箱
      LETSENCRYPT_EMAIL: your-real-email@domain.com
    networks:
      default:
        external:
          name: nginx-proxy

额外排查步骤

  1. 确认nginx-proxy容器配置正确:
    确保nginx-proxy和acme-companion容器正确启动并绑定了宿主机的80/443端口,启动命令参考:
    # 启动nginx-proxy
    docker run -d -p 80:80 -p 443:443 --name nginx-proxy \
      -v /etc/nginx/certs \
      -v /etc/nginx/vhost.d \
      -v /usr/share/nginx/html \
      -v /var/run/docker.sock:/tmp/docker.sock:ro \
      jwilder/nginx-proxy
    
    # 启动Let's Encrypt companion容器
    docker run -d --name nginx-proxy-acme \
      --volumes-from nginx-proxy \
      -v /var/run/docker.sock:/var/run/docker.sock:ro \
      -e "DEFAULT_EMAIL=your-real-email@domain.com" \
      jrcs/letsencrypt-nginx-proxy-companion
    
  2. 检查应用容器状态:
    用docker logs <你的网站容器名>查看应用启动日志,确认没有报错,且应用确实在8080端口监听。
  3. 查看nginx-proxy日志:
    用docker logs nginx-proxy查看代理日志,如果有连接被拒绝的信息,说明代理无法访问你的应用容器,可能是网络或端口配置问题。
  4. 验证域名解析和防火墙:
    确保domain.com已经正确解析到你的宿主机IP,同时宿主机的防火墙/安全组已经开放80和443端口。

内容的提问来源于stack exchange,提问作者user2881196

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:41:20