共享主机上的 Websockets:由于共享主机本身或非 php 集成而无法实现?

Posted

技术标签:

【中文标题】共享主机上的 Websockets:由于共享主机本身或非 php 集成而无法实现?【英文标题】:Websockets on shared hosting: not possible because of shared hosting itself or because of non-php integrations? 【发布时间】:2019-05-03 06:47:14 【问题描述】:

我想在我的共享主机上运行一个基本的聊天应用程序。 我会使用 php Websockets 实现库,Ratchet。

但是,当我转到我的共享主机 (Hostgator) websockets 信息页面时,它指出:

PHP 套接字支持? 如果您正在连接,它应该可以工作。我们不允许客户端绑定到本地端口以进行传入。

这是什么意思?我可以创建自己的 websocket 通过 ssh 运行命令吗?我会使用这个基本代码来运行它。

require dirname(__DIR__) . '/vendor/autoload.php';

$server = ioserver::factory(
    new HttpServer(
        new WsServer(
            new Chat()
        )
    ),
    8081
);

$server->run();

我注意到有类似的问题,但大多数答案都说这是不可能的,因为提问者试图使用大多数共享主机不支持的 Node.js 或 Python websockets 库。

【问题讨论】:

共享主机不允许您打开端口进行监听。你必须有适当的访问权限。 基本上,支持 web-sockets 是一些主机支持而有些不支持的功能,所以如果他们这么说,你必须获得另一个主机/计划(可能是 VPS) 【参考方案1】:

主要答案

共享主机通常允许您在高端口上监听,例如你正在使用的那个。但是在实践中会遇到很多问题。

首先,Web 服务器可能只允许 80 (HTTP) 和 443 (HTTPS) 入站,因此 8081 端口将被防火墙阻止。您的 PHP 侦听器会附加到端口,但会耐心等待永远不会到来的流量。

其次,一些共享主机前面会有一个负载平衡器,它们可能只配置为转发 HTTP 流量。由于 Web Sockets 是一种不同的协议,因此它们不会被设置为转发该协议。同样的端口问题在这里也重复了——非标准端口不会被转发。

要解决这些问题,您需要自己的 Web 服务器,您可以在其中以任何您喜欢的方式打开端口(并设置负载平衡器)。这些天这样做很便宜 - 每月几杯咖啡的价格,您可以租用小型虚拟服务器。它不会像共享服务器那样拥有那么多 RAM,但会更加灵活。

设计问题

我还要提请注意使用 Web 套接字的非标准端口来为标准 80/443 端口上的 Web 应用程序提供服务。这并不总是一个好主意。非标准端口可以在台式机和标准家庭互联网连接上正常工作,但对于某些办公室或移动互联网连接,您可能会陷入困境。

最好在您的应用程序前面放置一个负载均衡器,然后让它根据协议签名路由流量(Web Socket 或 HTTP)。这将允许您在每个端口使用多个协议。如果你有兴趣探索这个,我推荐使用 Docker 容器的 Traefik - 我已经设置了它,它确实工作得很好。

【讨论】:

感谢您的详尽解释 :)。那么,在您看来,Pusher 是否可以被视为一种负载均衡器?我注意到使用他们的服务比在我的应用程序(服务器)上托管我自己的 websocket 服务器性能要好得多 @Enrico:Pusher 很可能有负载均衡器,是的,而且它们可能会在全球范围内进行区域化,因此用户会将 Web 套接字发送到延迟最低的区域。建立这种服务有利有弊 - 它可以更快地进入市场,但如果您需要扩大规模,它会让您依赖可能不物有所值的服务。 现在更清楚了...最后一个(新手)问题:如果我通过我的应用程序在生产中部署 websocket 服务器,例如通过 Laravel,我是否需要手动登录 ssh 控制台并启动服务器(如果是 Laravel,你可以通过 php artisan websocket:serve 命令来完成)。如果是,那么服务器将一直运行,直到我再次手动关闭它? @Enrico,这完全取决于您如何设置服务器。确保 WS 侦听器始终启动的一个好方法是在 Supervisor(或其他一些进程观察器)中运行它。如果您使用 Docker/Traefik,则使用 Docker 或 Docker Compose 重启策略。 谢谢。听起来 Docker 正在加速这个过程。我试试看。

以上是关于共享主机上的 Websockets:由于共享主机本身或非 php 集成而无法实现?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 上的 WebSockets/长轮询 - 共享主机?

如何在共享主机上部署 laravel websockets?

由于跨域资源共享 (CORS),主机 Web 上的 SP.ClientContext 失败

HTML5 - 共享主机中的 WebSocket

怎么把Windows主机上的目录共享到Ubuntu上

Ajax Post Laravel 共享主机上的 403 错误