在 nginx 配置中,如何从兄弟块继承 ssl 指令?

在 nginx 配置中,如何从兄弟块继承 ssl 指令?

我们有一个nginx配置,它作为许多独立服务的前端,主要用于执行 SSL 解密。它由和的 DNS 条目指向example.com*.example.com我们使用以下配置(简化)将流量路由到service.example.com在同一台计算机上其他端口上运行的某些特定后端:

# Main server.  Handles all traffic not for specific subdomains.
server {
  listen [::]:443 ssl ipv6only=off;

  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

  location / {
    proxy_pass http://127.0.0.1:7780/;
  }
}

server {
  listen [::]:443 ssl;
  server_name service1.example.com;

  location / {
    proxy_pass http://127.0.0.1:7781/;
  }
}

server {
  listen [::]:443 ssl;

  server_name service2.example.com;

  location / {
    proxy_pass http://127.0.0.1:7782/;
  }
}

# Etc. for several more

这个配置是通过反复试验得出的,似乎运行良好,但我对此有几个(密切相关的)问题:

  • 为什么我们不需要重新指定ssl_certificate*第二个和后续server块的指令?(我认为指令不应该从兄弟块继承。)

  • 为什么ipv6only=off在第二个和后续server_name指令上重复该选项会导致nginx使用“”拒绝配置[emerg] duplicate listen options for [::]:443 in /etc/nginx/sites-enabled/wildcard:14

  • 相反,为什么重复该ssl选项是可以接受的(但不是必须的!)?

  • 事实上,用 替换第二条及后续listen指令listen 443;似乎同样有效。有什么理由不这样做呢?

基本上:什么?关于哪些指令/选项可以从兄弟块继承,哪些不能,是否存在一般规则?

答案1

指令不会从同级块继承,这是其他原因。检查您的 http 部分,其中是否有重复的 SSL 设置?SSL 也可以位于 HTTP 上下文块中。

例如,我将所有 SSL 设置都放在 http {} 部分的顶部,并定义了通配符证书。这样,这将应用于根域和所有子域,而无需我重新指定。另一种方法是将所有 SSL 设置放在包含文件中,并使用包含指令在服务器或位置部分内加载。

或者,您确定您的其他服务器没有使用第一个服务器块进行连接吗?...

我不确定为什么您会看到 ipv6only=off 问题,文档似乎表明它只能在每次启动时设置一次并适用于 [::] 因此我认为它是一个全局设置。

顺便说一下,指定您想要 IPV6 和 IPv4 的“正常”方法是使用以下命令:

server {
    server_name             server.mydomain.tld;
    listen                  443 ssl http2;
    listen                  [::]:443 ssl http2;

http2 是可选的,但我在所有服务器上都启用了它。

答案2

不使用is指定后续server块的原因将listen 443;nginx重新加载配置很好,但下次重启nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)server监听一个 443 部分,它就会抱怨一次“ ”。

相关内容