2、环境准备:操作系统选型、硬件要求、网络规划、依赖软件安装

部署任何服务,环境准备都是地基活。地基没打好,后面再怎么折腾也白搭。Join Server 虽然不算特别吃资源,但该有的规划一步都不能省。我见过太多人上来就装,结果网络不通、磁盘撑爆、证书配不上,最后全得重来。

这一章,咱们把环境准备拆成四个块:操作系统选什么、硬件要多少、网络怎么划、依赖装哪些。每个点我都会结合自己的踩坑经历来讲。

核心原则:Join Server 对底层依赖不多,但版本敏感。操作系统和依赖库的版本一旦选错,后面编译或运行时会报一些莫名其妙的错。所以,选型阶段多花 10 分钟,后面省 10 小时。

2.1 操作系统选型

我个人习惯,生产环境首选 Ubuntu 20.04 LTS 或 Debian 11。为什么?

  • 包管理成熟:apt 源里的 Erlang、PostgreSQL、Nginx 版本都比较新,不用自己编译。
  • 社区支持好:遇到问题,Google 一下基本都有现成答案。
  • 长期维护:LTS 版本有 5 年安全更新,省心。

如果你公司强制用 CentOS,那建议选 Rocky Linux 8 或 AlmaLinux 8。CentOS 7 已经 EOL 了,别再用。我记得有一次帮客户排查问题,他们还在用 CentOS 6,连 Erlang 23 都装不上,最后只能手动编译,折腾了两天。

操作系统 推荐版本 我的评价
Ubuntu 20.04 LTS / 22.04 LTS 首选,省心,包全
Debian 11 (Bullseye) 稳定,适合高要求场景
Rocky Linux 8.x CentOS 替代品,兼容性好
AlmaLinux 8.x 和 Rocky 差不多,看个人喜好

小建议:别用最小化安装。虽然看起来干净,但缺了常用工具(比如 curl、vim、net-tools),后面排查问题会很难受。我一般选「Server with GUI」或至少把开发工具包装上。

2.2 硬件要求

Join Server 本身不重,但它的后端依赖(PostgreSQL、MQTT 代理、可能的 Redis)会吃资源。说白了,你给多少资源,它就能扛多少并发。

我列一个最低配置和一个推荐配置,供你参考:

资源 最低配置 推荐配置 说明
CPU 2 核 4 核 Erlang 虚拟机对多核利用不错
内存 4 GB 8 GB PostgreSQL 和 Erlang 都是内存大户
磁盘 40 GB (SSD) 100 GB (SSD) 日志和数据库会慢慢涨
网络 千兆 千兆 内网延迟要低,尤其 MQTT 场景

注意:磁盘一定要用 SSD。我曾经在 HDD 上跑过 Join Server,数据库写入稍微一多,延迟直接飙到几百毫秒。SSD 不是可选项,是必需品。

2.3 网络规划

网络规划这块,很多人容易忽略。你想想看,Join Server 要跟设备通信、要跟应用服务器通信、还要跟数据库通信。端口不开通,服务跑起来也是白搭。

我一般会画一张网络拓扑图,把每个服务的端口列清楚。下面这张 SVG 图是我常用的规划思路:

Join Server 网络规划拓扑 外部网络 设备 / 客户端 防火墙 / 反向代理 开放端口: 443, 1883, 8883 Join Server 端口: 8080, 8081 PostgreSQL 端口: 5432 Redis (可选) 端口: 6379 端口说明: • 443: HTTPS 对外接口(设备注册、API) • 1883/8883: MQTT 端口(设备通信) • 8080/8081: Join Server 内部管理端口(仅内网开放)

端口规划上,我建议遵循最小权限原则:

  • 对外端口:只开 443(HTTPS)和 1883/8883(MQTT)。其他端口一律关掉。
  • 对内端口:Join Server 的管理端口(8080、8081)只绑定内网 IP,别暴露到公网。
  • 数据库端口:PostgreSQL 的 5432 只允许 Join Server 所在服务器访问,别开给整个网段。

避坑指南:我曾经把 PostgreSQL 端口开到了 0.0.0.0,结果被扫描工具扫出来,差点被攻击。后来我改成只监听 127.0.0.1,再用 Unix Socket 连接,安全多了。

2.4 依赖软件安装

Join Server 的依赖其实不多,但版本要卡死。我列一个清单:

软件 版本要求 用途
Erlang/OTP 24.x 或 25.x Join Server 运行环境
PostgreSQL 13.x 或 14.x 设备信息、会话数据存储
Nginx 1.18+ 反向代理、TLS 终结
Mosquitto (可选) 2.x MQTT 代理(如果不用内置)
Redis (可选) 6.x 会话缓存、速率限制

安装步骤其实很简单。以 Ubuntu 20.04 为例,我一般这么干:

# 更新包索引
sudo apt update

# 安装 Erlang(从官方源)
wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb
sudo dpkg -i erlang-solutions_2.0_all.deb
sudo apt update
sudo apt install esl-erlang

# 安装 PostgreSQL
sudo apt install postgresql postgresql-contrib

# 安装 Nginx
sudo apt install nginx

# 验证版本
erl -version
psql --version
nginx -v

注意:别用系统自带的 Erlang 包(比如 apt 里的 erlang 包),版本太老。一定要从 Erlang Solutions 官方源装。我见过有人用 apt 默认源装 Erlang,结果编译 Join Server 时一堆函数找不到,折腾了一下午。

安装完成后,建议做一次简单的健康检查:

  • Erlang 能启动 shell,输入 halt() 正常退出。
  • PostgreSQL 能通过 sudo -u postgres psql -c "SELECT version();" 返回版本信息。
  • Nginx 能通过 curl http://localhost 返回默认页面。

嗯,环境准备这块就这些。说白了,操作系统选 LTS,硬件给足 SSD,网络端口最小化,依赖版本卡死。做到这四点,后面部署 Join Server 基本不会卡在环境问题上。