发布blazor应用到Linux, 使用nginx作为WebSocket代理

news/2025/1/5 23:46:17/文章来源:https://www.cnblogs.com/densen2014/p/18651432

Blazor 使用了SignalR连接, 而SignalR使用的是WebSocket

WebSocket协议提供了一种创建支持客户端和服务器之间实时双向通信的 Web 应用程序的方法。作为 HTML5 的一部分,WebSocket 使开发此类应用程序比以前的方法容易得多。大多数现代浏览器都支持 WebSocket,包括 Chrome、Firefox、Internet Explorer、Opera 和 Safari,而且现在越来越多的服务器应用程序框架也支持 WebSocket。

对于企业生产用途,需要多个 WebSocket 服务器来实现性能和高可用性,因此需要一个能够理解 WebSocket 协议的负载平衡层,nginx自 1.3 版起就支持 WebSocket,可以充当反向代理并对 WebSocket 应用程序进行负载平衡。(nginx plus 的所有版本也都支持 WebSocket。)

查看有关 NGINX 可扩展性的最新性能测试,以平衡 WebSocket 连接的负载。

WebSocket 协议与 HTTP 协议不同,但 WebSocket 握手与 HTTP 兼容,可使用 HTTP 升级功能将连接从 HTTP 升级到 WebSocket。这使得 WebSocket 应用程序能够更轻松地融入现有基础设施。例如,WebSocket 应用程序可以使用标准 HTTP 端口 80 和 443,从而允许使用现有的防火墙规则。

WebSocket 应用程序在客户端和服务器之间保持长期连接,从而促进实时应用程序的开发。用于将连接从 HTTP 升级到 WebSocket 的 HTTP 升级机制使用Upgrade和Connection标头。反向代理服务器在支持 WebSocket 方面面临一些挑战。一个挑战是 WebSocket 是一种逐跳协议,因此当代理服务器拦截来自客户端的升级请求时,它需要向后端服务器发送自己的升级请求,包括适当的标头。此外,由于 WebSocket 连接是长寿命的,而不是 HTTP 使用的典型短寿命连接,因此反向代理需要允许这些连接保持打开状态,而不是因为它们似乎处于空闲状态而关闭它们。

nginx通过允许在客户端和后端服务器之间建立隧道来支持 WebSocket。为了让nginx将升级请求从客户端发送到后端服务器,必须明确设置Upgrade和Connection标头,如以下示例所示:

location / {    proxy_pass http://localhost:5001;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";proxy_set_header Host $host;
}

一旦完成后,nginx会将其作为 WebSocket 连接处理。

以下是我宝塔配置部分

    # location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$# {#     expires      30d;#     error_log /dev/null;#     access_log /dev/null;# }# location ~ .*\.(js|css)?$# {#     expires      12h;#     error_log /dev/null;#     access_log /dev/null;# } #以下为ssr配置#上面的 location ~ .*\.(js|css)?$ 和 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ 整段要注销    #add_header X-Frame-Options SAMEORIGIN;    #Redirects all trafficlocation / {proxy_pass http://localhost:5001;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;proxy_set_header Host $host;proxy_cache_bypass $http_upgrade;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/863745.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读数据保护:工作负载的可恢复性25公用云存储

公有云存储1. 对象存储 1.1. 对象存储可能是未来比较适合长期保存备份与档案的一种技术 1.2. 它的核心功能本身就已经含有保护数据所需的一些特性 1.3. 对象存储系统里的所有数据都能自动复制到多个地点,这意味着它天生就符合3-2-1原则 1.4. 对象存储还可以应对磁退化的问题,…

C#进阶

进阶 目录进阶枚举数组值类型和引用类型函数函数基础ref和out变长参数和参数默认值函数重载递归函数复杂数据类型结构体排序冒泡排序选择排序飞行棋项目C#高级语法面向对象成员变量构造函数成员属性索引器静态成员拓展方法运算符重载内部类和分部类继承里氏替换原则继承中的构造…

P11503 [NordicOI 2018] Nordic Camping

P11503 [NordicOI 2018] Nordic Camping 花了我挺长时间。 帐篷都是正方形的,可以枚举左上角,二分正方形边长,二维前缀和判断是否合法。这部分复杂度为 \(O(n^2\log n)\)。处理出来后,问题似乎就变成了矩形取最大值,单点查询。直接做是 \(\log^2\) 的,65 pts。具体就是,…

OpenXR间接链接、API层总体排序、加载器设计

OpenXR间接链接 通过加载器间接链接,应用程序动态生成OpenXR命令调度表。如果找不到加载器,或者只有比应用程序更旧的API,则此方法允许应用程序正常失败。为此,应用程序在加载器库上,使用特定平台的动态符号,查找(如dlsym())xrGetInstanceProcAddr命令的地址。一旦发…

OpenXR™加载器-设计、操作、调用链

OpenXR™加载器-设计和操作 1.2.1概述 OpenXR是一个分层体系结构,由以下元素组成: 1)OpenXR应用程序 2)OpenXR加载程序 3)OpenXR API层 4)OpenXR运行时间 一般概念适用于Windows和Linux的系统的加载程序。 首先,让把OpenXR环境看作一个整体。OpenXR应用程序位于执行链的…

经典专著《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》4本书推荐

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…

使用format_obproxy_digest_log工具分析obproxy网络层耗时SQL

之前写过一个博客,介绍 ob_tools包 来实施抓取 observer 层的 gv$ob_sql_audit 的SQL,还提供一些分析SQL来通过不同维度分析缓慢的业务SQL语句,免得和应用扯皮说数据库执行SQL慢。 但是分析出服务端业务SQL语句执行时间还不够,应用也有可能会和你扯皮说obproxy转发慢,也不…

win 安装Android子系统WSA

win 安装Android子系统WSA 仅适用于Windows10和11。 在WSA中,对于要运行的应用不能保证较好的Android兼容性。 1.启用虚拟机平台功能 启用虚拟机平台: PS C:\Users\xxx> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart然后重启计…

Windows环境配置Nginx服务实现负载均衡

系统环境:win10 测试服务:.net6.0+webapi 一、本地创建一个webapi项目二、新建一个api控制器,里面编写一个测试方法三、我直接把这一个项目复制了3份,然后修改控制器方法中的返回值分别为value01,value02,value03四、分别启动三个程序,并且配置不同的端口号Postman/Apif…

二维数组的使用

1.二位数组的理解 Java 语言里提供了支持多维数组的语法 如果说可以把一维数组当成几何中的线性图形,那么二维数组就相当于是一个表格,像右图Excel中的表格一样。 对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。其实,从数组底层…