通过Laravel Forge在Nginx后自托管Plausible时出现ERR_TOO_MANY_REDIRECTS错误
问题:自托管Plausible社区版遇到重定向循环与证书验证文件读取错误
环境与操作背景
- 拥有
.app域名,通过Laravel Forge+Hetzner托管主PHP应用 - 自托管Plausible社区版(plausible-ce),已完成以下操作:
- 克隆仓库并更新
.env文件:添加密钥、设置BASE_URL=sub.domain.app、指定HTTP_PORT=8000、HTTPS_PORT=443 - 添加
compose.override.yml配置:services: plausible: ports: - 8000:${HTTP_PORT} - 安装certbot配置SSL证书,创建Nginx配置文件并建立符号链接,重启Nginx后运行
docker compose up -d,容器状态正常
- 克隆仓库并更新
错误现象
- 访问
sub.domain.app出现ERR_TOO_MANY_REDIRECTS错误 - 容器日志显示证书有效期正常,但存在文件读取错误:
Request: GET /.well-known/acme-challenge/ ** (exit) an exception was raised: ** (File.Error) could not read file "/var/lib/plausible/site_encrypt/certbot/acme-v02.api.letsencrypt.org/webroot/.well-known/acme-challenge": no such file or directory (elixir 1.18.3) lib/file.ex:385: File.read!/1 (site_encrypt 0.6.0) lib/site_encrypt/acme_challenge.ex:12: SiteEncrypt.AcmeChallenge.call/2 (plausible 0.0.1) lib/plausible_web/endpoint.ex:1: PlausibleWeb.Endpoint.plug_builder_call/2 (plausible 0.0.1) lib/plausible_web/endpoint.ex:1: PlausibleWeb.Endpoint."call (overridable 3)"/2 (plausible 0.0.1) lib/plausible_web/endpoint.ex:1: PlausibleWeb.Endpoint.call/2 (plug_cowboy 2.7.3) lib/plug/cowboy/handler.ex:11: Plug.Cowboy.Handler.init/2 (cowboy 2.13.0) /app/deps/cowboy/src/cowboy_handler.erl:37: :cowboy_handler.execute/2 (cowboy 2.13.0) /app/deps/cowboy/src/cowboy_stream_h.erl:310: :cowboy_stream_h.execute/3
现有Nginx配置(/etc/nginx/sites-enabled/plausible)
server { listen 80; listen [::]:80; server_name sub.domain.app; location /.well-known/acme-challenge/ { root /var/lib/plausible/site_encrypt/certbot/acme-v02.api.letsencrypt.org/webroot/; try_files $uri =404; } # Redirect all HTTP traffic to HTTPS return 301 https://$host$request_uri; } server { listen 443 ssl; listen [::]:443 ssl ipv6only=on; server_name sub.domain.app; # SSL configuration (handled by Certbot) ssl_certificate /etc/letsencrypt/live/sub.domain.app/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/sub.domain.app/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Main proxy pass for Plausible location / { proxy_pass http://127.0.0.1:8000; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; } # Websocket support location /live/websocket { proxy_pass http://127.0.0.1:8000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; } }
疑问
是否是容器卷无法访问SSL证书及验证文件?或是Plausible容器网络与Forge创建的网络冲突?
解决方案
1. 解决重定向循环问题
重定向循环的核心原因是Plausible自身HTTPS配置与Nginx代理冲突:
- 你已在Nginx层处理SSL,而Plausible的
.env中设置HTTPS_PORT=443会导致内部强制跳转HTTPS,与Nginx代理的HTTP端口形成循环。 - 修改
.env文件:# 禁用Plausible内部HTTPS配置,交由Nginx处理 HTTPS_PORT= ENABLE_HTTPS=false
2. 解决证书验证文件读取错误
日志错误是因为Plausible的site_encrypt模块尝试自行处理ACME验证,但你已通过主机Certbot配置证书:
- 禁用Plausible自动证书功能,在
.env中添加:DISABLE_SITE_ENCRYPT=true - 修正Nginx的ACME验证路径:当前指向容器内路径,主机无法访问,改为Certbot默认webroot路径(如
/var/www/html),并重新生成证书:sudo certbot certonly --webroot -w /var/www/html -d sub.domain.app - 更新Nginx HTTP server块的ACME配置:
location /.well-known/acme-challenge/ { root /var/www/html; try_files $uri =404; }
3. 检查容器权限与网络
- 确认主机上
/var/lib/plausible目录权限,确保容器能正常读写; - Laravel Forge默认网络与Plausible的docker bridge网络无冲突,Nginx通过
127.0.0.1访问容器端口无需额外配置。
4. 重启服务生效
# 验证并重新加载Nginx配置 sudo nginx -t && sudo systemctl reload nginx # 重启Plausible容器 docker compose down && docker compose up -d
内容的提问来源于stack exchange,提问作者Stelios Papamichail
相关产品推荐
相关产品推荐

