我真的很喜欢node.js,但是当你想要运行多个websocket服务器并通过80端口访问它们时,它真的很复杂。
我目前正在运行nginx,但代理传入的websocket连接到不同的websocket服务器取决于url是不可能的,因为nginx不支持http 1.1。
我试图实现一个web服务器,有我自己的功能,但它是真的很复杂,当它涉及到头部传递等。另一件事是SSL支持。支持它不容易。
那么,有没有人知道一个好的解决方案来做我提到的事情?谢谢你的帮助!
我使用nodejitsu的node-http-proxy有很好的效果。正如他们的自述中所述,他们似乎支持WebSockets。
WebSockets的例子(取自他们的GitHub readme):
var http = require('http'),
httpProxy = require('http-proxy');
//
// Create an instance of node-http-proxy
//
var proxy = new httpProxy.HttpProxy();
var server = http.createServer(function (req, res) {
//
// Proxy normal HTTP requests
//
proxy.proxyRequest(req, res, {
host: 'localhost',
port: 8000
})
});
server.on('upgrade', function(req, socket, head) {
//
// Proxy websocket requests too
//
proxy.proxyWebSocketRequest(req, socket, head, {
host: 'localhost',
port: 8000
});
});
它的生产使用应该没有问题,因为它用于nodejitsu.com。要将代理应用程序作为守护进程运行,请考虑使用forever.
新版本的nginx实际上将支持http/1.1的反向代理。您可能需要1.1.7或更高版本。
在你的配置中尝试这样做:
location / {
chunked_transfer_encoding off;
proxy_http_version 1.1;
proxy_pass http://localhost:9001;
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host:9001; #probaby need to change this
proxy_set_header Connection "Upgrade";
proxy_set_header Upgrade websocket;
}
这样做的好处是你可以在nginx终止SSL。