2026年Linux运维与SRE实战学习路线:从零基础到云原生自动化

最近几年,无论是传统企业上云,还是互联网、大数据、AI项目的爆发,都离不开一个核心岗位——Linux运维与SRE。很多朋友想转行,但面对海量教程和快速迭代的技术栈,常常感到无从下手:是学老掉牙的CentOS 6命令,还是直接上手Kubernetes?学完基础命令后,下一步该做什么?

本文正是为你准备的。我将结合当前(2026年)企业主流技术栈和招聘需求,为你梳理一条从零基础到具备SRE(站点可靠性工程)思维的Linux运维实战学习路径。这不是简单的命令罗列,而是涵盖系统管理、自动化运维、云原生、监控告警、安全加固的完整知识体系,并附带可直接上手的实战案例和避坑指南。无论你是完全零基础的转行者,还是希望系统提升的初级运维,都能从这里找到清晰的成长地图。

1. 为什么现在学Linux运维/SRE依然前景广阔?

在开始具体学习之前,我们有必要先了解这个领域的现状和未来。很多人担心运维岗位会被AI或自动化工具取代,但事实恰恰相反。

1.1 运维的演进:从“救火队员”到“稳定性架构师”传统的运维工作可能更偏向于手动操作服务器、处理报警。但在云原生和DevOps文化普及的今天,运维的角色已经转变为SRE(站点可靠性工程师)和平台工程师。核心工作不再是“哪里出问题修哪里”,而是通过自动化、可观测性、容量规划和高可用架构设计,从根本上保障业务的稳定、高效运行。这意味着对从业者的要求更高,但职业天花板和薪资也水涨船高。

1.2 技术栈的融合与核心不变性当前运维技术栈呈现出“云原生+自动化+安全”的融合趋势。Docker、Kubernetes、Prometheus、Ansible、Terraform等工具成为标配。然而,万变不离其宗,所有这些高级工具都运行在Linux操作系统之上。对Linux内核原理、系统性能、网络协议、Shell编程的深刻理解,是驾驭这些上层工具的基石。一个不懂iptables或systemd的人,很难真正玩转K8s的NetworkPolicy或服务管理。

1.3 市场需求与薪资水平从各大招聘网站可以看到,具备Linux基础、Shell/Python脚本能力、熟悉一种云平台(AWS/Aliyun/Tencent Cloud)、掌握容器化和编排技术(Docker/K8s)、有监控和自动化经验的运维/SRE工程师,市场需求旺盛,且薪资普遍高于许多纯开发岗位。因为他们是业务连续性的最后一道防线,价值直接体现在系统的稳定性和可用性上。

因此,学习Linux运维/SRE,是一条投入产出比高、技术生命周期长、且能不断接触前沿技术的职业路径。

2. 学习路线图:从零基础到SRE的六个阶段

下面这张学习路线图,为你规划了从入门到精通的完整旅程。你可以根据自身情况调整学习节奏,但建议按顺序进行,打好基础是关键。

