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

Posted

技术标签:

【中文标题】Node.js - 具有 WebSocket 代理和 SSL 支持的良好 WebServer?【英文标题】:Node.js - Good WebServer with WebSocket-proxying & SSL support? 【发布时间】:2011-04-19 13:14:37 【问题描述】:

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

我目前正在运行 nginx,但无法根据 url 将传入的 websocket 连接代理到不同的 websocket 服务器,因为 nginx 不支持 http 1.1。

我尝试实现一个具有我自己的功能的网络服务器,但是在标头传递等方面确实很复杂。另一件事是 SSL 支持。支持它并不容易。

那么,有没有人知道一个很好的解决方案来做我提到的事情?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

我使用 nodejitsu 的node-http-proxy 取得了不错的成绩。正如他们的自述文件中所述,他们似乎支持 WebSockets。

WebSocket 示例(取自他们的 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。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于Node.js - 具有 WebSocket 代理和 SSL 支持的良好 WebServer?的主要内容,如果未能解决你的问题,请参考以下文章

使用来自 certbot 的 ssl 将 websocket nginx 代理设置为 node.js

第1882期基于Unix Socket的可靠Node.js HTTP代理实现(支持WebSocket协议)

如何解决Vue.js里面noVNC的截图问题——蛋疼的cookies验证和node.js的websocket代理

使用带有弹性 beanstalk、nginx 和 node.js 的 websocket 出现问题

Node.js http-proxy 丢弃 websocket 请求

终止大量 SSL 连接具有成本效益