说实话,第一次接触云服务器的时候,我盯着那个黑漆漆的终端界面,手里攥着密码,心里还真有点打鼓。但当你亲手把一台 Ubuntu 服务器从“裸机”变成能跑 Web 应用、能部署 Docker、甚至能跑机器学习模型的高性能实例时,那种掌控感是无与伦比的。今天咱们不整那些虚头巴脑的理论,直接干货,从你买完服务器那一刻开始,一步步把它调教到最佳状态。
第一步:拿到服务器后的“初次见面”
不管你是在 AWS EC2、Azure VM 还是阿里云 ECS 上买的机器,拿到手后第一件事不是急着装软件,而是安全连接。
1.1 密钥登录是底线
千万别直接 root 密码登录,除非你想被扫描脚本刷爆。生成一对 SSH 密钥,本地生成:
ssh-keygen -t ed25519 -C "your_email@example.com"
然后把公钥传到服务器。不同云厂商传的方式略有不同,但原理一样。以 AWS 为例,创建实例时直接选择密钥对;阿里云则在控制台的“密钥对”管理里导入你的公钥。
本地测试连接:
ssh -i /path/to/private/key ubuntu@your_server_ip
如果成功进入,第一步完成。记住,ubuntu 是 Ubuntu 默认的 sudo 用户,别直接 ssh root@...,除非你明确知道自己在干什么。
1.2 防火墙:UFW 必须开
新服务器默认 firewall 可能是关着的。立刻开启 UFW:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh # 或者你自定义的 SSH 端口
sudo ufw allow 80 # HTTP
sudo ufw allow 443 # HTTPS
sudo ufw enable
sudo ufw status verbose
这一步能挡住 90% 的自动化扫描攻击。别嫌麻烦,服务器安全是“零信任”逻辑,每一层都要加固。
第二步:系统初始化与基础优化
连接上了,别急着跑业务。先把系统底子打好。
2.1 更新系统与清理
sudo apt update && sudo apt upgrade -y
sudo apt autoremove --purge
sudo apt autoclean
这一步确保你拿到的是最新的安全补丁。Ubuntu 22.04 LTS 或 24.04 LTS 是生产环境的首选,稳定性好,支持周期长。
2.2 创建专用用户
别一直用 ubuntu 账号干所有事,创建一个你自己的 admin 用户:
sudo adduser zhangsan
sudo usermod -aG sudo zhangsan
然后测试新用户可以 sudo,再禁用 root 直接登录。编辑 /etc/ssh/sshd_config:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
重启 SSH 服务:
sudo systemctl restart sshd
这时候你再用新账号登录,连 root 都进不去了,安全性提升一个档次。
2.3 配置 Swap 分区
云服务器内存往往不够大,尤其是跑编译、数据库或 Docker 时。给个 Swap 能防止 OOM(内存溢出)直接杀进程。
检查当前 swap:
free -h
如果没有或太小,创建一个 4GB 的 swap 文件:
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
再设置 swappiness 值,避免 swap 太激进影响性能:
sudo sysctl vm.swappiness=10
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
第三步:云平台特有配置技巧
虽然 Ubuntu 系统层都一样,但不同云厂商在“外挂”功能上差异很大,这些才是真正影响成本和性能的关键。
3.1 AWS EC2:善用实例类型与存储
AWS 的坑在于类型太多。选实例时,别只看 vCPU 和内存。
- 通用型(t3, m6i):适合 Web 服务器、开发环境。注意 t3 实例有 CPU 积分,突发性能不好,跑重负载会被限速。
- 计算优化型(c6g, c7g):适合高 CPU 场景,比如编译、视频转码。
- 内存优化型(r6g, r7g):跑数据库(MySQL, PostgreSQL)、Redis 缓存的首选。
存储技巧:EBS 卷类型选 gp3 而不是 gp2,同样价格容量更大,性能更稳定。如果读多写少,考虑 io2 或 st1。
还有一个常被忽视的点:弹性 IP(EIP)。给服务器绑定一个固定 IP,避免重启后 IP 变掉,影响 DNS 解析。但记得解绑时释放,不然 AWS 要收空闲 IP 的费用。
3.2 Azure VM:注意区域定价与预留实例
Azure 的界面比 AWS 复杂,但它的“区域”概念很关键。同样配置的 VM,在西欧比在东南亚便宜不少。部署前查一下Azure 定价页面。
预留实例(Reserved Instances):如果你打算用一年以上,买 RI 能省 30%-70%。Azure 的 RI 可以灵活套用,比 AWS 的 RI 更友好。
加速网络:创建 VM 时记得勾选“启用加速网络”,这能让网卡工作在虚拟直接 I/O 模式,网络延迟从毫秒级降到微秒级,跑高并发服务效果明显。
3.3 阿里云 ECS:带宽买包年还是包月?
阿里云的带宽计费是独立于 ECS 实例之外的,这块最容易多花钱。
- 按量计费带宽:峰值高但平均低,适合临时活动。
- 固定带宽包年包月:长期稳定业务选这个,比如 5Mbps 固定带宽,一年下来比按量便宜很多。
安全组配置:阿里云的安全组默认是关闭的,需要你手动开放端口。别像 AWS 那样默认开放 0.0.0.0/0,把 SSH 端口限制为你的公网 IP 或家用 IP 段。
快照策略:开启自动快照,每周一次全量快照。阿里云的快照存储便宜,这是你最后的救命稻草。
第四步:高性能配置与调优
服务器跑起来了,怎么让它跑得更快、更稳?
4.1 内核参数调优
编辑 /etc/sysctl.conf,加入以下优化(适合高并发 Web 服务器):
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_fin_timeout = 15
生效:
sudo sysctl -p
这些参数主要优化 TCP 连接处理,减少 TIME_WAIT 积压,提升并发能力。
4.2 启用 BBR 拥塞控制算法
Linux 4.9+ 内核默认支持 BBR,比传统的 CUBIC 算法在高延迟、高带宽场景下吞吐量更高。
检查当前算法:
sysctl net.ipv4.tcp_congestion_control
如果不是 bbr,改成:
echo 'net.ipv4.tcp_congestion_control = bbr' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
4.3 日志轮转与磁盘清理
服务器跑久了,日志会撑爆磁盘。配置 logrotate:
sudo nano /etc/logrotate.d/myapp
内容示例:
/var/log/myapp/*.log {
weekly
rotate 4
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
postrotate
systemctl reload myapp > /dev/null 2>&1 || true
endscript
}
定期清理临时文件和旧内核:
sudo apt autoremove --purge
sudo journalctl --vacuum-time=7d
第五步:Docker 化部署与环境隔离
现在谁还裸装软件?Docker 是标准做法。
5.1 安装 Docker
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
注销重新登录后,docker 命令就不需要 sudo 了。
5.2 Docker Compose 管理多服务
创建一个 docker-compose.yml,定义你的服务:
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./html:/usr/share/nginx/html
- ./nginx.conf:/etc/nginx/nginx.conf
restart: unless-stopped
app:
build: ./myapp
ports:
- "3000:3000"
environment:
- NODE_ENV=production
restart: unless-stopped
db:
image: postgres:15
volumes:
- pgdata:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=your_strong_password
restart: unless-stopped
volumes:
pgdata:
启动:
docker compose up -d
5.3 反向代理与 HTTPS
用 Nginx 做反向代理,配合 Let’s Encrypt 免费证书:
server {
listen 80;
server_name yourdomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
用 Certbot 自动续期:
sudo certbot --nginx -d yourdomain.com
sudo crontab -e
# 加入每天自动续期检查
0 0 1 * * certbot renew --quiet
第六步:监控与日志集中管理
服务器再稳,没监控也是盲人摸象。
6.1 轻量级监控:Prometheus + Grafana
部署一套监控系统,用 Docker:
mkdir -p ~/monitoring
cd ~/monitoring
# Prometheus
docker run -d \
--name prometheus \
-p 9090:9090 \
-v /root/monitoring/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
# Node Exporter(收集服务器指标)
docker run -d \
--name node-exporter \
--pid=host \
-v "/proc:/host/proc:ro" \
-v "/sys:/host/sys:ro" \
-v /etc/hostname:/etc/hostname:ro \
-p 9100:9100 \
prom/node-exporter
# Grafana
docker run -d \
--name grafana \
-p 3001:3000 \
-v /root/monitoring/grafana-data:/var/lib/grafana \
grafana/grafana
访问 http://your_ip:3001,默认账号密码 admin/admin,添加 Prometheus 数据源,就能看到 CPU、内存、磁盘、网络的实时图表。
6.2 日志集中:EFK 栈或简易版
如果嫌 Elasticsearch 太重,可以用 Loki + Promtail + Grafana 组合,或者更简单的:把日志同步到远程服务器或对象存储(AWS S3、阿里云 OSS)。
简单方案:用 rsyslog 转发日志到中心日志服务器:
sudo apt install rsyslog
sudo nano /etc/rsyslog.d/50-default.conf
加入:
*.* @@log-server-ip:514
第七步:常见故障排查实战
7.1 无法 SSH 登录
现象:本地执行 ssh 卡住或报错。
排查步骤:
- 检查网络连通性:
ping your_server_ip - 检查端口是否开放:
telnet your_server_ip 22或用nc -zv your_server_ip 22 - 云控制台查看安全组/防火墙规则
- 用云厂商的 VNC 远程连接(所有云都提供网页版控制台终端)
- 检查 SSH 服务状态:
sudo systemctl status sshd - 查看日志:
sudo journalctl -u sshd -n 50 --no-pager
常见原因:密钥权限不对(必须是 600)、SSH 配置禁用了密钥登录、安全组没开 22 端口。
7.2 502 Bad Gateway
现象:浏览器访问网站报 502。
排查:
- 检查后端服务是否运行:
docker ps或systemctl status your_service - 检查 Nginx 配置是否正确:
sudo nginx -t - 查看 Nginx 错误日志:
sudo tail -f /var/log/nginx/error.log - 常见原因:后端服务挂了、端口映射错误、防火墙拦截了内网端口
7.3 磁盘空间不足
现象:df -h 显示根分区使用率 100%。
排查与清理:
- 找出大文件:
sudo du -sh /* | sort -hr - 清理 apt 缓存:
sudo apt clean - 清理旧内核:
sudo apt autoremove --purge - 清理日志:
sudo journalctl --vacuum-size=100M - 查找大日志文件:
sudo find / -type f -size +100M 2>/dev/null - 常见隐藏杀手:
/var/log下的 syslog、auth.log、nginx access/error logs
7.4 内存占用过高
现象:top 或 htop 显示内存快满,系统卡顿。
排查:
free -h查看内存使用情况top按内存排序,找出占用最高的进程- 检查是否有内存泄漏:观察特定进程内存是否持续增长
- 常见原因:Java 应用堆内存设置过大、数据库配置不当、Docker 容器未限制内存
- 解决方案:调整应用配置、限制 Docker 容器内存(
--memory=2g)、增加 Swap
7.5 CPU 负载高
现象:uptime 显示 load average 远高于 CPU 核数。
排查:
top查看 CPU 占用进程vmstat 1观察系统状态- 区分是用户态 CPU(应用计算)还是内核态 CPU(I/O 等待、中断)
- 如果是 I/O 等待高,检查磁盘性能:
iostat -x 1 - 解决方案:优化应用代码、增加索引、升级 SSD、横向扩展
第八步:备份与灾难恢复
最后一块拼图:备份。没有备份的服务器等于没备份的硬盘——随时可能后悔。
8.1 系统级备份
使用 timeshift 或 rsync 定期备份:
# 每日备份系统配置
sudo apt install timeshift
sudo timeshift --create --comments "daily-backup-$(date +%Y%m%d)"
sudo timeshift --schedule-daily --enabled
8.2 数据备份
数据库备份脚本示例:
#!/bin/bash
BACKUP_DIR="/backups/db"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
# 备份 MySQL
mysqldump -u root -p'password' --all-databases | gzip > $BACKUP_DIR/mysql_$DATE.sql.gz
# 备份 Postgres
pg_dumpall -U postgres | gzip > $BACKUP_DIR/pg_$DATE.sql.gz
# 删除30天前的备份
find $BACKUP_DIR -name "*.gz" -mtime +30 -delete
用 crontab 定时执行:
0 2 * * * /root/scripts/db-backup.sh
8.3 备份到远程存储
本地备份不够,同步到对象存储:
# AWS S3
aws s3 sync /backups/db s3://your-bucket/backups/db --delete
# 阿里云 OSS
ossutil cp -r /backups/db oss://your-bucket/backups/db/
结语:持续学习与迭代
服务器配置不是一劳永逸的事。今天配的参数,明年可能就不是最优解。养成定期review的习惯,看看云厂商的新特性,关注安全漏洞公告,持续优化。
记住几个原则:
- 最小权限:给用户、服务、容器分配最小必要权限
- 自动化:能用脚本和配置管理(Ansible/Terraform)的就不要手动操作
- **监控先行