阶段一:Linux系统基础 (1-2个月) ├── 核心:操作系统概念、Linux发行版选择、虚拟机/云服务器使用 ├── 技能:文件系统、用户权限、进程管理、软件包管理(yum/apt) └── 目标:能在命令行中熟练完成日常文件操作和系统基本管理 阶段二:网络与服务管理 (1个月) ├── 核心:TCP/IP协议、防火墙(iptables/firewalld)、SSH ├── 技能:Web服务器(Nginx/Apache)、数据库(MySQL)安装配置 └── 目标:能搭建并维护一个基础的LAMP/LNMP网站环境 阶段三:Shell脚本与自动化入门 (1个月) ├── 核心:Bash语法、条件判断、循环、函数、文本处理三剑客(grep, sed, awk) ├── 技能:编写自动化备份、日志分析、服务监控等实用脚本 └── 目标:能用脚本替代重复性手工操作,提升效率 阶段四:运维核心工具链 (2-3个月) ├── 配置管理:Ansible/SaltStack ├── 监控告警:Zabbix/Prometheus + Grafana ├── 持续集成/部署:Jenkins/GitLab CI ├── 日志管理:ELK Stack (Elasticsearch, Logstash, Kibana) └── 目标:构建企业级自动化运维体系雏形 阶段五:容器化与云原生 (2-3个月) ├── 容器基础:Docker核心概念、镜像制作、容器网络与存储 ├── 容器编排:Kubernetes核心概念、Pod/Deployment/Service、Helm ├── 云平台:至少掌握一家主流云服务商(如阿里云ECS、VPC、SLB)的基本操作 └── 目标:能在K8s上部署和管理微服务应用 阶段六:SRE进阶与专项深化 (持续学习) ├── 高可用与容灾:负载均衡、集群、异地多活 ├── 性能优化:Linux内核参数、JVM调优、数据库调优 ├── 安全加固:漏洞扫描、入侵检测、安全审计 ├── 可观测性:链路追踪(Jeager/SkyWalking)、指标深化 └── 目标:具备保障大规模分布式系统稳定性的架构和排障能力

3. 阶段一实战:Linux系统安装与基础命令

理论说再多不如动手。我们直接从第一阶段的核心——系统安装和基础命令开始。这里我们选择CentOS 7/8 Stream或Ubuntu 22.04 LTS作为学习系统,因为它们在企业中仍有广泛的应用和丰富的资料。

3.1 环境准备:使用虚拟机搭建实验环境

对于初学者,强烈建议在个人电脑上使用虚拟机软件(如VMware Workstation Player或VirtualBox)来安装Linux,这样可以随意折腾而不影响主机。

步骤1:下载系统镜像

  • CentOS: 访问阿里云镜像站下载CentOS 7或CentOS Stream 8的ISO文件。
  • Ubuntu: 访问Ubuntu官网下载22.04 LTS桌面版或服务器版ISO。

步骤2:在VMware中创建虚拟机

  1. 打开VMware,点击“创建新的虚拟机”。
  2. 选择“典型”配置,点击下一步。
  3. 选择“稍后安装操作系统”,点击下一步。
  4. 客户机操作系统选择“Linux”,版本根据你下载的镜像选择(如CentOS 7 64位)。
  5. 命名虚拟机并选择存储位置。
  6. 指定磁盘容量(建议20GB以上),选择“将虚拟磁盘拆分成多个文件”。
  7. 点击“完成”后,在虚拟机设置中,将下载的ISO文件指定为CD/DVD驱动器。
  8. 启动虚拟机,开始安装。

3.2 最小化安装与基础配置

在安装过程中,有几个关键点需要注意:

  • 软件选择:对于服务器学习,请选择“最小安装”或“Server with GUI”(如果你需要图形界面)。最小安装更纯粹,有助于熟悉命令行。
  • 网络配置:安装时记得打开以太网连接,并设置主机名(如linux-sre-lab)。
  • 分区:新手可以选择“自动分区”。想深入学习可以手动分区,常见方案:/boot(1G),swap(内存的1-2倍),/(剩余所有空间)。
  • root密码与用户创建:务必设置一个强壮的root密码,并创建一个普通用户(如opsuser),用于日常操作,避免直接使用root。

安装完成后,首先更新系统并安装常用工具:

# 对于CentOS/RHEL系列 sudo yum update -y sudo yum install -y vim wget net-tools tree lrzsz # 对于Ubuntu/Debian系列 sudo apt update && sudo apt upgrade -y sudo apt install -y vim wget net-tools tree lrzsz

3.3 必须掌握的20个核心Linux命令

以下命令是你未来每天都会打交道的伙伴,请务必理解并熟练使用。

