我在同一台服务器上有两个不同的应用程序。其中一个在 80 端口 (mydomain.com) 上运行,另一个在 443 端口 (sub.mydomain.com) 上运行,并且具有通配符证书。
第一个应用程序仅用于信息目的,不需要 websockets 支持。第二个应用程序应该具有安全的 websockets 支持(wss 协议)。
我尝试使用 engineyard cloud 上的 nginx 服务器为我的 rails 应用设置 juggernaut gem(用于 websockets),但遇到了一个问题。Engineyard cloud 仅提供两个开放端口:80 和 443。我知道 nginx 不完全支持 http 1.1 反向代理,因此我无法使用 nginx 代理将 websockets 请求重定向到特定的本地端口(在我的情况下,这个端口是 8080)。
我尝试使用 HAProxy,当我仅使用不安全的 websocket 时,它对我来说是有效的,但我需要支持安全的 websocket。据我所知,在这种情况下,我应该使用类似 STunnel 的东西来隧道传输我的 https 请求,然后使用 HAProxy,但当我测试它时 - 我发现服务器的运行速度要慢几倍,而且我仍然无法使用安全套接字连接 :(
也许我做错了什么?也许有人会告诉我如何为多个应用程序设置 nginx(其中一个应用程序应通过 https 工作)以及如何仅使用两个端口(80 和 443)保护 websocket。
ps 我还使用了 node-http-proxy,在这种情况下,我能够为不同的 nginx 应用程序设置代理,但我没有运行 websockets(仅发生在通过 nginx 进行“握手”时,而不是“切换协议”)
答案1
普通的反向代理不适用于 websocket 连接。Nginx 有一个补丁,添加了与 websocket 兼容的 tcp 代理功能。
这里有关于该组合的优秀文章: http://blog.mixu.net/2011/08/13/nginx-websockets-ssl-and-socket-io-deployment/