Nginx ssl 终止和 ssl_preread

问题描述 投票:0回答:1

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

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

如果我不启用 SSL 终止,这将完美运行。

该逻辑通过利用

ssl_preread
ssl_preread_alpn_protocols
变量来工作,但是当我启用 ssl 终止时,
ssl_preread_*
变量始终为空。

换句话说:

  • listen 443 ssl;
    有效,因为
    ssl_preread_alpn_protocols
    在 xmpp 调用和 http 调用之间是不同的
  • 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 终止时它始终为空。

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

nginx reverse-proxy ejabberd
1个回答
0
投票

我从未设置过xmpp,但我认为您需要在目标服务器上启用SSL,而不是在ClientHello期间。以下是Nginx 官方文档对此的描述:

ngx_stream_ssl_preread_module 模块(1.11.5)允许提取 来自 ClientHello 消息的信息而不终止 SSL/TLS, 例如,通过SNI或协议请求的服务器名称 在 ALPN 上刊登广告。

事实证明,必须从流中删除 ssl 指令和证书并在 http 块中使用。

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; #listen 443;
        proxy_pass $upstream_by_alpn;
        ssl_preread on;
    }
}
http {
    server {
        server_name example.com;
        listen 8443 ssl;
        ssl_certificate /path/to/fullchain.pem;
        ssl_certificate_key /path/to/privkey.pem;
        location /  {
            proxy_pass http://127.0.0.1:8080/;
        }
    }
}

您还需要在 xmpp 服务器上启用 ssl。

© www.soinside.com 2019 - 2024. All rights reserved.