使用Nginx容器反向代理Xibo-CMS时出现TOO_MANY_REDIRECTS问题求助
问题解决:Xibo-CMS Docker部署+Nginx SSL代理重定向循环及容器名跳转问题
核心问题分析
- TOO_MANY_REDIRECTS循环:当设置
Host $host时,Xibo-CMS收到的是Nginx转发的HTTP请求,它会强制重定向到HTTPS,但Nginx又将HTTPS请求转成HTTP发给CMS,形成死循环。 - URL跳转到容器名:不设置
Host头时,CMS会用容器内部的服务名生成外部访问URL,导致浏览器无法识别。
解决方案步骤
1. 修正Nginx配置文件
调整代理头,让CMS识别HTTPS请求,同时用固定服务名替代随机容器名:
upstream docker-xibo { server cms-web:80; # 改用docker-compose服务名,而非容器生成的随机名 } # HTTP强制跳转HTTPS(替换原有if判断写法,更规范) server { listen 80; server_name display.mydomain.com; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name display.mydomain.com; ssl_certificate /etc/ssl/certs/STAR_mydomain.com.pem; ssl_certificate_key /etc/ssl/certs/STAR_mydomain.com.pem; location / { proxy_pass http://docker-xibo; proxy_redirect off; # 必须设置Host头,确保CMS生成正确的外部域名URL proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 关键:告诉CMS请求是通过HTTPS进入的,避免重定向循环 proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-Host $host; } }
2. 修正config.env关键配置
确保CMS知道自己的外部访问地址,并信任Nginx代理:
# 必须设置为你的HTTPS域名 CMS_URL=https://display.mydomain.com # 信任Docker内部网络的代理请求,可设为0.0.0.0/0或Nginx容器所在子网 TRUSTED_PROXIES=0.0.0.0/0 # 配置XMR的外部访问地址 XMR_PUBLIC_ADDRESS=wss://display.mydomain.com:9505/ws
3. 优化Docker-Compose网络(可选但推荐)
添加自定义网络,确保所有服务在同一网络内稳定通信:
version: "2.1" networks: xibo-network: driver: bridge services: proxy: image: nginx:1.23.2-alpine volumes: - ./conf/:/etc/nginx/conf.d/ - /etc/ssl/certs/STAR_mydomain.com.pem:/etc/ssl/certs/STAR_mydomain.com.pem ports: - "443:443" - "80:80" restart: always networks: - xibo-network cms-db: image: mysql:5.7 volumes: - "./shared/db:/var/lib/mysql:Z" environment: - MYSQL_DATABASE=cms - MYSQL_USER=cms - MYSQL_RANDOM_ROOT_PASSWORD=yes mem_limit: 1g env_file: config.env restart: always networks: - xibo-network cms-xmr: image: xibosignage/xibo-xmr:0.9 ports: - "9505:9505" restart: always mem_limit: 256m env_file: config.env networks: - xibo-network cms-web: image: xibosignage/xibo-cms:release-3.2.1 volumes: - "./shared/cms/custom:/var/www/cms/custom:Z" - "./shared/backup:/var/www/backup:Z" - "./shared/cms/web/theme/custom:/var/www/cms/web/theme/custom:Z" - "./shared/cms/library:/var/www/cms/library:Z" - "./shared/cms/web/userscripts:/var/www/cms/web/userscripts:Z" - "./shared/cms/ca-certs:/var/www/cms/ca-certs:Z" restart: always links: - cms-db:mysql - cms-xmr:50001 environment: - XMR_HOST=cms-xmr - CMS_USE_MEMCACHED=true - MEMCACHED_HOST=cms-memcached env_file: config.env mem_limit: 1g networks: - xibo-network cms-memcached: image: memcached:alpine command: memcached -m 15 restart: always mem_limit: 100M networks: - xibo-network cms-quickchart: image: ianw/quickchart restart: always networks: - xibo-network
验证操作
- 重启Nginx容器:
docker-compose restart proxy - 重启CMS相关容器:
docker-compose restart cms-web cms-xmr - 访问
https://display.mydomain.com检查是否正常加载,无重定向循环及容器名跳转问题
内容的提问来源于stack exchange,提问作者tba
相关产品推荐
相关产品推荐

