IT评测·应用市场-qidao123.com技术社区

标题: Nginx WebSocket 长连接及数据容量设置 [打印本页]

作者: 诗林    时间: 2025-3-12 16:07
标题: Nginx WebSocket 长连接及数据容量设置
WebSocket 协议是实现实时通信的关键技术。相比于传统的 HTTP 请求-响应模式,WebSocket 提供了双向、长期化的通信方式。Nginx 作为一个高性能的反向代理服务器,可以非常有用地处理 WebSocket 连接,但要正确处理 WebSocket 长连接和传输大数据,必须进行一些特定的设置。
1. WebSocket 连接的根本概念

WebSocket 协议是基于 HTTP 协议的,它在客户端和服务器之间创建了一条长期化的、全双工的通信通道。在 WebSocket 创建连接后,客户端和服务器可以随时向对方发送消息,而不需要像传统的 HTTP 请求那样重复创建连接。
Nginx 的作用通常是充当反向代理,它将 WebSocket 请求转发给后端应用服务器。因此,在设置 WebSocket 时,需要特殊注意以下几点:

2. Nginx 设置 WebSocket 代理

Nginx 自己并不直接支持 WebSocket 协议,但它可以通过 HTTP 代理将 WebSocket 请求转发到后端应用服务器。要使 Nginx 支持 WebSocket,关键是设置反向代理时保持 HTTP 协议升级(Upgrade)和连接(Connection)的头部。
以下是设置 Nginx 作为 WebSocket 代理的根本步骤。
2.1 设置 WebSocket 代理

在 Nginx 中,要支持 WebSocket,最重要的设置是正确设置 Upgrade和 Connection请求头,确保 WebSocket 协议的握手可以大概正常进行。你可以在 nginx.conf中的 location块中添加以下设置:
  1. server {
  2. ????listen 80;
  3. ????server_name your-domain.com;
  4. ????location /ws/ {
  5. ????????proxy_pass http://your_backend_server; ?# 后端 WebSocket 服务地址
  6. ????????proxy_http_version 1.1; ?# 使用 HTTP/1.1 协议,WebSocket 需要支持 HTTP/1.1
  7. ????????proxy_set_header Upgrade $http_upgrade; ?# WebSocket 升级头部
  8. ????????proxy_set_header Connection 'upgrade'; ?# 保持连接活跃
  9. ????????proxy_set_header Host $host; ?# 转发原始 Host 头
  10. ????????proxy_cache_bypass $http_upgrade; ?# 避免缓存 WebSocket 请求
  11. ????}
  12. }
复制代码
2.2 解释设置项


3. 设置 WebSocket 长连接

WebSocket 是一个长连接,这意味着客户端和服务器之间的连接会保持较长时间,甚至是一直连续下去。为了确保 WebSocket 长连接的稳固性和性能,Nginx 需要处理一些与连接生命周期相关的设置。
3.1 调整 proxy_read_timeout和** proxy_send_timeout**

由于 WebSocket 长连接会在较长时间内保持生动,因此必须增加 proxy_read_timeout和 proxy_send_timeout的超时时间。否则,如果连接空闲时间较长,Nginx 会认为连接超时并关闭连接。
  1. server {
  2. ????listen 80;
  3. ????server_name your-domain.com;
  4. ????location /ws/ {
  5. ????????proxy_pass http://your_backend_server;
  6. ????????proxy_http_version 1.1;
  7. ????????proxy_set_header Upgrade $http_upgrade;
  8. ????????proxy_set_header Connection 'upgrade';
  9. ????????proxy_set_header Host $host;
  10. ????????proxy_cache_bypass $http_upgrade;
  11. ????????# 调整超时时间
  12. ????????proxy_read_timeout 3600s; ?# 设置为 1 小时,确保长连接不被关闭
  13. ????????proxy_send_timeout 3600s; ?# 设置为 1 小时,允许数据发送较长时间
  14. ????}
  15. }
复制代码

3.2 调整 keepalive_timeout

在 Nginx 中,keepalive_timeout设置指定了 Nginx 在与客户端创建连接后保持连接空闲的时间。WebSocket 长连接需要足够的 keepalive_timeout时间,以便与客户端保持连续的连接。
  1. server {
  2. ????listen 80;
  3. ????server_name your-domain.com;
  4. ????keepalive_timeout 65s; ?# 设置为 65 秒,以确保 WebSocket 长连接稳定
  5. }
复制代码
通过调整 keepalive_timeout,你可以控制 Nginx 和客户端之间保持空闲连接的时间。为了制止 WebSocket 连接被不测关闭,可以适当增加该值。
4. 设置 WebSocket 数据巨细限定

WebSocket 数据传输的巨细可能会较大,特殊是在视频流、文件传输等场景中。Nginx 默认对请求体巨细有限定,如果 WebSocket 消息的巨细超过默认值,可能会导致连接失败或消息丢失。因此,需要调整 Nginx 的数据传输巨细限定。
4.1 调整 client_max_body_size

client_max_body_size设置控制客户端请求的最大允许巨细。对于 WebSocket 长连接,特殊是涉及大数据传输的应用,可能需要调整此限定。
  1. server {
  2. ????listen 80;
  3. ????server_name your-domain.com;
  4. ????location /ws/ {
  5. ????????proxy_pass http://your_backend_server;
  6. ????????proxy_http_version 1.1;
  7. ????????proxy_set_header Upgrade $http_upgrade;
  8. ????????proxy_set_header Connection 'upgrade';
  9. ????????proxy_set_header Host $host;
  10. ????????proxy_cache_bypass $http_upgrade;
  11. ????????# 调整请求体大小限制
  12. ????????client_max_body_size 50M; ?# 设置最大请求体为 50MB
  13. ????}
  14. }
复制代码

4.2 调整 proxy_max_temp_file_size

Nginx 还会将大数据缓存到暂时文件中,proxy_max_temp_file_size设置项可以控制缓存文件的巨细。
  1. server {
  2. ????listen 80;
  3. ????server_name your-domain.com;
  4. ????location /ws/ {
  5. ????????proxy_pass http://your_backend_server;
  6. ????????proxy_http_version 1.1;
  7. ????????proxy_set_header Upgrade $http_upgrade;
  8. ????????proxy_set_header Connection 'upgrade';
  9. ????????proxy_set_header Host $host;
  10. ????????proxy_cache_bypass $http_upgrade;
  11. ????????# 调整最大临时文件大小
  12. ????????proxy_max_temp_file_size 1024m; ?# 设置临时文件最大为 1GB
  13. ????}
  14. }
复制代码
5. 总结

WebSocket 提供了高效的实时通信本领,但在现实摆设中,尤其是当涉及长连接和大数据传输时,必须对 Nginx 进行一些优化设置以确保连接的稳固性和高效性。

通过这些设置,你可以确保 Nginx 可以大概高效、稳固地代理 WebSocket 长连接,支持大数据传输,满足实时通信应用的需求。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4