我在同一台服务器上有两个不同的应用程序。其中一个运行在 80 端口 (mydomain.com),另一个运行在端口 443 (sub.mydomain.com) 并具有通配符证书。
第一个应用程序仅供引用,不需要 websockets 支持。 第二个应用程序应该有安全的 websockets 支持(wss 协议(protocol))。
我尝试在 engineyard 云上使用 nginx 服务器为我的 rails 应用程序设置主宰 gem(用于 websockets),但我遇到了一个问题。 Engineyard cloud 只提供两个打开的端口:80 和 443。我知道 nginx 不完全支持 http 1.1 反向代理,所以我不能使用 nginx 的代理将 websockets 请求重定向到特定的本地端口(在我的例子中这个端口是8080)。
我尝试使用 HAProxy,当我只使用不安全的 websockets 时它对我有用,但我需要支持安全的 websockets。据我所知,在这种情况下,我应该使用像 STunnel 这样的东西来隧道传输我的 https 请求,而不是使用 HAProxy,但是当我测试它时 - 我发现服务器的工作速度必须慢好几倍而且我仍然无法使用安全套接字连接:(
也许我做错了什么?也许有人会告诉您如何为多个应用程序设置 nginx(其中一个应用程序应该通过 https 工作)以及如何仅使用两个端口(80 和 443)保护 websockets。
附注我还使用了 node-http-proxy,在这种情况下,我能够为不同的 nginx 应用程序设置代理,但我没有运行 websockets(只发生在通过 nginx 的“握手”,而不是“切换协议(protocol)”)
最佳答案
不久前,我对各种反向代理和 websockets 进行了一些研究。底线是 websockets 是新的,目前对它的反向代理支持非常差。
我看到并同意的建议是,您应该在与其余项目不同的堆栈上运行您的 websockets。这通常意味着将其放在单独的域或子域中。
您仍然需要处理使反向代理工作的复杂性,但如果您不必担心破坏其他东西,事情就会简单一些。
此外,我同意您可能会在 serverfault 或 superuser 获得更好的答案。
关于node.js - Nginx + SSL + Rails + Juggernaut (Node.js) + Engineyard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9727211/