如何使用NGINX代理WSS WebSockets

时间:2020-01-09 10:39:34  来源:igfitidea点击:

说明

WebSocket允许客户端和服务器之间的双向持久通信通道。像任何其他HTTP请求一样,WebSocket可以是安全(WSS)或者不安全(WS)的。在本教程中,将向我们展示如何配置NGINX来代理WSS连接。

证书

可信证书

来自受信任来源的任何证书密钥对都将起作用。将证书文件放在NGINX可以访问的安全位置。我们将使用处理WebSocket连接的Nginx配置文件指向密钥和证书文件。

创建自签名证书

在测试解决方案之外,强烈建议不要使用自签名证书。但是,由于可能需要证书进行测试,因此以下说明将向我们展示如何创建密钥对。

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 --nodes

配置安全的WebSocket代理

为了将WWS请求代理到后端WSS服务,必须将NGINX配置为侦听安全端口。就像使用NGINX来为Web应用程序服务器配置SSL一样,必须配置ssl证书和证书密钥。

以下示例nginx.conf添加了使用名为cert.pem的证书文件和名为key.pem的密钥文件。可以使用ssl_protocols指令显式设置可接受的协议,并使用ssl_ciphers指令设置允许的密码。

http {
  server {
    listen 443 ssl;
    server_name ws.theitroad.com

    ssl_certificate     cert.pem;
    ssl_certificate_key key.pem;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    location / {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $host;

      proxy_pass https://ws-backend;

      proxy_ssl_certificate     /etc/ssl/certs/cert.pem;
      proxy_ssl_certificate_key /etc/ssl/private/key.pem;

      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
    }
  }

  upstream ws-backend {
    # enable sticky session based on IP
    ip_hash;

    server server01:3000;
    server server02:3000;
    server server03:3000;
  }
}

连接升级

上面的示例配置将连接设置为"升级",这是代理连接切换到WS和WSS协议的方式。两个proxy_set_header指令是升级连接的对象。

此外,WS和WSS连接仅在HTTP 1.1上受支持,因此另一个名为proxy_http_version的指令将HTTP版本设置为1.1. 没有它,HTTP 1.0可能会尝试使用WebSockets。

上游服务器

上游可以根据需要配置尽可能多的上游服务器。但是,如果连接是有状态的,则必须使用ip_hash目录。

该示例包含三个服务器池,分别名为server01,server02和server03. 所有这些都在端口3000上进行侦听。默认的负载平衡算法是循环的,因此新的传入连接将按顺序连接到服务器。

例如,clientA将连接到server01,clientB将连接到server02,clientC将连接到server03,最后clientD将连接到server01.

ip_hash伪指令基于客户端的IP地址启用粘性会话。这样可确保来自IP的所有请求均由同一下游服务器处理。

虽然这对于保持静态的客户端非常有效,但诸如手机之类的非静态客户端可能会切换IP地址。粘性会话将失败,因为客户端的IP已更改,这将导致会话丢失。

NGINX Plus允许创建会话cookie,它是粘性会话的更好候选者。