Nginx无法为Certbot的ACME挑战提供.well-known文件问题排查
问题分析与解决
你的核心问题是Nginx HTTP server块的指令顺序错误,导致所有HTTP请求都被强制重定向到HTTPS,而HTTPS配置中没有处理ACME挑战的规则,最终返回404。
具体问题点
你当前的HTTP server配置里,return 301是直接写在server块下的顶级指令,Nginx会优先执行这个指令——不管请求是不是匹配/.well-known/acme-challenge/路径,都会被重定向到HTTPS。而HTTPS的server块仅配置了反向代理到localhost:9000,没有对应ACME挑战文件的location规则,所以Let's Encrypt的验证请求跳转到HTTPS后找不到文件,返回404。
修复步骤
1. 修正Nginx HTTP配置
将return 301放到location /块中,确保只有非ACME挑战的请求才会被重定向:
server { listen 80; server_name example.com; # 优先处理ACME挑战请求,不重定向 location ^~ /.well-known/acme-challenge/ { alias /opt/bitnami/apps/letsencrypt/.well-known/acme-challenge/; # 可选:明确指定文件类型,避免MIME类型问题 default_type text/plain; } # 其他所有HTTP请求重定向到HTTPS location / { return 301 https://$server_name$request_uri; } }
2. 验证文件权限
确保Nginx进程有权限读取ACME挑战目录的文件:
# Bitnami的Nginx通常使用daemon用户,设置目录和文件权限 sudo chown -R daemon:daemon /opt/bitnami/apps/letsencrypt/.well-known/acme-challenge/ sudo chmod -R 755 /opt/bitnami/apps/letsencrypt/.well-known/acme-challenge/ sudo chmod 644 /opt/bitnami/apps/letsencrypt/.well-known/acme-challenge/test.html
3. 检查并重启Nginx
# 验证配置语法 sudo nginx -t # 重启Nginx生效 sudo /opt/bitnami/ctlscript.sh restart nginx
4. 测试访问
再次访问http://example.com/.well-known/acme-challenge/test.html,应该能直接看到测试文件内容,不会被重定向到HTTPS。
5. 重新执行证书续期脚本
sudo /opt/bitnami/letsencrypt/lego --path /opt/bitnami/letsencrypt --email="me@example.com" --http --http-timeout 30 --http.webroot /opt/bitnami/apps/letsencrypt --domains=example.com --user-agent bitnami-bncert/2.0.0 renew
内容的提问来源于stack exchange,提问作者kontur
相关产品推荐
相关产品推荐

