在nginx conf中参数化服务器名称

在nginx conf中参数化服务器名称,nginx,Nginx,我有多个域都指向同一个VM。mydomain1.com、mydomain2.com、mydomain3.eu 现在我有一个巨大的nginx.conf,它看起来像这样: server { listen 443 ssl; server_name *.mydomain1.com; ssl on; ssl_certificate /etc/nginx/ssl/mydomain1.com.chained.crt; ssl_certificate_key /

我有多个域都指向同一个VM。mydomain1.com、mydomain2.com、mydomain3.eu 现在我有一个巨大的nginx.conf,它看起来像这样:

server {
    listen 443 ssl;
    server_name   *.mydomain1.com;
    ssl  on;
    ssl_certificate  /etc/nginx/ssl/mydomain1.com.chained.crt;
    ssl_certificate_key  /etc/nginx/ssl/mydomain1.com.key;
    # hundred more lines of rules
}
server {
    listen 443 ssl;
    server_name   *.mydomain2.com;
    ssl  on;
    ssl_certificate  /etc/nginx/ssl/mydomain2.com.chained.crt;
    ssl_certificate_key  /etc/nginx/ssl/mydomain2.com.key;
    # the same hundred more lines of rules
}
server {
    listen 443 ssl;
    server_name   *.mydomain3.eu;
    ssl  on;
    ssl_certificate  /etc/nginx/ssl/mydomain3.eu.chained.crt;
    ssl_certificate_key  /etc/nginx/ssl/mydomain3.eu.key;
    # the same hundred more lines of rules
}
有没有办法缩短这个时间?因为目前我正在克隆一个如此庞大的代码blcok,而我必须添加一个新的域,并且只更改我的域名不同的3行代码。我考虑了一些参数化,比如不知道正确的语法:

SERVER_NAME = {request_server_name}
ssl_certificate  /etc/nginx/ssl/${SERVER_NAME}.chained.crt;
ssl_certificate_key  /etc/nginx/ssl/${SERVER_NAME}.key;

这可能吗?怎么做?

你可以做两件事

多域SAN证书

您可以购买多域SAN证书。允许您在同一证书中使用不同的域。这样你就不必有多个块了。如果您使用的是自签名证书,您仍然可以自己创建SAN证书

使用OpenRestry或Nginx+LUA

您可以将OpenResty或Nginx与LUA支持一起使用,并使用相同的指令

语法:ssl\u certificate\u by\u lua\u block{lua script}

上下文:服务器

阶段:SSL握手之前

当NGINX即将开始下游SSL-https连接的SSL握手时,此指令运行用户Lua代码

它对于在每个请求的基础上设置SSL证书链和相应的私钥特别有用。从远程无阻塞地加载此类握手配置(例如,使用cosocket API)也很有用。我们也可以在纯Lua中对每个请求进行OCSP装订处理

另请参阅下面的文章,了解一些示例实现


常见的代码块应该放在一个单独的文件中,并使用include指令导入。@RichardSmith,请发布您的解决方案作为答案。听起来不错,但我只喜欢nginx。Richard提到的include指令是一个很好的选择。那么你为每个部分创建了多个文件吗?不,创建了一个包含这数百行规则的文件,并将该文件包含在每个服务器{}部分中。哦,好的,明白了。我试图解决与证书相关的另一个问题,但没有意识到主要问题是通用规则。是的,包括是最好的选择。我将把这个答案作为信息保存在这里。虽然这不是你问题的相关解决方案