我通过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)
设置server_name工作正常,但在ssl_certificate和ssl_certificate_key的情况下,它的字面值为$ MYDOMAIN。
并非每个nginx指令都允许嵌入变量。 ssl_certificate
和ssl_certificate_key
不支持它。
但你可以使用ssl_certificate_by_lua_block和ngx.ssl
主要工作流程:
os.getenv("MYDOMAIN")
构建文件路径以打开并读取证书。文件内容。例如,您可以始终使用像lua-resty-lrucache和/或ngx_lua API这样的库(如lua_shared_dict)来缓存DER格式的结果。
Nginx版本1.15.9支持“ssl_certificate”和“ssl_certificate_key”指令中的变量。
您已经知道,nginx配置中的环境变量没有得到解析,并且并非每个指令都支持变量。
我早就写了一篇文章
https://tarunlalwani.com/post/simple-parameterized-config-files-docker/
想法是在运行nginx之前更新配置文件。所以你将有一个启动脚本
#!/bin/bash
envsubst < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf
exec nginx "-g" "daemon off;"
这将使事情变得更容易。更艰难的途径是使用ssl_certificate_by_lua_block
动态加载证书。
https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ssl.md