我们有一个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 部分,它就会抱怨一次“ ”。