【问题标题】:Is it possible to relay a WebSocket through NGINX over TLS?是否可以通过 NGINX over TLS 中继 WebSocket?
【发布时间】:2017-08-23 20:11:16
【问题描述】:

这个可以吗:

  • 作为 WebSocket 客户端的节点 JS 服务器

  • NGINX 处理 WebSocket 流量

  • JVM 套接字服务器

通过 TLS 工作?

【问题讨论】:

标签: node.js nginx nginx-reverse-proxy


【解决方案1】:

当然,我可以想象有两种设置方法:

  1. 向 Nginx 添加 TLS
  2. 将 TLS 添加到源 Websocket 服务器(在您的情况下为 JVM)

第二种方法更有优势,因为它也保护了 Nginx 和 Websocket 之间的连接(假设您希望将它们托管在两个不同的容器/机器中)

为第一种方法想象这样的图表:

Nodejs Socket Client <--Secure--> Nginx <--NOT Secure--> JVM

第二种方法是这样的:

Nodejs Socket Client <--Secure--> Nginx <--Secure--> JVM

我在这里创建了一个公共存储库,演示如何设置第一种方法:https://github.com/afshinm/websocket_tls_docker

在服务器端设置 TLS

如果你想采用第二种方法,它会因框架而异。您需要阅读文档。但请记住,Nginx 可以解密和加密您的流量,所以在这种情况下,您只需将 proxy_pass 的值更改为 https://... 前缀,以便 Nginx 知道首先解密流量。

但对于第一种方法,只需将以下设置添加到您的 server 配置中即可启用 TLS:

ssl on;
ssl_certificate /path/ssl-bundle.crt;
ssl_certificate_key /path/myserver.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

不要忘记将这些添加到您的 serverlocation 块中(根据您的配置):

proxy_pass ​http://your_jvm_backend_host;
proxy_http_version 1.1;
proxy_set_header Connection "upgrade";
proxy_set_header Upgrade $http_upgrade;
proxy_read_timeout 86400;

现在,您从 Nginx 到您的客户端的连接是安全的 (wss://...)。

设置客户端

假设你使用的是ws包,你可以像这样连接到安全的Websocket连接:

const WebSocket = require('ws');

const ws = new WebSocket('wss://your_backend');

ws.on('open', function open() {
  ws.send('Hola!');
});

就是这样。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多