服务器选型与准备:云服务器 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,每部署一台新服务器,照着走一遍。

服务器选型与准备流程 业务需求评估 云服务器(推荐) 物理机(特殊场景) Ubuntu 22.04 LTS Rocky Linux 9 基础环境配置:安全加固 → 防火墙 → 时区同步 → Swap → 内核优化 → Docker 可部署的生产环境 说明:云服务器 + Ubuntu 是大多数接口部署的最佳起点,物理机 + Rocky Linux 用于合规或性能敏感场景

避坑指南

最后,分享几个我踩过的坑,你遇到了直接绕开。

  • 别用 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,够用。但数据要挂载独立的数据盘,方便扩容和迁移。我吃过亏,系统盘写满后服务器直接挂了。