在我使用nginx的小型虚拟主机配置中,我遇到了一个新问题。
我试图设置一个";CCD_ 1";使用server_name
通配符的每个虚拟主机的子域
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标头来设置server_name
,从而决定终止SSL需要哪个证书和密钥。这就是为什么变量和映射永远不会工作的原因,因为在nginx需要读取证书的时候,它们还不可能存在。
(我相信OpenResty中有一些Lua函数可以处理证书处理,但我认为这更多的是关于证书生命周期,而不是根据每个请求动态选择一个。(
实现这一点的方法是编写conf生成脚本,使用perl、python、bash或任何您熟悉的工具。描述一个只需要给定域名的通用webmail
0块模板,并为每个域生成该模板的副本。它们可以全部放在一个文件中,也可以是单独文件中的include
d,无论什么对您都有效。
提示:如果用点前缀命名conf文件,如.server-tpl.conf
,则它将被通常的include conf.d/*.conf
忽略。这样,您可以将此模板与其他conf文件一起保存,但只加载填充的副本。