本书未发布

安装

未匹配的标注

🚀 安装

命令行安装

先决条件

你可以通过使用 Docker安装过程 来避免这一配置步骤。

Soketi 基于 uWebSocket.js,这是一个基于 Node.js 的 WebSocket 服务器,由 C 语言转写而成。

在安装CLI版本之前,确保你有构建 soketi 所需的依赖:

  • Python 3.x
  • GIT
  • gcc 编译器和构建的依赖项

安装

由于 uWebSocket.js 的限制,Soketi 不能在 CentOS 7 上运行,但可以在 CentOS 8 上运行。查看Github issue

下面的例子适用于 Ubuntu。对于其他发行版,可以考虑使用对等的工具。

apt install -y git python3 gcc build-essential

使用 NPM 安装

由于 uWebSockets.js 的构建限制,需要 Node.js LTS(14.x,16.x,等等)。

soketi may be easily installed via the NPM CLI:

npm install -g @soketi/soketi

安装后,可以用 start 命令启动一个默认配置的 soketi 服务器:

soketi start

默认情况下,服务器将会启动在 127.0.0.1:6001 ,并附有以下应用凭证:

  • App ID: app-id
  • App Key: app-key
  • Secret: app-secret

这些凭证用于验证你的前端和后端应用程序,以便能够实时发送和接收信息。

下一步

Supervisor

为了使 soketi 服务器永久存活,你应该考虑 安装 一个进程管理器,如 supervisor,一个可以在后台运行和重启进程的守护程序。在安装了 Supervisor 之后,你可以使用下面的配置示例作为启动 soketi 服务器的一个良好起点:

[program:soketi]
process_name=%(program_name)s_%(process_num)02d
command=soketi start
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=ubuntu
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/soketi-supervisor.log
stopwaitsecs=60
stopsignal=sigint
minfds=10240

正如你在上面的配置中看到的,一个单独的 soketi 服务器将被启动,这个服务器将在失败时自动重新启动。日志将被写入 /var/log/soketi-supervisor.log

需要注意的是, stopwaitsecsstopsignal 的配置选项应该按照上面的例子设置。如果有必要,你可以把 stopwaitsecs 增加到一个更大的值。这是关于在服务器停止或重启时允许 soketi 优雅地关闭所有连接的秒数。

在 Linux 环境中,所有的东西都是一个文件,包括活动的套接字。为了跟踪套接字连接,soketi 为每个连接创建文件描述符。在某些情况下,你可能会遇到你的操作系统对文件描述符设置的软限制。在这种情况下,你可以把 Supervisor 的 minfds 配置选项设置为一个较高的值,以使操作系统能够处理更多的连接。

用 PM2 进行跨线程扩展

Node.js 是设计为在一个特定的时间内在一个 CPU 上运行的。这意味着,多线程实际上并不是普通意义上的多线程。为了解决这个问题,你可以使用在任何 soketi 安装中附带的已就绪的 PM2 二进制包:

pm2 start soketi-pm2 -- start

剩下的唯一注意事项是,这些进程是水平扩展的。你可能想用集群适配器配置 水平扩展,除非你还在多个不同的实例中进行扩展,在这种情况下,推荐使用 Redis 的适配器。

Docker

soketi 也可以通过预构建的 Docker 镜像获得。要开始使用,你可以简单地运行我们的一个可用镜像:

docker run -p 6001:6001 -p 9601:9601 quay.io/soketi/soketi:1.4-16-debian

接下来要做什么

基于 Alpine 的 镜像

由于 Alpine 不支持 BoringSSL,Soketi 不能通过 Alpine 镜像提供 本地SSL。在这里 了解原因,并使用基于 Debian 的镜像替代。你仍然可以在 soketi 前面使用你的代理 SSL。

每当在 soketi GitHub 仓库进行发布、提交或主干合并时,一个包含在 Docker 中运行应用程序所需代码的镜像就会发布到 quay.io/soketi/soketi

这个镜像的标签使用以下命名惯例:

quay.io/soketi/soketi:[git_version]-[node_version]

[git_version] 代表发布到 Git 仓库的 soketi 版本。这通常是 x.x.x,除非是提交或主分支。对于提交,该值是提交的 SHA 哈希值。当使用主分支镜像时,其值为 latest

目前,唯一支持的 [node_version]16-alpine。在未来将增加更多的 Node 版本。

以下的例子版本是有效的:

  • 1.0.0-16-alpine (指向 1.0.0)
  • 1.0-16-alpine (指向最新的 1.0)
  • 1-16-alpine (指向最新的 1.x)
  • latest-16-alpine (指向最新的 master 分支)

基于 Distroless 的镜像

由于 Distroless 不支持 BoringSSL,Soketi 不能通过 Alpine 镜像提供 本地SSL。在这里 了解原因,并使用基于 Debian 的镜像替代。你仍然可以在 soketi 前面使用你的代理 SSL。

感谢社区成员 @nsmith5pull request,基于 distroless 的镜像已经可用:

使用 distroless 容器的好处是,在远程代码执行漏洞的情况下,攻击者无法打开一个shell,因为容器中没有安装shell。这使得针对服务器的攻击更难实现,但也会使运行 kubectl exec <your soketi pod> -- /bin/bash 这样的东西更难调试,因为容器中同样没有可用的shell。

Distroless 镜像标签遵循与基于 Alpine 的镜像相同的规则,但标签的后缀是 -distroless 而不是 -alpine

docker run  -p  6001:6001  quay.io/soketi/soketi:1.0-16-distroless

我们建议在生产中使用 distroless 镜像,以避免任何涉及远程代码执行的安全问题。然而,请记住在这种情况下调试是不可用的,这可能更难调试实时容器 / pod。

Helm Charts

Soketi 也可以作为 Helm 图表,用于在 Kubernetes 环境中部署。安装细节和图表在 GitHub 上的一个单独的仓库(charts/soketi)中提供。你可以在这个仓库中找到完整的安装说明,以便在任何 Kubernetes 集群中配置和运行该应用程序。

接下来要做什么

Laravel Sail (Docker)

对于 Laravel Sail,你可以通过在你的 docker-compose.yaml 文件中添加一个新的服务,使用 soketi 的 Docker 镜像:

# 了解更多信息: https://learnku.com/docs/laravel/sail
version: '3'
services:
    # ...

    soketi:
        image: 'quay.io/soketi/soketi:latest-16-alpine'
        environment:
            SOKETI_DEBUG: '1'
            SOKETI_METRICS_SERVER_PORT: '9601'
        ports:
            - '${SOKETI_PORT:-6001}:6001'
            - '${SOKETI_METRICS_SERVER_PORT:-9601}:9601'
        networks:
            - sail

networks:
    sail:
        driver: bridge

在你的应用程序的 docker-compose.yml 文件中加入服务器定义后, 你应该配置你的广播环境变量以及 广播驱动

PUSHER_HOST=soketi
PUSHER_APP_ID=app-id
PUSHER_APP_KEY=app-key
PUSHER_APP_SECRET=app-secret

接下来要做什么

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~