我有一个这样的服务器文件
server {
listen 80;
server_name subdomain.example.com;
return 301 https://$server_name$request_uri;
location /.well-known/acme-challenge {
root /var/www/letsencrypt;
}
}
现在当我尝试sudo letsencrypt renew
. 它抛出并错误说找不到.well-known/acme-challenge
。但是,一旦我发表评论,该return 301
行就重新启动了服务器并且它起作用了。
现在我想重新测试它,将位置放在首位,而不是评论 return 301 语句,但它说certificate not due for renewal
。所以问题是读取文件的顺序,这有关系吗?并且不会因为这个原因自动更新,对于我来说,更新的人如何处理这种情况?
在这种情况下,与其说是排序(关于如何评估位置和正则表达式的一个很好的解释可以在这里找到:https ://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-位置块选择算法)。
对于像位置块这样的东西,简短的版本是最佳匹配获胜,而不是第一场比赛。
但是,在您的情况下,订单很重要,因为您使用
return
. 根据https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return:这里的关键是 a
return
立即停止处理/评估,所以发生的事情是 nginx 没有在下面查看任何内容return
。因此,您只需将该
return
子句移到您的位置块下方。至于测试,我会尝试添加
--test-cert
到您的命令行(请参阅https://certbot.eff.org/docs/using.html#certbot-command-line-options)。这应该避免您在尝试使用他们的生产服务器时遇到的“问题”,该服务器报告您拥有有效的证书并且现在不需要新证书。
您应该将
return
指令包含在一个location
块中,然后使用正常的location
块匹配规则:answering for the idea of line orders in nginx config files
是的,它确实并且完全取决于 Nginx 支持的不同上下文中指定的不同指令。通俗的说,nginx 有一堆事情要做,并分别应用某些算法
best match
。Nginx 用于在上下文
selection algorithm
中做出决策;server
主要基于两个指令,即。listen
和server_name
。可以定义多个位置上下文,每个位置用于处理某种类型的客户端请求,并且通过将位置定义与客户端请求匹配来选择每个位置
selection algorithm
。默认情况下,
upstream
上下文使用round-robin
来确定将请求交给哪个特定服务器。