如何配置NGINX代理WebSocket

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

说明

在本教程中,我们将学习如何在客户端和后端服务之间配置NGINX WebSocket连接。

典型的HTTP请求会打开客户端和Web服务器之间的连接。然后,服务器将请求的数据发送到客户端,然后关闭连接。

另一方面,WebSocket在客户端和服务器之间创建持久的双向连接。

配置代理服务器

为Nginx服务器创建一个新的conf文件,该文件将接受WebSocket请求。

sudo touch /etc/nginx/conf.d/00-websockets.conf

向其中添加以下内容

http {
  server {
    listen 3000;
    server_mame ws.theitroad.com

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

      proxy_pass http://ws-backend;

      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;
  }
}

保存设置,然后重新启动NGINX服务器,将使其支持WebSocket连接。

了解配置

让我们分开NGINX配置,以了解服务器如何处理WebSocket。以下配置在NGINX中创建一个虚拟主机,该主机侦听端口3000上主机名ws.theitroad.com的请求。

server {
    listen 3000;
    server_mame ws.theitroad.com
    
    [ ... truncated ... ]
  }

接下来是server指令内的location指令,匹配要处理的请求URI。在示例中," /"代表发送的URI的包罗万象。

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

      proxy_pass http://ws-backend;

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

这是典型的反向代理配置。它从设置头开始,该头允许客户端信息通过代理传递到上游WebSocket服务器。

proxy_set_header X-Forwarded-For
确保向NGINX发送请求的客户端的IP存储在请求标头中。这样可以将连接追溯到源。如果不添加此标头,则对上游WebSocket服务器的所有请求都将使用NGINX服务器的IP地址作为源。

proxy_set_header主机$ host
将主机标头设置为NGINX服务器的标头。

proxy_pass
该指令指示NGINX代理将所有与位置模式匹配的请求发送给上游(后端)服务器。在给定的示例中,使用了ws-backend,但是,这实际上是在配置中更下方创建的上游组的名称。

接下来的几个选项是启用WebSocket支持的魔力。这些必须存在,NGINX才能正确地将WebSocket请求代理到上游WebSocket服务器。

proxy_http_version 1.1
该指令将传入的连接转换为支持WebSockets所需的HTTP 1.1. 较早的HTTP 1.0规范不提供对WebSocket的支持,使用HTTP 1.0的任何请求都将失败。

proxy_set_header升级$ http_upgrade
将代理连接转换为升级类型。 WebSocket仅在升级的连接上进行通信。

proxy_set_header连接"升级";
确保Connection标头值已升级

平衡WebSocket请求

其余配置将创建一个名为ws-backend的上游。在上游是后端WebSocket服务器,NGINX将在它们之间平衡流量。

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

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

ip_hash
根据传入的客户端IP地址启用粘性会话。来自IP的所有其他请求将被代理到处理其请求的第一个上游服务器。这是有状态服务所必需的。

服务器ws-server ##:3000
列出的每个服务器都是上游WebSocket服务器的主机名和端口。