Nginx ssl终止和ssl_preread

pgvzfuti  于 5个月前  发布在  Nginx
关注(0)|答案(1)|浏览(65)

我尝试使用nginx来反向代理xmpp和http连接,具有相同的端口,相同的ip,相同的服务器名称,以这样的方式:

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

如果我不启用SSL终止,这将完美地工作。
这个逻辑通过利用ssl_prereadssl_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指令时,是否有方法使ssl_preread_*变量工作?
  • 有没有更好的方法来识别http和非http请求?
  • 有没有更好的方法来代理通过http和xmpp,并启用ssl卸载和保持相同的服务器,ip和端口?

PS:我知道通过使用不同的端口或域,我不会有这样的问题,但这不是现在的选择。
尝试使用ssl_preread_protocol,ssl_preread_alpn_protocols,ssl_preread_server_name,但在启用ssl终止时,它始终为空。
尝试使用$协议,但始终是TCP

mkh04yzy

mkh04yzy1#

我从未设置过xmpp,但我认为您需要在目标服务器上启用SSL,而不是在ClientHello期间。下面是official Nginx documentation对此的说明:
ngx_stream_ssl_preread_module模块(1.11.5)允许在不终止SSL/TLS的情况下从ClientHello消息中提取信息,例如,通过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。

相关问题