在高并发、高可用(HA)场景下运维 Ubuntu Server(尤其是 LTS 版本如 22.04/24.04),需兼顾系统稳定性、服务韧性、可观测性与自动化能力。以下是经过生产环境验证的核心运维实践与高频踩坑问题,按模块结构化整理:
一、关键运维实践(Production-Ready Checklist)
✅ 1. 系统层加固与调优
| 类别 | 实践要点 | 配置示例/命令 |
|---|---|---|
| 内核参数优化 | 调整网络栈、文件句柄、内存管理 |
|
| I/O 调度与存储 | 避免默认 cfq(已废弃),SSD 用 none/kyber |
echo 'none' > /sys/block/nvme0n1/queue/scheduler(需持久化到 /etc/default/grub) |
| 时间同步 | 强制使用 systemd-timesyncd 或 chrony(非 ntpd) |
sudo timedatectl set-ntp true;配置 chrony 使用多源 NTP(如 pool.ntp.org + 内网时钟源) |
✅ 2. 高可用架构设计
| 组件 | 推荐方案 | 关键注意事项 |
|---|---|---|
| 负载均衡 |
|
▶ Keepalived VIP 切换需配合 arping 广播 + preempt_delay 防抖▶ HAProxy 启用 option httpchk + http-check expect status 200 健康检查 |
| 服务发现 | Consul / etcd(K8s 场景) / 自建 DNS(CoreDNS) | 避免单点:Consul 集群 ≥3 节点,启用 raft 持久化 |
| 数据库 HA |
|
Patroni 的 loop_wait=10 + retry_timeout=10 防止脑裂;务必禁用 pg_hba.conf 中的 trust 认证 |
✅ 3. 应用层可靠性
| 场景 | 最佳实践 |
|---|---|
| 进程管理 | ✅ 用 systemd 替代 supervisord:• Restart=on-failure + RestartSec=5• MemoryMax=2G + CPUQuota=80%(cgroup 限流)• ProtectSystem=strict(防误删 /usr) |
| 日志治理 | ✅ journalctl --no-pager -u nginx --since "2 hours ago"✅ 日志轮转: logrotate 配置 maxsize 100M + compress✅ 关键应用日志输出到 stdout/stderr(便于容器化迁移) |
| 监控告警 | ✅ 必装三件套: • Prometheus(指标采集)+ Node Exporter(主机指标) • Grafana(可视化,预置 Ubuntu Dashboard) • Alertmanager(静默/分组/企业微信/钉钉通知) |
✅ 4. 自动化与安全
| 方向 | 工具链 | 关键动作 |
|---|---|---|
| 配置管理 | Ansible(无客户端依赖) | ▶ 使用 ansible-pull 实现 GitOps▶ 密钥管理: ansible-vault 加密敏感变量 |
| 安全基线 | Lynis(审计) + Unattended-Upgrades(自动更新) |
|
二、高频问题与根因解决方案(附诊断命令)
| 问题现象 | 根本原因 | 快速诊断 | 解决方案 |
|---|---|---|---|
| HTTP 502/504 频发 | 后端服务超时或连接池耗尽 | ss -s(查看 socket 状态)curl -v http://backend:8080/health(直连测试) |
▶ 调整 HAProxy timeout server 30s▶ 后端应用增加连接池(如 Spring Boot max-active=200) |
| 服务器响应延迟突增 | I/O Wait 高或 CPU 软中断瓶颈 | iostat -x 1(看 %util, await)sar -n DEV 1(网卡丢包)cat /proc/interrupts | grep eth0(软中断不均) |
▶ NVMe SSD 启用 irqbalance▶ 网卡绑定: ethtool -L eth0 combined 8(调整队列数) |
| 磁盘空间突然爆满 | journal 日志未轮转 / Docker 容器日志堆积 | journalctl --disk-usagedu -sh /var/log/journal/*docker system df -v |
▶ sudo systemctl edit systemd-journald → 添加 SystemMaxUse=500M▶ Docker 配置 log-driver: "json-file" + log-opts: {max-size: "10m", max-file: "3"} |
| SSH 连接被拒绝(但服务正常) | fail2ban 误封 IP 或 sshd 资源耗尽 |
sudo fail2ban-client status sshdsudo ss -tlnp | grep :22(确认监听) |
▶ 临时解封:sudo fail2ban-client set sshd unbanip 192.168.1.100▶ 限制并发: MaxStartups 10:30:60(sshd_config) |
| Kubernetes 节点 NotReady | kubelet 无法连接 containerd 或 cgroup v2 不兼容 |
sudo journalctl -u kubelet -n 100 --no-pagercat /proc/1/cgroup(确认 cgroup 版本) |
▶ Ubuntu 22.04+ 默认 cgroup v2,需在 /etc/default/grub 添加 systemd.unified_cgroup_hierarchy=0 并 update-grub |
三、避坑指南(血泪经验)
- ❌ 不要手动修改
/etc/resolv.conf→ 会被systemd-resolved或NetworkManager覆盖,改/etc/systemd/resolved.conf - ❌ 禁用 swap 后未调大
vm.swappiness→ 内存压力下 OOM Killer 会随机杀进程(设为1) - ❌ 用
apt upgrade升级内核后不重启 → 新内核未生效,且旧内核残留占用磁盘(dpkg --list | grep linux-image清理) - ✅ 所有生产变更必须走灰度发布:先 1 台节点测试 → 监控指标(CPU/内存/错误率)→ 全量 rollout
- ✅ 备份策略:
borgbackup(去重加密) +rsync到异地 NAS,每周验证一次恢复流程
四、推荐工具链组合(轻量级生产环境)
# 一键部署监控栈(Prometheus + Grafana)
curl -s https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/setup | kubectl create -f -
# Ubuntu 安全加固脚本(CIS Level 1)
sudo apt install lynis && sudo lynis audit system
# 网络诊断神器(替代 netstat/ss)
sudo apt install iproute2 htop iotop iftop nethogs
💡 终极建议:在 Ubuntu Server 上追求高并发高可用,核心不是堆砌技术,而是建立“可观测性驱动”的运维闭环——所有配置变更必须有监控覆盖,所有告警必须有 SOP 文档,所有故障必须复盘写入 Wiki。
如需针对具体场景(如:百万并发 WebSocket 服务、X_X级 PostgreSQL HA、边缘 K8s 集群)的深度配置模板,可提供详细需求,我可输出可直接部署的 YAML/Ansible Playbook。
CDNK博客