Nginx ssl 终止和ssl_preread

Nginx ssl termination and ssl_preread

提问人:Simone Giacco 提问时间:11/8/2023 更新时间:11/8/2023 访问量:32

问:

我正在尝试使用 nginx 反向代理 xmpp 和 http 连接,具有相同的端口、相同的 ip、相同的服务器名称,以便:

  • https://example.com:443/ 的 HTTP 连接代理到 localhost:8080
  • 与 example.com:443 的 XMPP 连接代理到 localhost:5222

如果我不启用SSL终止,这将可以完美地工作。

该逻辑通过利用 和 变量来工作,但是当我启用 ssl 终止时,变量始终为空。ssl_prereadssl_preread_alpn_protocolsssl_preread_*

换言之:

  • listen 443 ssl;有效,因为 XMPP 调用和 HTTP 调用之间不同ssl_preread_alpn_protocols
  • listen 443 ssl;不起作用,因为总是空的ssl_preread_alpn_protocols

以下是配置的摘要:

stream  {
    map $ssl_preread_alpn_protocols $upstream_by_alpn {
        "" xmpp;
        ~xmpp xmpp;
        default http;
    }
    upstream xmpp   {
        server 127.0.0.1:5222;
    }
    upstream http   {
        server 127.0.0.1:8443;
    }
    server  {
        listen 443 ssl; #listen 443; works / listen 443 ssl; does not work
        ssl_certificate /path/to/fullchain.pem;
        ssl_certificate_key /path/to/privkey.pem;
        proxy_pass $upstream_by_alpn;
        ssl_preread on;
    }
}
http {
    server {
        server_name example.com;
        listen 8443;
        location /  {
            proxy_pass http://127.0.0.1:8080/;
        }
    }
}

问题:

  • 有没有办法在应用指令时使变量工作?ssl_preread_*ssl
  • 有没有更好的方法来识别 http 和非 http 请求?
  • 有没有更好的方法来代理传递 http 和 xmpp 并启用 ssl 卸载并保持相同的服务器、ip 和端口?

PS:我知道通过使用不同的端口或域,我不会遇到这样的问题,但现在这不是一个选择。

尝试使用 ssl_preread_protocol、ssl_preread_alpn_protocols ssl_preread_server_name,但当启用 ssl 终止时,它始终为空。

尝试使用$protocol,但它始终是 TCP

nginx 反向代理 ejabberd

评论


答: 暂无答案