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

如何使用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.conf
    
    检查是否存在针对domain.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:25:17