# 1. 文件和目录操作 pwd # 打印当前工作目录 ls -la # 以列表形式显示所有文件(包括隐藏文件) cd /path/to/directory # 切换目录 mkdir -p /opt/app/logs # 递归创建目录 touch file.txt # 创建空文件或更新文件时间戳 cp -r source_dir/ dest_dir/ # 递归复制目录 mv old_name new_name # 移动或重命名文件 rm -rf directory_name/ # 【危险!】强制递归删除目录,使用前务必确认 # 2. 文件查看与编辑 cat file.txt # 查看文件全部内容 head -n 20 file.log # 查看文件前20行 tail -n 50 -f app.log # 查看文件末尾50行,并持续跟踪(-f)新内容 vim /etc/hosts # 使用Vim编辑器修改文件(需掌握基本操作:i插入,:wq保存退出) # 3. 系统信息与进程管理 uname -a # 查看系统内核信息 df -h # 查看磁盘使用情况(人类可读格式) free -h # 查看内存使用情况 top # 动态查看进程和系统资源占用(类似任务管理器) ps aux | grep nginx # 查看所有进程,并过滤出包含‘nginx’的进程 kill -9 1234 # 【强制】终止PID为1234的进程 systemctl status nginx # 查看nginx服务的状态 systemctl start nginx # 启动nginx服务 # 4. 网络与权限 ifconfig 或 ip addr # 查看网络接口信息(ifconfig可能需要安装net-tools) ping -c 4 baidu.com # 发送4个ICMP包测试网络连通性 chmod 755 script.sh # 修改文件权限为rwxr-xr-x chown opsuser:opsgroup file.txt # 修改文件所有者和所属组

为什么是这些命令?

  • ls -la:-l显示详情,-a显示隐藏文件(以.开头的配置文件)。
  • rm -rf:-r递归,-f强制,生产环境慎用,误删数据是运维大忌。
  • tail -f:实时查看日志,是排查线上问题的利器。
  • ps aux | grep:管道符|将前一个命令的输出作为后一个命令的输入,这是Linux组合命令的精髓。

4. 阶段二实战:搭建一个LNMP网站环境

掌握了基础命令,我们来完成一个经典任务:手动搭建一个LNMP(Linux, Nginx, MySQL, PHP)环境。这能让你理解服务之间的协作。

4.1 安装与配置Nginx

Nginx是一个高性能的Web服务器和反向代理服务器。

# CentOS 7/8 sudo yum install -y epel-release sudo yum install -y nginx sudo systemctl start nginx sudo systemctl enable nginx # 设置开机自启 # Ubuntu 22.04 sudo apt install -y nginx sudo systemctl start nginx sudo systemctl enable nginx

