643 字
2 分钟
seeStrangers 项目复盘:WebRTC + Rust 实时通信实践
kongdf
/
seeStrangers
Waiting for api.github.com...
00K
0K
0K
Waiting...

seeStrangers 是我做的一个 WebRTC 视频聊天项目,支持随机匹配、房间通话和屏幕共享。
实时通信链路基于 WebSocket,后端从 Node 迁移到 Rust + Axum,核心目标是让线上更稳、部署更省心。

技术栈#

  • 前端:Vue 3、Vite、Element Plus
  • 后端:Rust、Axum(WebSocket 实时通信)

本地开发#

后端默认监听实时通信端口(README 里是 3101),前端开发服务器一般在 3000

启动后端:

cd backend
cargo run

启动前端:

cd frontend
npm install
npm run dev

打包#

前端#

cd frontend
npm install
npm run build

产物在 frontend/dist,部署时让 Nginx 这类静态服务器托管即可。

后端:在 macOS 上交叉编译 Linux(musl,便于上 CentOS)#

如果你在 Mac(Apple Silicon / Intel)上开发,可以用 Zig + cargo-zigbuild 直接交叉编译 Linux 二进制(x86_64-unknown-linux-musl),这样服务器就不用再装完整 Rust 工具链了:

brew install zig
cargo install cargo-zigbuild
rustup target add x86_64-unknown-linux-musl
cd backend
cargo zigbuild --release --target x86_64-unknown-linux-musl

产物路径示例:backend/target/x86_64-unknown-linux-musl/release/webrtc-backend(以仓库内实际 crate 命名为准)。

部署到 CentOS 的关键点#

上传产物#

把编译好的后端可执行文件和前端 dist 上传到服务器固定目录,例如:

scp backend/target/x86_64-unknown-linux-musl/release/webrtc-backend root@<SERVER_IP>:/opt/server/seeStrangers/webrtc-backend
scp -r frontend/dist root@<SERVER_IP>:/opt/server/seeStrangers/frontend/

用 systemd 管后端#

示例单元文件 /etc/systemd/system/seestrangers.service

[Unit]
Description=seeStrangers Rust Backend
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/server/seeStrangers
ExecStart=/opt/server/seeStrangers/webrtc-backend
Restart=always
RestartSec=3
User=root
[Install]
WantedBy=multi-user.target

启动与查看状态:

chmod +x /opt/server/seeStrangers/webrtc-backend
systemctl daemon-reload
systemctl enable --now seestrangers.service
systemctl restart seestrangers.service
systemctl status seestrangers.service

静态站点和 WebSocket 一般交给 Nginx 做反向代理。
这块最容易踩坑的是 UpgradeConnection 这些头,以及前端 WS_URL 和实际域名/路径不一致。常见现象就是页面能打开,但实时通信通道怎么都连不上。

常见问题(排障速记)#

  • Exec format error:多半是二进制架构不对,比如在 Linux 上误放了 macOS 的 Mach-O。服务器上要的是 Linux 的 ELF,请确认目标 triple 和上传文件一致。
  • status=203/EXEC:常见于 ExecStart 路径写错,或文件没有可执行权限(chmod +x)。
  • WebSocket 失败:重点核对前端 WS_URL、Nginx 的 WebSocket 反代配置、以及后端进程是否在监听(如 3101)。

小结#

这次从 Node 迁到 Rust + Axum 的收益主要是稳定性和部署可控性。
如果你也在做 WebRTC 项目,建议把“实时通信链路可观测性”和“部署脚本化”优先做好,后续排障会轻松很多。

整体流程和 仓库 README 一致,你可以按自己的环境调整路径和域名。
想试玩或拉代码,直接看文首的在线地址和仓库链接即可。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

seeStrangers 项目复盘:WebRTC + Rust 实时通信实践
https://kongdf.com/posts/learning/projects/seestrangers-webrtc-rust/
作者
孔大夫
发布于
2026-04-23
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时