Certbot在Nginx反向代理环境下执行失败:出现404错误
兄弟,碰到这个http-01挑战的404问题太常见了,我帮你一步步排查解决:
先检查Nginx反向代理的路径规则
你的Nginx可能把所有请求都转发给Mastodon后端了,导致ACME验证需要的.well-known/acme-challenge/路径被拦截。你可以在Nginx的server配置块里加一段专门处理这个路径的规则:location /.well-known/acme-challenge/ { root /var/www/html; allow all; }加完之后重启Nginx(
sudo systemctl restart nginx),这段配置会让Nginx直接读取/var/www/html/.well-known/acme-challenge/下的文件,不经过反向代理,正好匹配Certbot的验证需求。确认80端口是否对外开放
http-01挑战必须通过80端口访问,你先检查服务器的防火墙设置:
运行sudo ufw status看看有没有允许80/tcp的规则,如果没有就执行sudo ufw allow 80/tcp,然后再试Certbot命令。验证域名解析是否正确
确保你的域名pacsa.us确实指向服务器IP 94.23.75.107,你可以在本地运行nslookup pacsa.us或者dig pacsa.us,看看返回的IP是不是和你的服务器一致。有时候解析缓存或者配置错误会导致验证服务器找不到你的机器。手动测试验证路径的可访问性
你可以手动创建一个测试文件来验证:- 先创建目录(如果不存在的话):
sudo mkdir -p /var/www/html/.well-known/acme-challenge/ - 创建测试文件:
echo "test content" | sudo tee /var/www/html/.well-known/acme-challenge/test.txt - 访问
http://pacsa.us/.well-known/acme-challenge/test.txt,如果能看到内容说明路径没问题;如果还是404,检查/var/www/html的权限,执行sudo chown -R www-data:www-data /var/www/html确保Nginx能读取这个目录。
- 先创建目录(如果不存在的话):
换用webroot插件尝试
如果Nginx插件一直有问题,你可以试试Certbot的webroot模式,这个模式不需要修改Nginx配置,只要指定webroot目录就行:certbot certonly --webroot -w /var/www/html -d pacsa.us -v这个命令会把验证文件放到
/var/www/html下,只要Nginx能正常访问这个目录,验证就能通过。
备注:内容来源于stack exchange,提问作者Connor Weston




