我正在创建一个农场管理网站。我正在 CyberPanel 上运行 Asp Net Web API。我是按照这篇文章完成的:在 CyberPanel / Linux 上发布并运行 ASP.Net – Viov 的博客
问题是我正在使用一种名为 SignalR 的技术。 SignalR 基本上是一个顶级抽象层,用于简化 Web 套接字(它还包括其他功能,但现在不重要了)。开发环境中的一切都按预期进行,但是当我部署应用程序并在 Cyberpanel 上托管 Asp Net 时,Web 套接字停止工作。
Cyberpanel 错误日志打印此:
[2023-05-24 09:26:32.085918 [信息] [18351] [187.74.137.142:46278#api.milksolve.com.br] 找不到 Web 套接字后端。 URI:[/fazendahub]
客户端说Websocket没有发送握手,所以Websocket肯定没有工作。我检查了访问日志,确认 Signalr 协议在 Web 套接字连接上中断。大家有解决办法吗
编辑:
经过一番研究,我发现这个问题与 虚拟主机反向代理。 CyberPanel 使用 OpenLiteSpeed,我在互联网上找到的唯一解决方案是 Ngix 和 Apache。
我的重写文件:
RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule /(.*) ws://127.0.0.1:5000/$1 [P]
仍然无法使用 WebSocket
本文的作者,有趣的是,您通过我的文章节省了时间,而我通过使用您的文章节省了时间:D 我将用 SignalR 和 Blazor 部分更新我的文章。只是为了确保您在执行 RewriteRule 时可以确认名称 [EXTERNAL SERVER] 始终位于 [] 内。
所以它
RewriteRule /(.*) ws://[服务器名称]/$1 [P,L]
不是
RewriteRule /(.*) ws://服务器名称/$1 [P,L]
谢谢!
PS: 很快我将在我的博客上发布一篇关于在 CyberPanel 上直接与 Github 同步 ASP 项目的文章。不再受 Visual Studio 的发布部分的困扰,并为每次更改执行“sudo systemctl restart example.service”。
经过几天的痛苦,我找到了自己的解决方案。首先是按照本文所述设置反向代理:在 CyberPanel / Linux 上发布并运行 ASP.Net – Viov 的博客
这里唯一的区别是您需要在标题操作上添加此行:
RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
更改此设置后,您将需要创建一个 WebSocket 代理。 OpenLiteSpeed 有自己的选项卡:
这里只需要创建一个WebSocket Proxy即可,但是有两点很重要:
创建后,您将需要添加一些重写规则,如果您使用 CyberPanel,则应在其网站管理区域中完成。如果不这样做,您只需要转到 OpenLiteSpeed 上的重写区域(我将在 Cyberpanel 上显示)。
重写规则应该是这样的:
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://[External App Name]/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) http://[External App Name]/$1 [P,L]
*重要*
您将 [外部应用程序名称] 更改为在创建反向代理期间定义的外部应用程序名称,要查看该名称,您将转到 OpenLiteSpeed 上的此屏幕:
在这里您可以看到外部应用程序的名称。完成所有这些后,您应该刷新 OpenLiteSpeed 并重新启动您的 Asp Net 服务。这应该可以解决你的问题
我也有同样的问题。我花了两天时间修复它,我希望我早点发现你的问题。解决方案是在 OpenLiteSpeed -> Virtual Hosts 中设置 Web Socket 代理。
我在这里发布了解决方案:https://forum.openlitespeed.org/threads/how-to-setup-an-asp-net-core-website.4940/page-2#post-15081
但我有一个问题。我正在使用 ASP.NET 代码来设置 X-Forwarded-Proto:
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
我还没有按照你的建议在 OpenLiteSpeed 中设置它:
RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
它正在工作,我想知道我是否需要在 OpenLiteSpeed 的标头中设置 X-Forwarded-Proto