我尝试使用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
指令时,是否有方法使ssl_preread_*
变量工作? - 有没有更好的方法来识别http和非http请求?
- 有没有更好的方法来代理通过http和xmpp,并启用ssl卸载和保持相同的服务器,ip和端口?
PS:我知道通过使用不同的端口或域,我不会有这样的问题,但这不是现在的选择。
尝试使用ssl_preread_protocol,ssl_preread_alpn_protocols,ssl_preread_server_name,但在启用ssl终止时,它始终为空。
尝试使用$协议,但始终是TCP
1条答案
按热度按时间mkh04yzy1#
我从未设置过xmpp,但我认为您需要在目标服务器上启用SSL,而不是在ClientHello期间。下面是official Nginx documentation对此的说明:
ngx_stream_ssl_preread_module模块(1.11.5)允许在不终止SSL/TLS的情况下从ClientHello消息中提取信息,例如,通过SNI或ALPN中通告的协议请求的服务器名称。
结果是必须从流中删除ssl指令和证书并在http块中使用。
字符串
您还需要在xmpp服务器上启用ssl。