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

时间:2017-08-15 08:52:26

标签: 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  /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
}

有没有办法缩短这个 - 因为当我必须添加一个新域并且只更改我的域名不同的3行时,我正在克隆如此巨大的代码blcok。我想过某种参数化,比如(不知道正确的语法):

SERVER_NAME = {request_server_name}
ssl_certificate  /etc/nginx/ssl/${SERVER_NAME}.chained.crt;
ssl_certificate_key  /etc/nginx/ssl/${SERVER_NAME}.key;
这可能吗?怎么样?

1 个答案:

答案 0 :(得分:1)

你可以做两件事

多域SAN证书

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

使用OpenRestry或Nginx + LUA

您可以在支持LUA的情况下使用OpenResty或Nginx,并使用相同的ssl_certificate_by_lua_block指令。

  

语法:ssl_certificate_by_lua_block {lua-script}

     

context:server

     

阶段:SSL之前握手

     

当NGINX即将启动下游SSL(https)连接的SSL握手时,该指令运行用户Lua代码。

     

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

https://github.com/openresty/lua-nginx-module#ssl_certificate_by_lua_block

另见一些示例实现的文章

https://medium.com/@mtourne/how-to-use-nginx-for-ssl-termination-for-any-domain-dc2e2c630058

https://blog.readme.io/auto-generating-ssl-certificates-for-custom-domains-using-lets-encrypt/