在我的 nginx 小虚拟主机配置中,我遇到了一个新问题。
我尝试使用 server_name
通配符为我的每一个虚拟主机设置一个“webmail
”子域
server_name ~^(webmail\.)?(?<domain>.+)$;
由于我的所有域都有自己的 ssl 证书,我也想为 webmail 子域使用正确的证书。证书配置为通配符证书,如 *.domain1.com
等。
因此 webmail.domain1.com
应使用 *.domain1.com
的证书,而 webmail.domain2.net
应使用 *.domain2.net
证书。
我尝试了以下作为第一个猜测,但无法启动 nginx,因为它不接受路径中的变量:
ssl_certificate /etc/letsencrypt/live/$domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/$domain/privkey.pem;
有没有办法通过覆盖所有 webmail.*
子域的单个配置文件来实现此配置?
最佳答案
是的,但不是你希望的那样......
您遇到的问题是,nginx 需要先终止 SSL,然后才能读取流内容以获取 Host header ,以设置 server_name
来决定终止 SSL 需要哪个证书和 key 。这就是为什么变量和映射永远不会起作用,因为当 nginx 需要读取证书时它们还不存在。
(我相信 OpenResty 中有处理证书处理的 Lua 函数,但我认为这更多的是关于证书生命周期,而不是为每个请求即时选择一个您想要的证书。)
实现这一目标的方法是使用 perl、python、bash 等您喜欢的任何方式编写conf 生成脚本。描述一个通用的server
block 模板,只需要给定域名,并为每个域生成一个副本。它们可以全部包含在一个文件中,也可以从单独的文件中包含
,只要适合您即可。
提示:如果您使用点前缀命名conf文件,例如.server-tpl.conf
,那么它将被通常的include忽略conf.d/*.conf
。这样,您可以将此模板与其他 conf 文件放在一起,但只会加载填充的副本。
关于ssl - nginx使用不同的证书配置通配符域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63379362/