Nginx在ssl_certificate路径中使用变量时获取权限错误

Mez*_*bah 3 nginx lets-encrypt

在 Nginx 配置中,尝试动态加载 ssl_certificate 但

\n\n

使用 $ssl_server_name 变量

\n\n
   ssl_certificate /etc/letsencrypt/live/$ssl_server_name/fullchain.pem;\n   ssl_certificate_key /etc/letsencrypt/live/$ssl_server_name/privkey.pem;\n
Run Code Online (Sandbox Code Playgroud)\n\n

收到此权限错误

\n\n
\n

\xe2\x94\x822019/09/22 08:29:42 [错误] 7714#7714: *3 无法加载证书\n "/etc/letsencrypt/live/example.com/fullchain.pem": BIO_new_file()\ n 失败(SSL:错误:0200100D:系统库:fopen:权限\n被拒绝:fopen(\'/etc/letsencrypt/live/example.com/fullchain.pem\',\'r\')\n错误: 2006D002:BIO 例程:BIO_new_file:system lib) SSL\n 握手时,客户端:,服务器:0.0.0.0:443

\n
\n\n

但不使用变量,它的工作!

\n\n
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;\n  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;\n
Run Code Online (Sandbox Code Playgroud)\n\n

有没有办法根据server_name动态加载ssl_certificate?

\n\n

尝试了一些参考但仍然无法解决。

\n\n
    \n
  1. nginx 配置在 ssl_certificate 路径中使用变量会引发权限错误
  2. \n
  3. https://trac.nginx.org/nginx/ticket/1744
  4. \n
\n

小智 6

只需在此处添加响应,以防有人遇到同样的问题。

当 nginx 启动时,它以 root 身份启动。如果您不使用变量,则此时可以加载证书文件(以 root 身份)。

但是,如果您使用变量,则这些文件的加载需要等待请求到达,此时 nginx 不再像您在 .conf 中指定的用户一样作为 root 总线运行。看起来该用户无法读取这些文件。

这就是它在没有变量的情况下工作(以 root 身份打开文件)而在使用变量时却不起作用(尝试以其他用户身份打开文件)的原因。

您只需要让 nginx 用户能够读取这些文件即可。