Node.js - 具有WebSocket代理的良好WebServer& SSL支持?

时间:2011-04-19 13:14:38

标签: proxy node.js webserver websocket

我真的很喜欢node.js,但是当你想要运行多个websocket服务器并使它们都可以通过端口80访问时,它真的很复杂。

我目前正在运行nginx,但由于nginx不支持http 1.1,因此无法将传入的websocket连接代理到不同的websocket服务器,具体取决于url。

我曾尝试实现一个自己拥有该功能的网络服务器,但是当涉及到标题传递等时它真的很复杂。另一件事是SSL支持。支持它并不容易。

那么,有没有人知道做我提到的事情的好方法呢?

感谢您的帮助!

2 个答案:

答案 0 :(得分:8)

我通过nodejitsu使用node-http-proxy得到了很好的结果。如他们的自述文件所述,它们似乎支持WebSockets。

WebSockets的示例(取自他们的GitHub自述文件):

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

答案 1 :(得分:1)

新版本的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。