服务器选型与准备:云服务器 vs 物理机、操作系统选择、基础环境配置
说到接口部署,第一步不是写代码,而是选服务器。这个选择做错了,后面全是坑。我见过太多团队,项目上线后才发现服务器扛不住流量,或者运维成本高得离谱。今天咱们就把这事儿聊透。
云服务器 vs 物理机:别盲目跟风
先问自己一个问题:你的接口要服务多少人?日均请求量是多少?预算有多少?这三个问题决定了你的选择。
| 对比维度 | 云服务器 | 物理机 |
|---|---|---|
| 初始成本 | 按需付费,几百元/月起 | 一次性投入,几万到几十万 |
| 弹性扩展 | 分钟级扩容,自动伸缩 | 需要采购、上架、调试,以天为单位 |
| 运维负担 | 云厂商负责硬件、网络、电力 | 自己搞定机房、空调、UPS、硬盘更换 |
| 性能稳定性 | 共享宿主机,存在邻居效应 | 独占硬件,性能可预期 |
| 适用场景 | 中小型项目、初创团队、弹性需求高 | 大型系统、合规要求高、长期稳定负载 |
我个人习惯,90% 的场景选云服务器。为什么?因为省心。你想想看,一个创业团队,核心精力应该放在业务上,而不是半夜去机房换硬盘。我在项目中遇到过一家公司,为了省钱买了物理机,结果机房空调坏了,服务器宕机一整天,损失比省下的钱多十倍。
核心建议:起步阶段无脑选云服务器。等业务稳定了,日均请求量超过百万级,再考虑混合部署——核心数据放物理机,弹性层用云服务器。
操作系统选择:CentOS 还是 Ubuntu?
这个问题其实没那么纠结。我两个都用过,说说真实感受。
CentOS(现在推荐 Rocky Linux / AlmaLinux)
- RHEL 生态,稳定性极强,适合生产环境
- yum/dnf 包管理,软件包版本偏老但稳定
- 默认防火墙 firewalld,SELinux 默认开启
- 社区支持强,很多企业级文档基于 CentOS
Ubuntu(推荐 LTS 版本)
- apt 包管理,软件包更新快,新工具支持好
- 默认防火墙 ufw,配置简单
- Python/Node.js 等开发环境开箱友好
- 社区活跃,Stack Overflow 上问题答案多
我记得有一次帮客户排查问题,他们的 CentOS 7 上装了一个需要高版本 GCC 的软件,折腾了两天才搞定。换成 Ubuntu 的话,一个 apt install 就解决了。但反过来,CentOS 的稳定性确实让人放心,我有个跑了三年的接口服务,从来没因为系统层面出过问题。
我的选择:新项目用 Ubuntu 22.04 LTS,开发效率高。对稳定性有极致要求的核心服务,用 Rocky Linux 9。别再用 CentOS 7 了,它已经停止维护了。
基础环境配置:别偷懒,一步到位
服务器到手后,第一件事不是部署代码,而是做基础配置。这一步偷懒,后面全是坑。我列一个标准流程,照着做就行。
1. 系统更新与安全加固
# Ubuntu
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget vim git ufw
# Rocky Linux / AlmaLinux
sudo dnf update -y
sudo dnf install -y curl wget vim git firewalld
更新完系统,第一件事关掉 root 远程登录。为什么?因为 root 是黑客的第一目标。我见过一台刚上线的服务器,没关 root 登录,三小时内被暴力破解了上万次。
# 创建普通用户
sudo adduser deploy
sudo usermod -aG sudo deploy
# 配置 SSH 密钥登录
ssh-keygen -t ed25519 -C "your_email@example.com"
ssh-copy-id deploy@your_server_ip
# 修改 SSH 配置
sudo vim /etc/ssh/sshd_config
# 修改以下配置
PermitRootLogin no
PasswordAuthentication no
Port 2222 # 换个端口,减少扫描攻击
# 重启 SSH 服务
sudo systemctl restart sshd
注意:改 SSH 端口前,先确保新端口在防火墙中放行。否则你会把自己锁在外面。我曾经干过这事儿,大半夜联系机房重启服务器,尴尬至极。
2. 配置防火墙
防火墙是服务器的第一道防线。别裸奔,别裸奔,别裸奔。
# Ubuntu ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp # SSH 新端口
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw enable
# Rocky Linux firewalld
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload
3. 配置时区与时间同步
接口日志里的时间不对,排查问题会疯掉。统一用 UTC 或者北京时间,团队内部约定好。
# 设置时区
sudo timedatectl set-timezone Asia/Shanghai
# 安装 NTP 服务
sudo apt install -y chrony # Ubuntu
sudo dnf install -y chrony # Rocky Linux
# 启动并启用
sudo systemctl enable chronyd
sudo systemctl start chronyd
# 验证
timedatectl status
chronyc sources -v
4. 配置 Swap 与内核参数
接口服务对内存敏感。内存不够时,Swap 能救命,但别依赖它。
# 创建 2GB Swap 文件
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
# 优化内核参数
sudo vim /etc/sysctl.conf
# 添加以下配置
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
vm.swappiness = 10
# 生效
sudo sysctl -p
说明:tcp_tw_recycle 在 NAT 环境下会出问题,建议关掉。我踩过这个坑,接口偶尔超时,查了两天才发现是这个参数导致的。
5. 安装 Docker(推荐)
现在部署接口,我强烈建议用 Docker。环境一致性、快速部署、资源隔离,好处太多了。
# Ubuntu
curl -fsSL https://get.docker.com | bash
sudo usermod -aG docker $USER
# Rocky Linux
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io
sudo systemctl enable docker
sudo systemctl start docker
sudo usermod -aG docker $USER
装完 Docker,记得配置镜像加速器。国内拉镜像慢得让人抓狂。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
知识体系总览
下面这张图,把服务器选型与准备的整个流程串起来了。你可以把它当作 checklist,每部署一台新服务器,照着走一遍。
避坑指南
最后,分享几个我踩过的坑,你遇到了直接绕开。
- 别用 32 位系统。现在云服务器默认都是 64 位,但有些老镜像还是 32 位。32 位系统内存限制 4GB,跑个 Java 接口就爆了。
- Swap 别设太大。我见过有人给 4GB 内存的服务器设了 16GB Swap,结果磁盘 I/O 爆满,接口响应时间从 10ms 变成 10s。Swap 是救急用的,不是内存替代品。
- 防火墙规则别乱放行。曾经有个同事把 0.0.0.0/0 放行到 Redis 端口,结果数据库被勒索,数据全没了。记住:只放行业务需要的端口,来源 IP 尽量限制。
- Docker 别用 root 跑。默认 Docker 需要 root 权限,但你可以把用户加入 docker 组。不过要注意,docker 组权限等同于 root,别随便加人。
- 系统盘和数据盘分开。云服务器默认系统盘 40GB,够用。但数据要挂载独立的数据盘,方便扩容和迁移。我吃过亏,系统盘写满后服务器直接挂了。