如何配置NGINX代理WebSocket
说明
在本教程中,我们将学习如何在客户端和后端服务之间配置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服务器的主机名和端口。