Docker环境下Nginx代理Node.js应用80/443端口配置求助
Troubleshooting Nginx-Proxy 503 Error When Using Port 80/443
我来帮你搞定这个nginx-proxy返回503的问题!先从你给出的配置里揪出几个关键问题,再给你调整后的正确配置:
你当前配置里的核心问题
- 端口不匹配:你的Node应用实际监听8080端口(Dockerfile里
EXPOSE 8080),但docker-compose里却expose: - 80,nginx-proxy默认会尝试连接容器的80端口,找不到服务自然返回503。 - 路径混乱:Dockerfile里的工作目录是
./home/username/website/production,但docker-compose的volumes把本地./home/user/website挂载到容器的/home/user/website,路径不匹配可能导致应用启动异常。 - 不必要的端口映射:用nginx-proxy的话,不需要把容器的8080端口映射到宿主机——代理容器会通过内部Docker网络直接访问你的应用,映射反而可能和nginx-proxy占用的80/443端口冲突。
- 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
额外排查步骤
- 确认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 - 检查应用容器状态:
用docker logs <你的网站容器名>查看应用启动日志,确认没有报错,且应用确实在8080端口监听。 - 查看nginx-proxy日志:
用docker logs nginx-proxy查看代理日志,如果有连接被拒绝的信息,说明代理无法访问你的应用容器,可能是网络或端口配置问题。 - 验证域名解析和防火墙:
确保domain.com已经正确解析到你的宿主机IP,同时宿主机的防火墙/安全组已经开放80和443端口。
内容的提问来源于stack exchange,提问作者user2881196
相关产品推荐
相关产品推荐

