1.3 机器准备:轻量应用服务器怎么选
场景:同一台机器要干四件事
架构定了轻量应用服务器,但点开购买页还是懵:2 核 2G 还是 4 核 8G?峰值带宽 5M 还是 8M?系统盘多大?CPU 型号看得人眼花。我们的这台机器最后要同时干四件事:跑预约接口服务、托管后台管理工作台、跑每分钟的定时任务(释放超时占位)、放一小部分静态页面。把这些需求往配置上一对,选择就清楚多了。
林姐听到我们要自己买服务器时问了一句:这玩意儿会宕机吗?诚实回答是会,但轻量带快照和监控,宕机了恢复时间以分钟计。相比之下柜台上那台老 Windows 收银机才是真正的单点隐患。
顺带一提,轻量的控制台对非技术人员友好,后来林姐自己学会了看流量监控图和重启按钮,遇到异常先截个图发群里,省了我们好多沟通成本。
项目有两个特点必须先说清楚:一是并发不高,节假日估算峰值也就两三百同时在线,不是秒杀那种量级;二是预算敏感,能省的配置坚决不堆。所以我们的选型策略是先买够用的,留一个随时能升配的后路。
顺便说一句,轻量的升配是真的方便,控制台点一下重启就生效,没过几分钟就能从 2 核升到 4 核。这给了我们底气:起步不堆配置,峰值真的顶不住再升。怕的是那种一上来买顶配、月底看账单后悔的团队。
方案:按职责任务推配置
我们把四件事逐项拆开估算内存占用,做出了下面这张选型表。比起看参数页,按任务估算更直观:
| 任务 | 预估内存 | CPU 占用 | 备注 |
|---|---|---|---|
| Go 预约服务 | 约 50MB | 平时 2%,高峰 40% | 单进程跑 |
| Nginx 静态托管 | 约 20MB | 忽略 | 工作台页面 |
| 定时任务协程 | 约 10MB | 每分钟脉冲 | 释放占位锁 |
| 日志采集 Agent | 约 30MB | 常驻 | 推送到 CLS |
| 系统与监控代理 | 约 200MB | 常驻 | 这一栏最容易被忘 |
加起来 350MB 上下,2G 内存起步绰绰有余;CPU 两核对一个 Go 单体足够,高峰期顶满也就几秒钟。带宽是真正的瓶颈变量,着我们做了个粗算:
| 带宽 | 每秒可传 | 高峰撑不撑得住 |
|---|---|---|
| 1M | 约 128KB,约 40 次请求 | 明显超时 |
| 3M | 约 384KB,约 120 次 | 勉强 |
| 5M | 约 640KB,约 160 次 | 够用有余 |
| 8M | 约 1MB,约 300 次 | 浪费 |
小程序里点一次选时间就要拉一屏时段数据,我们测过一次列表请求约 3KB,5M 带宽理论能撑住每秒 160 次请求的传输,拟合节假日峰值没问题。CSS 和小程序包都走 CDN 加速,服务器只出 JSON,带宽压力进一步摊薄。最后下单的是 2 核 2G、5M 峰值带宽、50GB SSD 系统盘的套餐,赶上特惠一次买了三年,折算下来月租五十块出头:腾讯云轻量应用服务器限时特惠。
配置买定离手前,我们用一台临时同配机器做了轮压测,模拟国庆峰值的 200 并发:
| 压测场景 | 并发数 | P99 延迟 | 结论 |
|---|---|---|---|
| 拉时段列表 | 200 | 90ms | 带宽没到顶 |
| 创建预约 | 100 | 160ms | 锁竞争在 MySQL |
| 短信下发回调 | 50 | 40ms | 闲置 |
| 全链路混合 | 260 | 230ms | 可接受 |
压测救了我们一命:200 并发创建预约时 MySQL 的行锁等待明显上升,这才有机会在上线前把热点时段的锁粒度优化掉,具体做法见 并发占位与锁。压测还顺带验证了 Go 进程在并发下的稳定性,高峰期 top 里的 CPU 曲线像心电图一样规律,没有出现内存泄漏迹象。
付费周期也值得算一笔账:
| 付费方式 | 月均成本 | 风险 |
|---|---|---|
| 按月 | 60 元左右 | 随时被价格波动影响 |
| 包年 | 50 元上下 | 中途项目黄了心疼 |
| 三年 | 40 元上下 | 绑定最深但最便宜 |
考虑到系统已经跑通且没有迁移计划,我们直接上了三年,省下来的钱够交大半年的短信费。对小店老板来说,一次性付费的另一个好处是财务上好记账,不用每个月对着跳动的小额账单怀疑人生。
配置/代码:开机先做的四件事
机器到手,先做初始化配置再传代码。第一件是改 SSH 端口并禁掉密码登录,只放公钥;轻量的防火墙规则里顺手放行 80 和 443,MySQL 只对内网云数据库的地址放行。改端口这步看着多余,实际上每天有大量扫描脚本在敲 22 端口,日志里触目惊心:
# /etc/systemd/system/booking.service
[Unit]
Description=booking api
After=network.target
[Service]
ExecStart=/opt/booking/server --env=/etc/booking/env
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
第二件是挂载数据盘、第三件是开启每日快照、第四件是装好日志采集把请求日志推到 CLS。这四件事做完,后面基本都是业务开发了。定时任务直接用 Go 里的 cron 协程跑,不再依赖系统 crontab,这样服务重启不会丢任务,机器迁移也只带一个二进制文件。
Nginx 的配置只保留最必要的部分,反代到 Go 服务的 8080 端口:
server {
listen 443 ssl;
server_name booking.example.com;
ssl_certificate /etc/ssl/booking.pem;
ssl_certificate_key /etc/ssl/booking.key;
location /api/ { proxy_pass http://127.0.0.1:8080; }
location /admin/ { root /opt/booking/web; }
}
小程序后端必须 HTTPS,证书用免费的,一年一换。配置越简单越好,这台机器上不跑任何与预约无关的东西,保持干净。
开机四件事里最容易被略过的是每日快照。快照是机器级别的整盘备份,一旦被勒索或者误删配置,回滚到一个小时前的状态也就是几分钟的事。费用每天几毛,属于那种出事时感激涕零的投资。快照与云数据库 MySQL 的自动备份互补:前者保机器,后者保数据,两边都攥着才睡得着。
踩坑:三个首轮配置的教训
第一个教训是差点选了 1M 带宽的套餐。做预约系统的页面看似很轻,但客人反复刷时段列表时的流量是脉冲式的,1M 带宽在节假日刷一下就超时,客人以为系统坏了,直接退出小程序去打电话——那这套系统还不如不上。实测 5M 才够,差不了几块钱的事。
第二个教训是系统盘不能只看容量要看 IOPS。最初为了省钱选了普通云硬盘,初始化时段表三万行写入时明显卡顿,换 SSD 之后问题消失。预约系统的写入频率不算高,但写入卡顿会直接传导成接口超时,最后账要算在用户体验头上。
花了三天才把四件事做完,期间顺手记录了一个开机清单,后来交接给运维时直接照单执行,省了极多口舌。这个清单现在还贴在团队 wiki 第一页:改 SSH、挂数据盘、开快照、装日志采集,外加一条别忘了给云数据库设强密码。
第三个教训是地域选择。为了便宜选了离家最近的地域,结果发现美甲店的客人分布全国各地,小程序后端请求跨地域多绕十几毫秒。一次没忍住查了下轻量的多地域价格,发现差别不大,第二个项目开始果断选了用户集中区域的地域。
第四个教训是别忘系统监控代理占的内存。光算自己业务的内存不算数,轻量自带的监控、安全代理加起来常驻两百多MB,2G 机器上一开始心里慌得很,跑了一周发现峰值还不到 70%,这才放了心。如果当时图便宜买了 1G 内存,估计现在已经在为升级迁移发愁了。
小结
轻量应用服务器的选型核心就一句话:按任务估配置,别按参数页估。2 核 2G、5M 带宽、SSD 系统盘,对我们的预约系统是甜蜜点,逢特惠还能再便宜三成。压测一遍再下单,比买完提心吊胆强一百倍。开机四件件事事做到位,后面半年基本不用登服务器。顺嘴一句:特惠活动不是天天有,下单前去官网活动页转一圈,往往能省下两三成的预算,这算是我们这种小项目最实在的省钱方法。机器配置定了,下一节把后端框架和各云产品的接入路径一次对齐。
延伸阅读
- 想看轻量建站的完整流程,翻 轻量服务器建站指南
- 更多腾讯云项目实践,见 腾讯云实战合集
- 上线后的监控方案,见 监控告警:预约失败率
- 数据库那边的选型与容量,见 档期设计:时段表与容量
- 同样基于轻量的另一个案例: 云开发 Python 实战
