如何将 nginx“stream”和“http”组合为同一个服务器名?

Cod*_* 23 18 nginx

我想在同一个 nginx 配置中的同一端口(443)上处理 2 个服务器名,例如“web1.example.com”和“web2.example.com”,其中第一个应该是本地服务器http,第二个需要转发到外部上游而不终止 SSL 连接。

我该如何配置这个?

细节:

我可以使用 nginx 查看第一条 SSL 消息 (CLientHello) 并使用它来代理/转发整个连接,而无需终止 SSL。这甚至可以查看 SNI 并根据其中的服务器名称选择不同的上游。这使用ngx_stream_ssl_preread_moduleproxy_passssl_preread on配置是这样的:

stream {
    upstream web1 {
        server 10.0.0.1:443;
    }
    upstream web2 {
        server 10.0.0.2:443;
    }

    map $ssl_preread_server_name $upstream {
        web1.example.com web1;
        web1-alias.example.com web1;
        web2.example.com web2;
    }

    server {
        listen 443;

        resolver 1.1.1.1;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;

        proxy_pass $upstream;
        ssl_preread on;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是在streamnginx 的 config 部分配置的。

但我也可以在 nginx 的配置部分配置本地 http 服务器http。那么,如果我希望 web1(示例中的“web1.example.com”)使用这样的“本地 nginx http 服务器”,而不是外部“上游服务器”,该怎么办?(“web2”仍然应该像以前一样转发。)所以我想在httpnginx的配置部分配置“web1.example.com”,并在streamnginx的配置部分“转发”到它。

需要明确的是,我希望“web1.example.com”配置如下:

http {
    server {
        listen 443 ssl;
        server_name web1.example.com web1-alias.example.com;

        ssl_certificate ...
        location ...
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我执行streamhttp侦听同一端口,这一切都有效。但如何在同一个端口上执行这两项操作呢?如何httpstreams配置部分“调用”配置部分?可以以某种方式proxy_pass引用本地 nginxhttp服务器吗?

Iva*_*sky 11

我不认为你可以在同一个端口上使用两者,但也许这样的东西会起作用?

stream {
    upstream web1 {
        server 127.0.0.1:8443;
    }
    upstream web2 {
        server 10.0.0.2:443;
    }

    map $ssl_preread_server_name $upstream {
        web1.example.com web1;
        web1-alias.example.com web1;
        web2.example.com web2;
    }

    server {
        listen 443;

        resolver 1.1.1.1;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;

        proxy_pass $upstream;
        ssl_preread on;
    }
}

http {
    server {
        listen 8443 ssl;
        server_name web1.example.com web1-alias.example.com;

        ssl_certificate ...
        location ...
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)