我正在尝试使用 nginx 反向代理 xmpp 和 http 连接,具有相同的端口、相同的 ip、相同的服务器名称,方式如下:
如果我不启用 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
指令时起作用?PS:我知道通过使用不同的端口或域我不会遇到这样的问题,但目前这不是一个选择。
尝试使用 ssl_preread_protocol、ssl_preread_alpn_protocols、ssl_preread_server_name,但当启用 ssl 终止时它始终为空。
尝试使用$协议,但它始终是TCP
我从未设置过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。