安装后,在浏览器访问你的服务器IP(如果本地虚拟机,可能是http://192.168.x.x),应该能看到Nginx欢迎页。Nginx的主配置文件在/etc/nginx/nginx.conf,网站配置文件通常在/etc/nginx/conf.d/或/etc/nginx/sites-available/。

4.2 安装与配置MySQL (MariaDB)

MySQL是流行的关系型数据库。在CentOS 8+和Ubuntu中,MariaDB常作为替代品,完全兼容。

# CentOS 7/8 sudo yum install -y mariadb-server mariadb sudo systemctl start mariadb sudo systemctl enable mariadb # Ubuntu 22.04 sudo apt install -y mariadb-server sudo systemctl start mariadb sudo systemctl enable mariadb

安全初始化MySQL: 安装后必须运行安全脚本,设置root密码、移除匿名用户、禁止远程root登录等。

sudo mysql_secure_installation

按照提示操作即可。之后,你可以登录MySQL创建数据库和用户。

mysql -u root -p # 输入你刚设置的密码 MariaDB [(none)]> CREATE DATABASE webapp DEFAULT CHARACTER SET utf8mb4; MariaDB [(none)]> CREATE USER 'webuser'@'localhost' IDENTIFIED BY 'YourStrongPassword123!'; MariaDB [(none)]> GRANT ALL PRIVILEGES ON webapp.* TO 'webuser'@'localhost'; MariaDB [(none)]> FLUSH PRIVILEGES; MariaDB [(none)]> EXIT;

4.3 安装PHP并配置Nginx支持

安装PHP及其常用扩展。

# CentOS 7 (需要安装Remi仓库) sudo yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm sudo yum install -y yum-utils sudo yum-config-manager --enable remi-php74 # 启用PHP 7.4仓库,可按需选择版本 sudo yum install -y php php-fpm php-mysqlnd php-gd php-mbstring # Ubuntu 22.04 sudo apt install -y php-fpm php-mysql php-cli php-gd php-mbstring

配置Nginx处理PHP请求: 编辑Nginx的网站配置文件(例如/etc/nginx/conf.d/default.conf或新建一个),关键是要将PHP请求转发给PHP-FPM进程处理。

server { listen 80; server_name localhost; # 或你的域名 root /usr/share/nginx/html; index index.php index.html index.htm; location / { try_files $uri $uri/ =404; } # 关键配置:将所有.php文件的请求传递给PHP-FPM处理 location ~ \.php$ { fastcgi_pass unix:/run/php-fpm/www.sock; # CentOS 7/8路径 # 对于Ubuntu,可能是 unix:/var/run/php/php7.4-fpm.sock fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }

修改配置后,检查语法并重载Nginx。

sudo nginx -t # 测试配置文件语法 sudo systemctl reload nginx # 平滑重载配置 sudo systemctl restart php-fpm # 重启PHP-FPM服务

4.4 测试LNMP环境

在Web根目录(如/usr/share/nginx/html)创建一个PHP信息文件。

sudo vim /usr/share/nginx/html/info.php

写入以下内容:

<?php phpinfo(); ?>

保存后,在浏览器访问http://你的服务器IP/info.php。如果看到详细的PHP配置信息页面,恭喜你,LNMP环境搭建成功!

5. 阶段三核心:Shell脚本自动化实战

手动操作容易出错且效率低下。Shell脚本是运维自动化的第一步。我们来写几个实用的脚本。

5.1 实战脚本一:自动备份MySQL数据库

这是一个生产环境中非常实用的脚本,定期备份数据库到指定目录,并保留最近7天的备份。

#!/bin/bash # 文件名:mysql_backup.sh # 功能:自动备份MySQL数据库,并删除7天前的旧备份 # 定义变量 DB_USER="webuser" DB_PASSWORD="YourStrongPassword123!" DB_NAME="webapp" BACKUP_DIR="/opt/backup/mysql" DATE=$(date +%Y%m%d_%H%M%S) LOG_FILE="/var/log/mysql_backup.log" # 创建备份目录(如果不存在) mkdir -p $BACKUP_DIR # 执行备份 echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始备份数据库: $DB_NAME" >> $LOG_FILE mysqldump -u$DB_USER -p$DB_PASSWORD --single-transaction --routines --triggers $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz # 检查备份是否成功 if [ $? -eq 0 ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] 数据库备份成功: $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz" >> $LOG_FILE else echo "[$(date '+%Y-%m-%d %H:%M:%S')] 数据库备份失败!" >> $LOG_FILE exit 1 fi # 删除7天前的备份文件 find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete >> $LOG_FILE 2>&1 echo "[$(date '+%Y-%m-%d %H:%M:%S')] 已清理7天前的旧备份" >> $LOG_FILE

脚本解析与最佳实践:

  1. #!/bin/bash:指定脚本解释器。
  2. 变量定义:将数据库连接信息、路径等定义为变量,便于修改和维护。
  3. --single-transaction:对于InnoDB表,此参数可以在不锁表的情况下进行一致性备份,对线上业务影响小。
  4. 日志记录:使用>>追加到日志文件,便于后续排查问题。
  5. 错误处理:通过$?判断上一条命令(mysqldump)是否执行成功,失败则退出脚本。
  6. 自动清理:使用find命令的-mtime +7参数查找并删除7天前的文件,防止磁盘被撑满。

如何使用:

  1. 将脚本保存为mysql_backup.sh。
  2. 赋予执行权限:chmod +x mysql_backup.sh。
  3. 手动测试:./mysql_backup.sh。
  4. 配置定时任务(Cron)实现自动化:
    # 编辑当前用户的crontab crontab -e # 添加一行,表示每天凌晨2点执行备份 0 2 * * * /path/to/mysql_backup.sh

5.2 实战脚本二:服务器基础资源监控与告警

这个脚本定期检查CPU、内存、磁盘使用率,并在超过阈值时发送告警(这里模拟为记录到日志,实际可集成邮件或钉钉/企业微信机器人)。

#!/bin/bash # 文件名:server_monitor.sh # 功能:监控服务器基础资源,超阈值告警 LOG_FILE="/var/log/server_monitor.log" THRESHOLD_CPU=80 # CPU使用率阈值% THRESHOLD_MEM=85 # 内存使用率阈值% THRESHOLD_DISK=90 # 磁盘使用率阈值% # 获取当前时间 CURRENT_TIME=$(date '+%Y-%m-%d %H:%M:%S') # 1. 检查CPU使用率 (取1分钟负载平均值,并转换为整数) CPU_LOAD=$(uptime | awk -F'load average:' '{print $2}' | cut -d, -f1 | awk '{print $1*100}') CPU_LOAD_INT=${CPU_LOAD%.*} if [ $CPU_LOAD_INT -gt $THRESHOLD_CPU ]; then echo "[$CURRENT_TIME] WARNING: CPU load is high: ${CPU_LOAD_INT}%" >> $LOG_FILE fi # 2. 检查内存使用率 MEM_TOTAL=$(free | grep Mem | awk '{print $2}') MEM_USED=$(free | grep Mem | awk '{print $3}') MEM_USAGE_PERCENT=$(( MEM_USED * 100 / MEM_TOTAL )) if [ $MEM_USAGE_PERCENT -gt $THRESHOLD_MEM ]; then echo "[$CURRENT_TIME] WARNING: Memory usage is high: ${MEM_USAGE_PERCENT}%" >> $LOG_FILE fi # 3. 检查根分区磁盘使用率 DISK_USAGE=$(df -h / | tail -1 | awk '{print $5}' | sed 's/%//') if [ $DISK_USAGE -gt $THRESHOLD_DISK ]; then echo "[$CURRENT_TIME] WARNING: Disk usage is high: ${DISK_USAGE}%" >> $LOG_FILE fi # 如果所有检查都正常,记录一条健康信息(可选) # echo "[$CURRENT_TIME] INFO: All system resources are normal." >> $LOG_FILE

脚本解析:

  1. 文本处理工具:大量使用了awk,cut,sed,这是Shell脚本处理文本输出的核心能力。
  2. 数学计算:在Shell中进行整数计算可以使用$(( expression ))。
  3. 阈值判断:通过简单的if语句进行比较,触发告警。
  4. 扩展思路:可以将告警信息替换为调用发送邮件的命令(如mail或sendmail)或调用Webhook API通知到即时通讯工具。

6. 阶段四入门:使用Ansible实现自动化配置管理

当服务器数量增多时,手动登录每台机器执行脚本变得不现实。Ansible作为一种无代理的自动化工具,通过SSH管理节点,是运维自动化的利器。

6.1 Ansible基础与安装

控制节点(你的电脑或跳板机)安装Ansible:

# CentOS sudo yum install -y epel-release sudo yum install -y ansible # Ubuntu sudo apt update sudo apt install -y ansible # 验证安装 ansible --version

准备被管理节点清单: 创建一个名为inventory.ini的文件,定义你要管理的服务器。

[web_servers] web1 ansible_host=192.168.1.101 ansible_user=opsuser web2 ansible_host=192.168.1.102 ansible_user=opsuser [db_servers] db1 ansible_host=192.168.1.201 ansible_user=opsuser [all:vars] ansible_ssh_private_key_file=/home/yourname/.ssh/id_rsa # 如果使用密码,则设置 ansible_ssh_pass=yourpassword (不安全,建议用密钥)

配置SSH密钥免密登录(这是Ansible工作的前提): 在控制节点生成密钥对,并将公钥分发到所有被管理节点。

ssh-keygen -t rsa -b 4096 # 一路回车 ssh-copy-id opsuser@192.168.1.101 ssh-copy-id opsuser@192.168.1.102 ssh-copy-id opsuser@192.168.1.201

6.2 编写第一个Playbook:批量安装Nginx

Playbook使用YAML格式,描述了要在目标主机上执行的一系列任务。

创建一个文件install_nginx.yml:

--- - name: 在Web服务器组安装并启动Nginx hosts: web_servers # 指定在inventory中定义的`web_servers`组执行 become: yes # 使用sudo权限 tasks: # 任务列表 - name: 安装Nginx (CentOS) yum: name: nginx state: present when: ansible_os_family == "RedHat" # 条件判断,如果是RedHat系(CentOS/RHEL)则执行 - name: 安装Nginx (Ubuntu) apt: name: nginx state: present update_cache: yes # 相当于先执行 apt update when: ansible_os_family == "Debian" # 如果是Debian系(Ubuntu)则执行 - name: 启动Nginx服务并设置开机自启 systemd: name: nginx state: started enabled: yes notify: # 如果此任务状态为changed,则触发handlers中的动作 - restart nginx - name: 确保防火墙放行80端口 (firewalld) firewalld: port: 80/tcp permanent: yes state: enabled when: ansible_os_family == "RedHat" - name: 确保防火墙放行80端口 (ufw) ufw: rule: allow port: '80' proto: tcp when: ansible_os_family == "Debian" handlers: # 处理器,由notify触发,通常用于服务重启 - name: restart nginx systemd: name: nginx state: restarted

执行Playbook:

ansible-playbook -i inventory.ini install_nginx.yml

执行后,Ansible会依次连接web1和web2,根据系统类型安装Nginx、启动服务、配置防火墙。所有操作自动化完成,无需手动登录每台服务器。

7. 阶段五核心:使用Docker容器化一个应用

容器化是现代化运维的基石。Docker让你可以轻松地打包、分发和运行应用及其依赖。

7.1 Docker安装与基本命令

安装Docker:

# CentOS sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io sudo systemctl start docker sudo systemctl enable docker # Ubuntu sudo apt update sudo apt install -y docker.io sudo systemctl start docker sudo systemctl enable docker # 验证安装 sudo docker --version sudo docker run hello-world # 运行测试镜像

常用Docker命令:

docker images # 列出本地镜像 docker ps -a # 列出所有容器(包括已停止的) docker pull nginx:latest # 拉取Nginx最新镜像 docker run -d -p 80:80 --name my-nginx nginx # 后台运行一个Nginx容器,映射主机80端口 docker exec -it my-nginx bash # 进入正在运行的容器内部 docker stop my-nginx # 停止容器 docker rm my-nginx # 删除容器 docker rmi nginx:latest # 删除镜像

7.2 编写Dockerfile构建自定义镜像

假设我们有一个简单的Python Flask应用,我们来为它创建一个Docker镜像。

项目结构:

my_flask_app/ ├── app.py ├── requirements.txt └── Dockerfile

1. app.py (一个简单的Flask应用):

from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return "Hello, SRE! This app is running inside Docker.\n" if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)

2. requirements.txt:

Flask==2.3.2

3. Dockerfile (核心):

# 使用官方Python轻量级镜像作为基础 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 将依赖文件复制到工作目录 COPY requirements.txt . # 安装Python依赖,使用清华镜像加速(国内环境) RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 将应用代码复制到工作目录 COPY . . # 声明容器运行时监听的端口 EXPOSE 5000 # 定义容器启动时执行的命令 CMD ["python", "app.py"]

构建并运行镜像:

# 在my_flask_app目录下执行 docker build -t my-flask-app:latest . # 运行容器,将主机的8080端口映射到容器的5000端口 docker run -d -p 8080:5000 --name flask-app my-flask-app:latest

现在,访问http://你的服务器IP:8080就能看到 Flask 应用返回的信息了。这个镜像包含了应用运行所需的所有环境,可以在任何安装了Docker的机器上以完全相同的方式运行。

8. 阶段六基石:使用Prometheus + Grafana搭建监控系统

可观测性是SRE的四大黄金信号(延迟、流量、错误、饱和度)的基础。Prometheus负责采集和存储指标,Grafana负责可视化。

8.1 使用Docker Compose一键部署

创建docker-compose.yml文件,定义Prometheus、Grafana和Node Exporter(用于采集主机指标)服务。

version: '3.8' services: prometheus: image: prom/prometheus:latest container_name: prometheus restart: unless-stopped volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' - '--storage.tsdb.retention.time=200h' - '--web.enable-lifecycle' ports: - "9090:9090" networks: - monitoring grafana: image: grafana/grafana:latest container_name: grafana restart: unless-stopped volumes: - grafana_data:/var/lib/grafana environment: - GF_SECURITY_ADMIN_PASSWORD=admin123 # 设置Grafana管理员密码 ports: - "3000:3000" networks: - monitoring depends_on: - prometheus node-exporter: image: prom/node-exporter:latest container_name: node-exporter restart: unless-stopped volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro command: - '--path.procfs=/host/proc' - '--path.sysfs=/host/sys' - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)' ports: - "9100:9100" networks: - monitoring networks: monitoring: driver: bridge volumes: prometheus_data: grafana_data:

创建Prometheus配置文件prometheus.yml:

global: scrape_interval: 15s # 每15秒抓取一次指标 evaluation_interval: 15s # 每15秒评估一次规则 scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'node-exporter' static_configs: - targets: ['node-exporter:9100'] # 注意这里使用Docker服务名

8.2 启动与配置监控

  1. 启动服务:在包含docker-compose.yml的目录下运行docker-compose up -d。
  2. 访问服务:
    • Prometheus:http://服务器IP:9090
    • Grafana:http://服务器IP:3000(用户名admin,密码admin123)
    • Node Exporter指标:http://服务器IP:9100/metrics
  3. 配置Grafana数据源:
    • 登录Grafana,点击左侧齿轮图标 ->Data Sources->Add data source。
    • 选择Prometheus。
    • URL填写http://prometheus:9090(注意:在Docker网络内使用服务名)。
    • 点击Save & Test,显示Data source is working即成功。
  4. 导入Dashboard:
    • 点击左侧+号 ->Import。
    • 在Import via grafana.com输入框中输入8919(这是一个流行的Node Exporter主机监控面板ID)。
    • 选择刚才添加的Prometheus数据源,点击Import。

现在,你就能在Grafana上看到漂亮的服务器CPU、内存、磁盘、网络等指标的监控图表了。这套监控系统是你在生产环境保障服务稳定性的眼睛。

9. 常见问题与故障排查思路(FAQ)

在学习和实践过程中,你一定会遇到各种问题。这里总结一些高频问题及其排查思路。

问题现象可能原因排查步骤与解决方案
SSH连接服务器超时/被拒绝1. 网络不通(IP错误、防火墙)
2. SSH服务未运行
3. 端口被修改(非22)
4. 密钥认证失败
1.ping <服务器IP>检查网络。
2.systemctl status sshd检查服务状态。
3. 确认连接命令ssh user@ip -p <端口>。
4. 检查/var/log/secure日志。
yum或apt安装软件失败1. 网络问题,无法连接镜像源
2. 软件包名称错误
3. 仓库配置错误或未启用
1.ping 8.8.8.8测试外网,检查DNS。
2. 使用yum search <关键词>或apt search <关键词>查找正确包名。
3. 检查/etc/yum.repos.d/或/etc/apt/sources.list文件。
服务启动失败(如nginx)1. 配置文件语法错误
2. 端口被占用
3. 依赖的模块或路径不存在
1.nginx -t或systemctl status nginx查看具体错误日志。
2.netstat -tlnp | grep :80查看80端口占用情况。
3. 根据错误日志提示,检查相关路径或模块。
Docker容器无法访问外部网络1. Docker守护进程未运行
2. 宿主机防火墙规则阻止
3. Docker网络配置问题
1.systemctl status docker。
2. 检查防火墙(firewalld/ufw/iptables)是否放行Docker网桥流量。
3.docker network ls和docker network inspect bridge检查网络。
磁盘空间不足(No space left on device)1. 日志文件过大
2. 备份文件未清理
3. Docker镜像/容器占用过多
1.df -h定位哪个分区满了。
2.du -sh /var/log/*查看大日志目录。
3.docker system df查看Docker磁盘使用,用docker system prune -a清理(谨慎)。
Shell脚本执行权限不足脚本没有执行权限chmod +x script.sh赋予执行权限。
Ansible执行失败 “Permission Denied”SSH密钥认证失败或sudo需要密码1. 确认ansible_user有免密sudo权限(visudo配置)。
2. 测试手动SSH和sudo是否正常。
3. 在Playbook中使用become: yes和become_method: sudo。

通用排障心法:

  1. 看日志:系统日志(/var/log/messages,journalctl -xe)、服务日志、应用日志永远是第一现场。
  2. 查状态:systemctl status <服务名>,docker ps/logs,kubectl get pods/describe pod。
  3. 简化复现:尝试在最小环境或新环境中复现问题,排除其他因素干扰。
  4. 搜索引擎是你的朋友:将错误信息的关键词用英文在Google或技术社区搜索,大概率能找到解决方案。

10. 最佳实践与学习建议

最后,分享一些能让你走得更远、更稳的实践经验和学习建议。

1. 一切皆代码 (Infrastructure as Code, IaC)

  • 配置管理:像对待应用代码一样对待服务器配置。使用Ansible Playbook、Terraform模板来定义你的基础设施。版本化管理(Git),方便回滚和协作。
  • 不可变基础设施:服务器一旦部署,就不应再手动修改。任何变更都应通过更新代码、重新部署镜像/容器来实现。这能极大提升环境的一致性和可靠性。

2. 安全第一

  • 最小权限原则:应用程序和用户只应拥有完成其任务所必需的最小权限。避免滥用root。
  • 定期更新:及时为操作系统、中间件、应用打上安全补丁。
  • 网络隔离:使用安全组、VPC、网络策略等工具,对服务进行网络层面的隔离。
  • 密钥管理:切勿将密码、API密钥硬编码在脚本或代码中。使用Vault、KMS或云厂商的密钥管理服务。

3. 可观测性建设

  • 日志集中化:使用ELK或Loki+Graylog集中管理日志,方便检索和分析。
  • 指标监控:除了基础资源,更要监控应用业务指标(如QPS、成功率、响应时间)。
  • 链路追踪:在微服务架构中,链路追踪(如Jaeger)是定位跨服务调用问题的神器。
  • 告警合理化:告警不是越多越好。设置有意义的阈值,避免告警疲劳。告警信息应包含:发生了什么、在哪儿发生的、可能的原因、相关的链接或文档。

4. 持续学习与社区参与

  • 跟进技术趋势:关注CNCF(云原生计算基金会)的项目,如Kubernetes、Prometheus、Envoy等。
  • 动手实验:在个人服务器或云厂商的免费额度上搭建实验环境。理论看十遍不如动手做一遍。
  • 参与开源:阅读优秀开源项目(如Nginx、Ansible)的文档和源码,甚至尝试提交Issue或PR。
  • 总结与分享:将你解决的问题、学到的知识写成博客或笔记。教是最好的学。

给转行者的最后建议: 这条路没有捷径。从每天坚持敲1小时命令开始,从成功搭建第一个LNMP环境获得正反馈,到写出第一个自动化脚本解放双手,再到用容器和编排技术管理复杂应用。每一步的成长都清晰可见。市场需要的不是只会背命令的人,而是能用技术解决实际问题、保障业务稳定运行的工程师。保持好奇,保持耐心,动手去做,你一定能行。