Nginx:为什么 nginx.conf 中的 stream 指令中 $host 变量不可用?

Nginx:为什么 nginx.conf 中的 stream 指令中 $host 变量不可用?

在我的 nginx.conf 中,我想根据请求的 url 将请求传递给特定的服务器基础架构。

除了 $host 变量之外,其他一切都运行良好。我收到错误“nginx:[emerg] 未知“host”变量”

据我了解,$host 是一个常规变量,我不需要先声明它。事实上,它在上面的 http 指令中使用时没有问题:

http {
    ...
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    ...
}

但在流中这是一个问题...

stream {
        map $ssl_server_name $targetBackendSSL {
            test1.example.com  192.168.1.1:22553;
            test2.example.com  192.168.1.2:22553;
        }
        
        map $host $targetBackendNonSSL {
            test1.example.com  192.168.1.9:22553;
            test2.example.com  192.168.1.10:22553;
        }
        
        # ssl
        server {
                listen 8000 ssl;
                listen [::]:8000 ssl;
                ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
                ssl_certificate /etc/letsencrypt/live/domain/fullchain.pem;
                ssl_certificate_key /etc/letsencrypt/live/domain/privkey.pem;
                proxy_connect_timeout 300s;
                proxy_pass $targetBackendSSL;
        }
        
        # non-ssl
        server {
                listen 8001;
                listen [::]:8001;  
                proxy_connect_timeout 300s;
                proxy_pass $targetBackendNonSSL;
        }
}

任何帮助都值得感激!:-)

答案1

  1. stream{}处理TCP 和 UDP 负载平衡

  2. $host多变的来自 HTTP 请求。

    $host
    按以下优先顺序:请求行中的主机名,或“Host”请求标头字段中的主机名,或与请求匹配的服务器名称

此类信息在 TCP 或 UDP 流中并不常见,因为它是HTTP协议的概念因此,不可能存在这样的变量。

$ssl_server_name另一方面,来自服务器名称指示 (SNI),它是 TLS 扩展(RFC 6066, 3)可在提供此信息的协议中使用扩展客户端问候。并非所有 TLS 包装的 TCP 协议都支持 SNI;您的检测不可靠。

相关内容