如何使用nginx-proxy配置无二级域名的Docker容器?
问题描述
我有多个Docker容器服务,全部部署在nginx-proxy/nginx-proxy反向代理之后,所有服务都在不同二级域名上运行,HTTPS功能正常。
现在尝试部署一个用Nginx提供静态网站的容器,直接使用主域名而非二级域名,但始终无法正常运行。
最简docker-compose.yml配置
version: "3" services: example: image: nginx expose: - 80 - 443 restart: unless-stopped environment: VIRTUAL_HOST: domain.tld LETSENCRYPT_HOST: domain.tld container_name: example volumes: - ./content:/usr/share/nginx/html networks: default: external: name: nginx-proxy
异常现象
- 使用主域名时,HTTP和HTTPS访问均返回500内部服务器错误
- 将
VIRTUAL_HOST和LETSENCRYPT_HOST改为subdomain.domain.tld,HTTP和HTTPS均正常工作 - 添加端口映射后:
ports: - "8003:80" - "8443:443"- 可通过
http://domain.tld:8003访问网站 https://domain.tld:8443连接失败https://domain.tld仍返回500错误http://domain.tld会重定向到https://domain.tld
- 可通过
解决方案
1. 检查nginx-proxy配置冲突
nginx-proxy会自动生成反向代理配置,主域名访问失败大概率是配置冲突或生成异常:
- 进入nginx-proxy容器查看生成的配置文件:
检查是否存在针对docker exec -it nginx-proxy cat /etc/nginx/conf.d/default.confdomain.tld的配置块,确认有无语法错误或重复的server_name配置。
2. 调整容器暴露端口
静态网站容器不需要暴露443端口,HTTPS由nginx-proxy统一处理,容器内部仅需提供HTTP服务。修改expose配置:
expose: - 80
3. 清理SSL证书与配置缓存
如果主域名有过错误配置,可能导致证书或缓存异常:
- 重启nginx-proxy和letsencrypt容器:
docker restart nginx-proxy letsencrypt-nginx-proxy-companion - 删除主域名的旧证书(若存在):
docker exec -it nginx-proxy rm /etc/nginx/certs/domain.tld.*
4. 检查静态网站容器日志
查看容器内Nginx的运行日志,排查内部错误:
docker logs example
常见问题如./content目录权限不足,可调整权限:
chmod -R 755 ./content chown -R 101:101 ./content # 101是Nginx容器默认UID/GID
5. 验证网络配置
确认静态网站容器已正确加入nginx-proxy外部网络:
docker inspect example | grep Networks
若未加入,重新启动容器或检查docker-compose.yml的网络配置。
内容的提问来源于stack exchange,提问作者08915bfe02
相关产品推荐
相关产品推荐

