Docker 如何动态设置ssl\U证书的域

Docker 如何动态设置ssl\U证书的域,docker,nginx,lua,openresty,Docker,Nginx,Lua,Openresty,我通过openresty使用lua并设置一个环境变量来动态设置域名。我有: user www-data; worker_processes auto; pid /run/nginx.pid; events { worker_connections 768; } env MYDOMAIN; http { server { listen 80; listen 443 ssl; set_by_lua $MYDOMAIN 'retur

我通过openresty使用lua并设置一个环境变量来动态设置域名。我有:

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 768;
}

env MYDOMAIN;

http {
    server {
        listen 80;
        listen 443 ssl;
        set_by_lua $MYDOMAIN 'return os.getenv("MYDOMAIN")';
        server_name $MYDOMAIN www.$MYDOMAIN;
        location / {
          proxy_pass http://127.0.0.1:5000;
          index  index.html index.htm;
        }
        ssl_certificate /etc/letsencrypt/live/$MYDOMAIN/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/$MYDOMAIN/privkey.pem;    
    }
}
我得到一个错误:

nginx: [emerg] BIO_new_file("/etc/letsencrypt/live/$MYDOMAIN/fullchain.pem") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/letsencrypt/live/$MYDOMAIN/fullchain.pem','r') error:2006D080:BIO routines:BIO_new_file:no such file)

设置服务器名称可以很好地工作,但在ssl证书和ssl证书密钥的情况下,它实际使用$MYDOMAIN的值。

不是每个nginx指令都允许嵌入变量。ssl\u证书和ssl\u证书\u密钥不支持它

但你可以使用和

主要工作流程:

在nginx config中指定任何有效的存根证书。 接下来,它将需要一些证书格式转换。 使用os.getenvMYDOMAIN构建文件路径以打开和读取证书文件内容。 缓存已转换的密钥,以避免每次请求时同一域的文件读取和转换。 您始终可以使用lua resty lrucache和/或ngx_lua之类的库 像lua_shared_dict这样的API用于缓存格式化的数据 例如,结果


并非每个nginx指令都允许嵌入变量。ssl\u证书和ssl\u证书\u密钥不支持它

但你可以使用和

主要工作流程:

在nginx config中指定任何有效的存根证书。 接下来,它将需要一些证书格式转换。 使用os.getenvMYDOMAIN构建文件路径以打开和读取证书文件内容。 缓存已转换的密钥,以避免每次请求时同一域的文件读取和转换。 您始终可以使用lua resty lrucache和/或ngx_lua之类的库 像lua_shared_dict这样的API用于缓存格式化的数据 例如,结果


正如您已经知道的,环境变量不会在nginx config中解析,并且不是每个指令都支持变量

我很久以前就写过一篇文章

想法是在运行nginx之前更新配置文件。因此,您将有一个启动脚本

#!/bin/bash

envsubst < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf
exec nginx "-g" "daemon off;"
这将使事情变得容易得多。更困难的方法是使用ssl_certificate_by_lua_块动态加载证书


正如您已经知道的,环境变量不会在nginx config中解析,并且不是每个指令都支持变量

我很久以前就写过一篇文章

想法是在运行nginx之前更新配置文件。因此,您将有一个启动脚本

#!/bin/bash

envsubst < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf
exec nginx "-g" "daemon off;"
这将使事情变得容易得多。更困难的方法是使用ssl_certificate_by_lua_块动态加载证书


Nginx版本1.15.9支持ssl_证书和ssl_证书密钥指令中的变量。

Nginx版本1.15.9支持ssl_证书和ssl_证书密钥指令中的变量。

来自文档:自版本1.15.9以来,在使用OpenSSL 1.0.2或更高版本时,可以在文件名中使用变量

例如:

ssl_certificate     $ssl_server_name.crt;
ssl_certificate_key $ssl_server_name.key;

来自文档:从版本1.15.9开始,在使用OpenSSL 1.0.2或更高版本时,可以在文件名中使用变量

例如:

ssl_certificate     $ssl_server_name.crt;
ssl_certificate_key $ssl_server_name.key;

您的ssl证书有效吗?我的意思是它已经更新了是的,它是有效的。如果我硬核它的值。为什么不使用ssl\U证书\u by\u lua\u块?因为版本1.15.9可以在文件名处使用变量。您的ssl证书有效吗?我的意思是它已经更新了是的,它是有效的。如果我硬核它的值。为什么不使用ssl\u证书\u by\u lua\u块?因为版本1.15.9可以在文件名处使用变量。你能提供一个例子吗?我想我遗漏了一些东西。顺便说一句,对于您的用例,我会选择nginx conf临时方法,因为您的配置是静态的。ssl_certificate_by_lua_块是为动态证书选择而设计的,例如基于SNI。将ngx.ssl与缓存一起使用的完整示例可能是一整页lua代码。如果我有足够的空闲时间,我会写这样的例子。你能举个例子吗?我想我遗漏了一些东西。顺便说一句,对于您的用例,我会选择nginx conf临时方法,因为您的配置是静态的。ssl_certificate_by_lua_块是为动态证书选择而设计的,例如基于SNI。将ngx.ssl与缓存一起使用的完整示例可能是一整页lua代码。如果我有足够的空闲时间,我会写这样的例子。