服务器选型与初始化
买服务器最容易犯两个错:一是按“越多核越好”买,把预算花在永远用不满的 CPU 上;二是买完直接装环境,连普通用户、时区、swap 都没配,后面每一步都在填坑。本章先讲选型看哪几个指标,再给出一份可以照着敲的初始化流程,最后约定一套目录规范。
选型要看哪几个指标
| 指标 | 说明 | 小站建议 | 踩坑提示 |
|---|---|---|---|
| CPU | 应用并发能力的基础 | 2 核起步,Java/编译型服务 4 核 | 单核跑 Java 编译或 Node 构建会非常慢 |
| 内存 | 最容易成为瓶颈的资源 | 4 GB 起步,8 GB 更稳 | MySQL + Java + 构建同时跑,2 GB 必 OOM |
| 带宽 | 决定“同时多少人在下载” | 3~5 Mbps 起步,静态资源上 CDN | 带宽按峰值计费,图片直传公网极烧钱 |
| 系统盘 | 装系统、日志、镜像 | 40~60 GB ESSD/SSD | 用高效云盘跑数据库,IOPS 会成为瓶颈 |
| 数据盘 | 放数据库与上传文件 | 有数据库就单独挂一块 | 数据与系统同盘,重装系统等于丢数据 |
| 地域 | 物理距离决定延迟 | 用户在哪就选哪个地域 | 选错地域,境外用户访问会多几百毫秒 |
| 计费 | 包年包月 vs 按量付费 | 长期跑用包年包月,测试用按量 | 按量付费忘关机,账单很难看 |
2C4G 能跑什么
| 部署内容 | 是否可行 | 说明 |
|---|---|---|
| Nginx + 静态站点 | 非常轻松 | 单机可扛数万 QPS 的静态请求 |
| Nginx + Go/Python 单体 API | 可行 | 注意 Gunicorn/uWSGI 的 worker 数别超过核数 |
| Nginx + Node 单体 API | 可行 | 用 pm2 或 systemd 起 2 个实例即可 |
| MySQL 8 + Redis | 可行但需调参 | innodb_buffer_pool_size 给 1~1.5 GB,别再给 4 GB |
| Spring Boot + MySQL + Redis | 勉强 | 堆内存压到 -Xmx1g,否则随时 OOM |
| 同时跑构建 + 数据库 + 应用 | 不建议 | 构建会抢占内存,容易把线上服务打挂 |
结论:小站不要在同一台机器上做构建,镜像和产物在本地或 CI 构建好再推上去,是最省心的做法。
系统怎么选
| 发行版 | 包管理 | 特点 | 适合谁 |
|---|---|---|---|
| Ubuntu 22.04/24.04 LTS | apt | 文档最多、社区最活跃、Docker 支持最好 | 绝大多数人,默认推荐 |
| Debian 12 | apt | 更精简稳定,软件版本偏旧 | 追求稳、能接受旧版本的人 |
| Alibaba Cloud Linux 3 | dnf | 阿里云自研,内核与镜像源针对云优化 | 用阿里云 ECS 且想省事的人 |
| Anolis OS / OpenAnolis | dnf | CentOS 停更后的国产替代 | 需要 RHEL 兼容生态的场景 |
| CentOS Stream 9 | dnf | 滚动预览,介于 Fedora 与 RHEL 之间 | 明确知道自己在做什么的人 |
取舍观点:新机器一律优先 Ubuntu LTS 或 Alibaba Cloud Linux 3。CentOS 7 已于 2024 年 6 月停止维护,不要再新装;CentOS Stream 是上游预览版,生产环境要慎重。
初始化步骤
# 1) 更新系统并装常用工具(Ubuntu / Debian)
sudo apt update && sudo apt -y upgrade
sudo apt -y install curl wget git vim unzip htop lsof net-tools chrony ca-certificates
# 1b) Alibaba Cloud Linux / RHEL 系把上面两条换成
# sudo dnf -y update
# sudo dnf -y install curl wget git vim unzip htop lsof net-tools chrony
# 2) 创建普通用户并授予 sudo(不要长期用 root 登录)
sudo adduser deploy
sudo usermod -aG sudo deploy # Debian / Ubuntu
# sudo usermod -aG wheel deploy # Alibaba Cloud Linux / CentOS / RHEL
# 3) 主机名与时区,时区错了日志时间会全部偏 8 小时
sudo hostnamectl set-hostname web-prod-01
sudo timedatectl set-timezone Asia/Shanghai
timedatectl status
# 4) 时间同步(chrony 比旧 ntpd 更准,云环境默认就有)
sudo systemctl enable --now chrony
chronyc sources -v
# 5) 小内存机器加 swap,避免偶发 OOM 直接把进程杀掉
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
free -h
# 6) 让 swap 只做兜底,不要过早换出(值越小越少用 swap)
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swap.conf
sudo sysctl --system
# 7) 文件句柄数,Nginx 与高并发服务的常见天花板
echo -e '* soft nofile 65535\n* hard nofile 65535' | sudo tee /etc/security/limits.d/99-nofile.conf
目录规范
| 路径 | 用途 | 说明 |
|---|---|---|
/opt/appname | 第三方/自建应用的安装目录 | 自带完整目录结构、可整目录替换的应用放这里 |
/srv/appname | 对外提供的服务数据与站点根目录 | 静态站点产物、Compose 的 docker-compose.yml |
~/apps/appname | 部署用户自己的应用目录 | 免 sudo 就能读写,适合个人项目与 CI 部署 |
/var/log/appname | 应用日志 | 配合 logrotate,避免写满系统盘 |
/data | 数据盘挂载点 | MySQL 数据目录、上传文件目录放这里 |
推荐约定:代码与配置放 ~/apps/<name>,站点产物放 /srv/www/<name>,数据放 /data/<name>。三处分离,重装系统或换机器时只需要迁移 /data。
验证方法
# 时区与时间同步是否生效
timedatectl | grep -E 'Time zone|synchronized'
# swap 是否挂上,能否开机自动挂载
free -h && swapon --show
# 普通用户是否能正常 sudo
su - deploy -c 'sudo -n true && echo sudo-ok'
# 句柄数在新会话中是否生效(重新登录后执行)
ulimit -n
# 系统负载与磁盘水位
uptime && df -hT
timedatectl 显示 synchronized: yes、swapon --show 有输出、ulimit -n 是 65535,初始化就算合格。
常见坑
| 坑 | 后果 | 做法 |
|---|---|---|
| 一直用 root 登录 | 误删文件、被爆破后直接失守 | 建普通用户 + sudo,root 只用于救援 |
| 不改时区 | 日志、cron、证书校验全错 8 小时 | timedatectl set-timezone Asia/Shanghai |
| 忘记 swap | 内存瞬时冲高直接 OOM Kill | 加 1~2 倍内存的 swap 兜底 |
| swap 太激进 | 数据库被换出,延迟抖动 | vm.swappiness=10 |
| 数据与系统同盘 | 重装系统后数据全丢 | 单独挂数据盘,挂到 /data |
| 在服务器上编译 | 内存被吃满,线上服务受影响 | 本地或 CI 构建,只上传产物 |
| 忘记记录买过什么 | 换机器时对不上配置 | 把机型、镜像、磁盘、带宽记进运维文档 |
小结:选型先看内存和带宽,再看 CPU,2C4G 足够跑中小站点的 Nginx + 单体应用 + 数据库,但别在同一台机上做构建;系统默认选 Ubuntu LTS 或 Alibaba Cloud Linux 3,初始化务必完成更新、普通用户、时区、时间同步、swap、句柄数六件事,目录按代码、数据、日志三处分离,后面换机器才不痛苦。