Nginx 中的行顺序是否重要?

Sar*_*rya 7 nginx lets-encrypt ssl-certificate-renewal

我有一个这样的服务器文件

server {
listen 80;
server_name subdomain.example.com;

return 301 https://$server_name$request_uri;

location /.well-known/acme-challenge {
        root /var/www/letsencrypt;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在当我尝试sudo letsencrypt renew. 它抛出并错误说 can't find .well-known/acme-challenge。但是一旦我评论该return 301行就重新启动了服务器并且它起作用了。

现在我想重新测试它把位置放在第一位而不是评论返回 301 语句,但它说certificate not due for renewal。所以问题是读取文件的顺序,重要吗?并且不会因为我这个原因自动更新,那些更新的你如何处理这种情况?

iwa*_*rue 6

在这种情况下,它不是排序(关于如何评估位置和正则表达式的一个很好的解释可以在这里找到:https : //www.digitalocean.com/community/tutorials/understanding-nginx-server-and-位置块选择算法)。

对于位置块之类的东西,简短版本是最佳匹配获胜,而不是第一次匹配。

但是,在您的情况下,订单很重要,因为您使用 return. 根据https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return

停止处理并将指定的代码返回给客户端。非标准代码 444 关闭连接而不发送响应头。

这里的关键是一个 return立即停止处理/评估,所以发生的事情是 nginx 没有查看下面的任何内容return

所以你只需要移动它 return子句到您的位置块下方即可。

至于测试,我会尝试添加--test-cert到您的命令行(请参阅https://certbot.eff.org/docs/using.html#certbot-command-line-options)。

这应该可以避免您在尝试使用他们的生产服务器时遇到的“问题”,该服务器报告您拥有有效证书并且现在不需要新证书。