NGINX: set_by_lua 不起作用

我运行了 NGINX 作为代理服务,并想根据 $ENV 变量(在 Docker Compose 文件中)设置 SSL 密钥。

我在 nginx.conf 中添加了以下内容:

env ENVKEY;

然后在配置文件中:

server {

    resolver 10.0.0.4 valid=300s;
    resolver_timeout 60s;

    server_name  _;

    listen 443;

    ssl on;

#    perl_set $envkey 'sub { return $ENV{"ENVKEY"}; }';
    set_by_lua $envkey 'return os.getenv("ENVKEY")';

    ssl_certificate /etc/nginx/ssl/jm-website-$envkey.crt;
    ssl_certificate_key /etc/nginx/ssl/jm-website-$envkey.key;

我也尝试使用 perl_set,但它只能在 location 中使用,而 ssl_certificate 则可以在 httpserver 块中使用。

使用 set_by_lua - 我遇到了一个错误:

nginx: [emerg] BIO_new_file("/etc/nginx/ssl/jm-website-$envkey.crt") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/nginx/ssl/jm-website-$envkey.crt','r') error:2006D080:BIO routines:BIO_new_file:no such file)

虽然变量存在于环境中:

root@d0718b0a3361:/etc/nginx# echo $ENVKEY
dev

我做错了什么? 也许有更好的方法吗?

点赞
用户2670507
用户2670507

我知道这是一个旧的帖子。我发布这篇文章是为了未来的记录。

我遇到了和你一样的问题。

发生的情况是,有一个顺序来执行 lua 块。set_by_lua 在证书验证后立即执行。

你可以使用自己选择的渲染引擎(例如:Python jinja)来呈现你的 nginx.conf,或者你可以编写自己的 ssl_certificate_by_lua_block ,从环境变量中读取。[这里是一个使用该块的实现示例](https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ssl.md)。你也可以查看 Kong是如何做的

希望能帮到你 :)

2017-11-13 19:01:30