最近在技术社区看到不少朋友在讨论运维和SRE的职业发展,特别是随着云计算、容器化和自动化技术的普及,传统的运维岗位正在向更注重可靠性和工程化的SRE(站点可靠性工程)方向演进。很多想转行或者刚入门的朋友面对海量的学习资料感到无从下手,不知道从何学起,也不知道哪些技能才是当前企业真正需要的。
本文旨在为你梳理一条清晰的Linux运维与SRE学习路径,内容完全基于当前(2026年)主流技术栈和工作环境需求,从零基础的系统安装、命令使用,到Shell脚本、自动化运维、容器化、监控告警等核心技能,最后延伸到SRE的工程实践。无论你是完全零基础的转行者,还是有一定基础想系统提升的运维工程师,都能在这份指南中找到方向。我们将以实战操作为主,辅以必要的概念解释,确保你能看懂、能动手、能应用。
1. 为什么选择Linux运维与SRE?
在深入技术细节之前,我们先要理解这个领域为什么值得投入。简单来说,Linux是互联网基础设施的基石,而SRE是保障这套基石稳定、高效运行的工程方法论。
1.1 Linux:无处不在的基石
无论是你正在浏览的网站、使用的手机App后端,还是云计算平台(如阿里云、腾讯云)、大数据系统(如Hadoop),其服务器绝大多数都运行在Linux操作系统之上。它的开源、稳定、高效和安全特性,使其成为服务器领域的绝对主流。学习Linux运维,就是学习如何驾驭这套支撑数字世界的核心系统。
1.2 从传统运维到SRE的演进
传统的运维工作可能更偏向于“救火队员”:服务器宕机了去重启,磁盘满了去清理,应用出问题了去查日志。这种模式被动、低效,且高度依赖个人经验。
SRE(Site Reliability Engineering)由Google提出,它是一套将软件工程的思想应用于运维领域的实践。SRE工程师的核心目标是通过软件和自动化来系统性解决运维问题,构建高可用的服务。他们不仅负责“保持系统在线”,更致力于设计能“自己保持在线”的系统。这意味着你需要掌握编程、自动化、容量规划、故障预案等一系列工程化技能。
1.3 当前(2026年)的市场需求与技能栈
根据近年的技术趋势和招聘要求,一个合格的Linux运维/SRE工程师的知识体系通常包括以下几个层次:
- Linux系统基础:系统安装、文件管理、用户权限、进程管理、网络配置。
- 核心服务与中间件:Web服务器(Nginx/Apache)、数据库(MySQL/Redis)、负载均衡、缓存。
- 脚本与自动化:Shell脚本、Python/Go编程,用于自动化日常任务。
- 配置管理与CI/CD:Ansible/SaltStack、Git、Jenkins/GitLab CI,实现基础设施即代码和持续交付。
- 容器化与编排:Docker容器技术、Kubernetes编排系统,这是云原生时代的标配。
- 监控与可观测性:Prometheus监控系统、Grafana数据可视化、ELK日志栈,确保对系统状态了如指掌。
- 云计算与SRE实践:熟悉至少一家主流云平台(AWS/Aliyun/Tencent Cloud),理解SLA、错误预算、容量规划等SRE核心概念。
接下来,我们将沿着这条路径,从零开始,一步步构建你的知识体系。
2. 学习环境准备:迈出第一步
工欲善其事,必先利其器。对于零基础学习者,最友好、最安全的方式是在个人电脑上通过虚拟机搭建学习环境。
2.1 选择Linux发行版
对于新手,推荐使用CentOS Stream或Ubuntu Server LTS版本。
- CentOS Stream:作为Red Hat Enterprise Linux(RHEL)的上游版本,它非常稳定,且拥有庞大的企业应用生态和资料库,是学习企业级运维的绝佳选择。
- Ubuntu Server LTS:拥有最活跃的社区,软件包更新及时,安装配置相对简单,文档丰富。
注意:传统的CentOS 8已停止维护,CentOS 7也即将结束生命周期,因此CentOS Stream是更面向未来的选择。本文示例将主要使用CentOS Stream。
2.2 使用虚拟机安装Linux
我们使用VMware Workstation Player(个人免费)或VirtualBox(完全免费)来创建虚拟机。
步骤1:下载系统镜像访问CentOS官网或国内镜像站(如阿里云镜像、清华镜像)下载CentOS Stream的最新ISO镜像文件。
步骤2:创建虚拟机
- 打开VMware,点击“创建新的虚拟机”。
- 选择“典型”配置,点击下一步。
- 在“安装程序光盘映像文件”处,选择你下载的CentOS Stream ISO文件。
- 设置虚拟机的名称和存储位置。
- 指定磁盘容量,建议不少于20GB,选择“将虚拟磁盘拆分成多个文件”。
- 在“自定义硬件”中,建议分配至少2GB内存和2个CPU核心,网络连接模式选择“NAT模式”(方便虚拟机上网)。
- 完成创建。
步骤3:安装操作系统
- 启动虚拟机,会进入安装界面。
- 选择“Install CentOS Stream”。
- 在“安装信息摘要”界面,你需要配置以下几项:
- 语言:选择中文或英文。
- 软件选择:对于服务器,最小化安装(Minimal Install)即可,它只包含最基本的系统,非常适合学习。如果想带图形界面,可以选择“Server with GUI”。
- 安装目的地:点击进入,在“存储配置”下选择“自动配置分区”,然后点击“完成”。
- 网络和主机名:点击进入,打开右上角的网络连接开关,主机名可以设置为
learn-linux.local,点击“应用”。 - 根密码和创建用户:务必为root用户设置一个强密码,同时建议创建一个普通用户(如
opsuser)并为其设置密码和管理员权限。
- 点击“开始安装”,等待安装完成,重启系统。
步骤4:首次登录与网络测试重启后,使用你创建的普通用户或root用户登录。 打开终端,测试网络是否通畅:
ping -c 4 www.baidu.com如果能看到数据包回复,说明网络配置成功。
2.3 必备工具与连接方式
- 终端工具:在Windows上,强烈推荐使用MobaXterm或Xshell。它们支持SSH、SFTP、多标签,功能强大。macOS和Linux用户可直接使用系统自带的终端。
- SSH连接:这是管理远程服务器的标准方式。确保虚拟机开启SSH服务:
使用终端工具,通过虚拟机的IP地址(使用# 检查SSH服务状态 systemctl status sshd # 如果未运行,则启动并设置开机自启 sudo systemctl start sshd sudo systemctl enable sshdip addr命令查看)和用户名密码进行连接。
至此,你的Linux学习实验室已经搭建完毕。
3. Linux系统核心操作入门
掌握Linux,首先从文件和命令开始。这是所有运维工作的基础。
3.1 文件系统与目录结构
Linux一切皆文件。理解几个核心目录:
/:根目录,所有目录的起点。/home:普通用户的家目录。/root:root用户的家目录。/etc:配置文件存放目录。/var:存放经常变化的文件,如日志(/var/log)、数据库文件。/usr:用户安装的应用程序和文件。/opt:第三方可选软件安装目录。/tmp:临时文件目录。
3.2 必须掌握的常用命令
以下命令请务必在虚拟机中亲自敲一遍,理解其输出。
1. 文件与目录操作
# 查看当前所在目录 pwd # 列出目录内容(-l 详细信息, -a 包含隐藏文件, -h 人类可读大小) ls -lah # 切换目录 cd /home cd .. # 返回上级目录 cd ~ # 返回当前用户家目录 # 创建目录 mkdir mydir mkdir -p project/{src,log,config} # 递归创建多级目录 # 创建文件 touch file.txt # 复制文件或目录 cp file.txt file_backup.txt cp -r mydir mydir_backup # 递归复制目录 # 移动或重命名 mv file.txt /tmp/ mv oldname.txt newname.txt # 删除(谨慎使用!) rm file.txt rm -rf mydir # 强制递归删除目录,非常危险! # 查看文件内容 cat file.txt # 显示全部 head -n 10 file.txt # 显示前10行 tail -n 20 file.txt # 显示后20行 tail -f /var/log/messages # 实时追踪日志文件 less file.txt # 分页查看,按q退出2. 系统信息与进程管理
# 查看系统信息 uname -a # 内核信息 cat /etc/redhat-release # 查看CentOS版本 free -h # 查看内存使用 df -h # 查看磁盘空间 top # 动态查看进程和资源占用(类似任务管理器) # 进程管理 ps aux | grep nginx # 查看nginx相关进程 kill -9 <PID> # 强制终止进程(PID通过ps命令获取) pkill nginx # 按进程名终止 # 网络相关 ip addr # 查看IP地址(替代老旧的ifconfig) ping -c 4 8.8.8.8 netstat -tlnp # 查看监听端口(需要安装net-tools: `yum install net-tools`) ss -tlnp # 更现代的查看监听端口命令 curl http://www.example.com # 发送HTTP请求 wget http://example.com/file.tar.gz # 下载文件3. 权限与用户管理Linux权限系统是安全基石。
# 查看文件权限 ls -l file.txt # 输出类似:-rw-r--r-- 1 root root 1234 Jan 1 10:00 file.txt # 第一部分:-(文件类型)rw-(所有者权限)r--(所属组权限)r--(其他人权限) # 修改权限(数字法) chmod 755 script.sh # 所有者rwx,组和其他人r-x # 修改权限(符号法) chmod u+x script.sh # 给所有者增加执行权限 # 修改文件所有者和所属组 chown opsuser:opsgroup file.txt # 用户管理 sudo useradd newuser # 创建用户(需要root权限或sudo) sudo passwd newuser # 为用户设置密码 sudo usermod -aG wheel newuser # 将用户加入wheel组(通常有sudo权限)3.3 文本处理三剑客:grep, sed, awk
这是Linux文本处理的灵魂,必须掌握。
# 1. grep:文本搜索 grep "error" /var/log/messages # 在文件中搜索包含“error”的行 grep -r "TODO" /home/project/ # 递归搜索目录 grep -v "^#" /etc/ssh/sshd_config # 显示非注释行(排除以#开头的行) grep -E "error|warning" log.txt # 使用扩展正则,匹配error或warning # 2. sed:流编辑器,用于文本替换、删除、插入 sed 's/old/new/g' file.txt # 将文件中所有的old替换为new sed -i.bak 's/old/new/g' file.txt # 直接修改原文件,并备份原文件为file.txt.bak sed -n '10,20p' file.txt # 只打印文件的第10到20行 # 3. awk:强大的文本分析工具,按列处理 awk '{print $1, $3}' data.txt # 打印文件的第一列和第三列 awk -F':' '{print $1, $6}' /etc/passwd # 以冒号分隔,打印用户名和家目录 awk '$3 > 100 {print $0}' data.txt # 打印第三列大于100的所有行 # 统计nginx访问日志中每个IP的访问次数 awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -103.4 软件包管理:yum/dnf
CentOS/RHEL系列使用yum或它的新一代工具dnf来管理软件包。
# 更新软件包缓存 sudo dnf update # 搜索软件包 sudo dnf search nginx # 安装软件 sudo dnf install nginx vim wget curl # 移除软件 sudo dnf remove package_name # 查看已安装软件 dnf list installed | grep nginx4. Shell脚本编程:自动化的起点
只会手动敲命令是远远不够的。Shell脚本能将一系列命令固化下来,实现自动化,是运维工程师的核心能力。
4.1 第一个Shell脚本
创建一个名为hello.sh的文件:
#!/bin/bash # 这是一个简单的Shell脚本 echo "Hello, Linux SRE!" echo "当前时间是:$(date)" echo "当前用户是:$(whoami)" echo "当前目录是:$(pwd)"给脚本添加执行权限并运行:
chmod +x hello.sh ./hello.sh4.2 脚本核心语法
变量
name="LinuxOps" echo $name # 只读变量 readonly PI=3.14 # 环境变量 echo $PATH export MY_VAR="some_value" # 设置为环境变量条件判断
#!/bin/bash score=85 if [ $score -ge 90 ]; then echo "优秀" elif [ $score -ge 60 ]; then echo "及格" else echo "不及格" fi # 文件判断 if [ -f "/etc/passwd" ]; then echo "文件存在" fi if [ -d "/tmp" ]; then echo "目录存在" fi循环
# for循环 for i in {1..5}; do echo "Number: $i" done for file in /home/*.log; do echo "处理文件: $file" done # while循环 count=1 while [ $count -le 5 ]; do echo "Count: $count" ((count++)) done函数
#!/bin/bash function say_hello() { local name=$1 # local定义局部变量 echo "Hello, $name!" } say_hello "World" say_hello "SRE"4.3 实战案例:自动备份脚本
一个实用的脚本,用于备份指定目录到远程服务器(需提前配置SSH免密登录)。
#!/bin/bash # backup_to_remote.sh # 功能:将本地目录压缩并scp到远程备份服务器 # 配置变量 BACKUP_SRC="/var/www/html" # 需要备份的源目录 BACKUP_DEST="/backup" # 本地临时备份目录 REMOTE_USER="backup" REMOTE_HOST="192.168.1.100" REMOTE_DIR="/data/backups" DATE=$(date +%Y%m%d_%H%M%S) BACKUP_FILE="web_backup_${DATE}.tar.gz" # 1. 检查源目录是否存在 if [ ! -d "$BACKUP_SRC" ]; then echo "错误:源目录 $BACKUP_SRC 不存在!" exit 1 fi # 2. 创建本地备份目录 mkdir -p $BACKUP_DEST # 3. 创建压缩包 echo "正在创建压缩包..." tar -czf ${BACKUP_DEST}/${BACKUP_FILE} -C $(dirname $BACKUP_SRC) $(basename $BACKUP_SRC) if [ $? -ne 0 ]; then echo "错误:压缩包创建失败!" exit 1 fi # 4. 传输到远程服务器 echo "正在传输到远程服务器..." scp ${BACKUP_DEST}/${BACKUP_FILE} ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/ if [ $? -eq 0 ]; then echo "备份成功!文件:${BACKUP_FILE}" # 可选:清理本地临时文件(保留最近3天的) find $BACKUP_DEST -name "web_backup_*.tar.gz" -mtime +3 -delete else echo "错误:文件传输失败!" exit 1 fi将这个脚本加入crontab,就可以实现定时自动备份:
# 编辑当前用户的crontab crontab -e # 添加一行,每天凌晨2点执行备份 0 2 * * * /path/to/backup_to_remote.sh >> /var/log/backup.log 2>&15. 核心服务部署与管理
一个完整的应用离不开Web服务器、数据库等核心服务。
5.1 Web服务器:Nginx
Nginx以其高性能、高并发和低内存占用成为主流选择。
安装与启动
sudo dnf install nginx -y sudo systemctl start nginx sudo systemctl enable nginx # 开机自启 sudo systemctl status nginx # 查看状态访问http://你的虚拟机IP,应该能看到Nginx欢迎页。
基础配置主配置文件位于/etc/nginx/nginx.conf。通常我们会在/etc/nginx/conf.d/目录下为每个站点创建独立的配置文件。 创建一个简单的静态站点配置/etc/nginx/conf.d/mysite.conf:
server { listen 80; server_name mysite.local; # 或你的IP root /var/www/mysite; index index.html index.htm; location / { try_files $uri $uri/ =404; } # 记录访问日志 access_log /var/log/nginx/mysite_access.log; error_log /var/log/nginx/mysite_error.log; }创建网站目录和测试页面:
sudo mkdir -p /var/www/mysite sudo chown -R nginx:nginx /var/www/mysite echo "<h1>Hello from Nginx!</h1>" | sudo tee /var/www/mysite/index.html检查配置并重载Nginx:
sudo nginx -t # 测试配置文件语法 sudo systemctl reload nginx # 平滑重载配置5.2 数据库:MySQL/MariaDB
MariaDB是MySQL的一个流行分支,完全兼容。
安装与安全初始化
sudo dnf install mariadb-server mariadb -y sudo systemctl start mariadb sudo systemctl enable mariadb # 运行安全初始化脚本,设置root密码、移除匿名用户、禁止远程root登录等 sudo mysql_secure_installation按照提示操作,建议设置强密码,并回答Y来移除测试数据库和匿名用户。
基础数据库操作
# 登录MySQL(使用刚才设置的root密码) mysql -u root -p -- 在MySQL命令行中执行 -- 创建一个新数据库 CREATE DATABASE myapp_db; -- 创建一个新用户并授权 CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'YourStrongPassword123!'; GRANT ALL PRIVILEGES ON myapp_db.* TO 'myapp_user'@'localhost'; FLUSH PRIVILEGES; -- 退出 EXIT;5.3 实战:搭建LAMP环境
LAMP(Linux, Apache, MySQL, PHP)是一个经典组合,虽然Apache份额被Nginx超越,但仍有大量应用。
一键安装脚本思路你可以编写一个Shell脚本来自动化安装:
#!/bin/bash # install_lamp.sh set -e # 遇到错误立即退出 echo "开始安装LAMP环境..." # 1. 安装Apache sudo dnf install httpd -y sudo systemctl start httpd sudo systemctl enable httpd # 2. 安装MariaDB sudo dnf install mariadb-server mariadb -y sudo systemctl start mariadb sudo systemctl enable mariadb # 3. 安装PHP及常用扩展 sudo dnf install php php-mysqlnd php-fpm php-gd php-mbstring php-xml -y sudo systemctl start php-fpm sudo systemctl enable php-fpm # 4. 配置Apache使用PHP-FPM # 编辑 /etc/httpd/conf.d/php.conf,确保有类似配置 # 通常包管理器会自动配置好 # 5. 测试 echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php sudo systemctl restart httpd echo "安装完成!请访问 http://你的服务器IP/info.php 查看PHP信息。" echo "注意:请立即运行 'sudo mysql_secure_installation' 来加固MariaDB。"重要安全提示:生产环境务必删除info.php这类暴露信息的文件,并按照mysql_secure_installation的指引加固数据库。
6. 运维自动化与配置管理
手动管理一台服务器尚可,管理成百上千台呢?自动化是必由之路。
6.1 使用Ansible实现自动化
Ansible是一个无代理的自动化工具,使用SSH进行通信,配置简单。
安装与控制节点配置在**你的本地机器或一台专门的“控制节点”**上安装Ansible:
# 在CentOS上 sudo dnf install epel-release -y sudo dnf install ansible -y # 在Ubuntu上 sudo apt update sudo apt install ansible -y配置主机清单编辑/etc/ansible/hosts文件,定义你要管理的服务器组:
[web_servers] 192.168.1.101 ansible_user=root 192.168.1.102 ansible_user=root [db_servers] 192.168.1.201 ansible_user=root [all:vars] ansible_ssh_private_key_file=/path/to/your/private_key.pem # 如果使用密码,需安装sshpass,并设置 ansible_ssh_pass编写第一个PlaybookPlaybook使用YAML格式,描述你想要在目标主机上执行的任务。 创建一个setup_web.yml文件:
--- - name: 初始化Web服务器 hosts: web_servers become: yes # 使用sudo权限 tasks: - name: 更新系统包缓存 dnf: update_cache: yes - name: 安装Nginx dnf: name: nginx state: present - name: 启动并启用Nginx服务 systemd: name: nginx state: started enabled: yes - name: 部署默认首页 copy: content: "<h1>Welcome to {{ ansible_hostname }}</h1>" dest: /usr/share/nginx/html/index.html owner: nginx group: nginx mode: '0644' - name: 开放80端口防火墙 firewalld: port: 80/tcp permanent: yes state: enabled notify: 重载防火墙 handlers: - name: 重载防火墙 systemd: name: firewalld state: reloaded运行这个Playbook:
ansible-playbook setup_web.ymlAnsible会连接到web_servers组的所有主机,并依次执行定义的任务。
6.2 版本控制:Git基础
所有脚本、配置、Playbook都应该用Git管理。
# 初始化仓库 mkdir my-ops-scripts cd my-ops-scripts git init # 配置用户信息 git config --global user.name "Your Name" git config --global user.email "you@example.com" # 将文件添加到暂存区并提交 git add backup_to_remote.sh install_lamp.sh git commit -m "添加备份和LAMP安装脚本" # 关联远程仓库(如GitHub, Gitee) git remote add origin https://github.com/yourname/my-ops-scripts.git git branch -M main git push -u origin main7. 容器化与Kubernetes入门
容器化技术彻底改变了应用交付和部署的方式,而Kubernetes是容器编排的事实标准。
7.1 Docker基础
Docker允许你将应用及其依赖打包成一个标准化的单元。
安装Docker
# CentOS sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y sudo systemctl start docker sudo systemctl enable docker sudo usermod -aG docker $USER # 将当前用户加入docker组,避免每次用sudo # 退出终端重新登录生效 # 验证安装 docker --version docker run hello-world使用Docker运行一个Nginx
# 拉取Nginx镜像 docker pull nginx:alpine # 运行一个Nginx容器,将宿主机的8080端口映射到容器的80端口 docker run -d --name my-nginx -p 8080:80 nginx:alpine # 查看运行中的容器 docker ps # 查看容器日志 docker logs my-nginx现在访问http://你的虚拟机IP:8080,就能看到Nginx欢迎页。
构建自定义镜像创建一个简单的Dockerfile:
# 使用官方Python轻量级镜像 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 复制当前目录下的文件到容器中 COPY . . # 安装依赖 RUN pip install --no-cache-dir -r requirements.txt # 声明容器运行时监听的端口 EXPOSE 5000 # 定义容器启动时执行的命令 CMD ["python", "app.py"]构建并运行:
docker build -t my-python-app . docker run -d -p 5000:5000 --name myapp my-python-app7.2 Kubernetes (K8s) 核心概念
Kubernetes用于管理成百上千的Docker容器,实现自动化部署、扩缩容和管理。
核心概念速览:
- Pod:K8s中最小的部署单元,包含一个或多个容器。
- Deployment:定义Pod的部署策略,如副本数、更新策略。
- Service:为一组Pod提供稳定的网络访问入口。
- ConfigMap & Secret:管理配置信息和敏感数据。
- Namespace:逻辑上隔离资源(如开发、测试、生产环境)。
使用Minikube快速体验K8sMinikube可以在本地轻松创建一个单节点的K8s集群用于学习。
# 安装Minikube(请参考官方文档获取最新安装命令) # 例如,在Linux上: curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube # 启动集群(需要提前安装好Docker) minikube start --driver=docker # 检查状态 minikube status kubectl get nodes # kubectl是K8s的命令行工具 # 部署一个示例应用 kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4 kubectl expose deployment hello-minikube --type=NodePort --port=8080 # 获取服务访问地址 minikube service hello-minikube --url访问输出的URL,你就能看到应用在K8s中运行起来了。
8. 监控与可观测性:让系统“透明”
不知道系统状态,运维就是盲人摸象。监控是SRE的“眼睛”。
8.1 使用Prometheus + Grafana
Prometheus负责采集和存储指标数据,Grafana负责炫酷的可视化。
使用Docker Compose快速部署创建docker-compose-monitor.yml文件:
version: '3' services: prometheus: image: prom/prometheus:latest container_name: prometheus volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' ports: - "9090:9090" restart: unless-stopped grafana: image: grafana/grafana:latest container_name: grafana volumes: - grafana_data:/var/lib/grafana environment: - GF_SECURITY_ADMIN_PASSWORD=admin123 # 设置初始密码,生产环境务必修改! ports: - "3000:3000" restart: unless-stopped depends_on: - prometheus volumes: prometheus_data: grafana_data:创建Prometheus配置文件prometheus.yml:
global: scrape_interval: 15s # 每15秒抓取一次数据 scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'node_exporter' # 监控Linux主机指标 static_configs: - targets: ['192.168.1.101:9100'] # 替换为你的服务器IP启动监控栈:
docker-compose -f docker-compose-monitor.yml up -d访问http://你的IP:3000登录Grafana(用户名admin,密码admin123),添加Prometheus数据源(地址填http://prometheus:9090),然后就可以导入或创建仪表盘了。
在目标服务器上部署Node ExporterNode Exporter用于暴露主机指标(CPU、内存、磁盘、网络等)。
# 在目标服务器上运行 docker run -d \ --name=node_exporter \ --restart=always \ -p 9100:9100 \ -v "/proc:/host/proc:ro" \ -v "/sys:/host/sys:ro" \ -v "/:/rootfs:ro" \ prom/node-exporter:latest \ --path.procfs=/host/proc \ --path.sysfs=/host/sys \ --collector.filesystem.mount-points-exclude="^/(sys|proc|dev|host|etc)($|/)"确保Prometheus配置中的targets指向了这台服务器的9100端口。
8.2 日志集中管理:ELK/EFK栈
当服务器数量增多时,登录每台机器查日志是灾难。ELK(Elasticsearch, Logstash, Kibana)或EFK(Elasticsearch, Fluentd, Kibana)是主流解决方案。
核心组件:
- Elasticsearch:分布式搜索和分析引擎,存储日志。
- Logstash/Fluentd:日志收集、过滤和转发管道。
- Kibana:日志分析和可视化界面。
由于部署相对复杂,建议初学者先了解概念,在生产环境中可以考虑使用云服务商提供的日志服务或更轻量的方案如Loki + Grafana。
9. 云计算与SRE工程实践
9.1 拥抱云计算
现代运维和SRE工作几乎离不开云。你需要熟悉至少一家主流云厂商(阿里云、腾讯云、AWS等)的核心服务:
- 计算:ECS/VM(虚拟机)、容器服务、Serverless。
- 网络:VPC(专有网络)、负载均衡SLB、NAT网关。
- 存储:云盘、对象存储OSS、文件存储NAS。
- 数据库:RDS(关系型数据库)、Redis、MongoDB。
- 监控与安全:云监控、日志服务、WAF、安全组。
尝试在云平台申请免费试用,创建一台ECS,用本文学到的知识去配置它,并尝试将应用迁移上去。
9.2 SRE核心思想
- 定义SLO/SLI:服务水平目标(SLO)和指标(SLI)。例如,定义“API接口99.9%的请求延迟低于200ms”作为一个SLO。
- 错误预算:SLO允许的不可用时间。例如,99.9%的可用性意味着每月有43.2分钟的“错误预算”。SRE利用错误预算来平衡新功能发布速度和系统稳定性。
- 消除琐事(Toil):通过自动化消除重复性、手工、战术性的操作,让工程师专注于有长期价值的工程性工作。
- 监控与告警:监控一切,但只对真正影响SLO的事情告警。避免告警疲劳。
- 事故响应与复盘:建立清晰的事故响应流程(如使用PagerDuty等工具),并在事后进行不追责的复盘(Blameless Postmortem),专注于从技术和管理流程上改进,防止问题再次发生。
10. 学习路线图与资源推荐
10.1 分阶段学习路线
- 第1-2个月(基础夯实):完成本文第2-5章内容。熟练使用Linux命令,能独立搭建LAMP/LNMP环境,编写简单的Shell脚本。
- 第3-4个月(自动化与容器):深入学习Ansible,能编写Playbook管理多台服务器。掌握Docker,能为自己的应用编写Dockerfile并运行。
- 第5-6个月(编排与监控):学习Kubernetes核心概念,能在Minikube或云上K8s服务上部署应用。搭建Prometheus+Grafana监控系统。
- 第7个月及以后(工程化与云):深入学习一门编程语言(Python或Go),用于编写更复杂的运维工具。系统学习SRE理论,并在云平台上进行实战。参与开源项目或自己搭建完整的个人项目环境。
10.2 常见问题与排查思路
| 问题现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 服务无法启动(如Nginx) | 1. 端口被占用 2. 配置文件语法错误 3. 权限不足 | 1.sudo systemctl status nginx查看错误日志2. sudo nginx -t测试配置文件3. sudo ss -tlnp | grep :80检查端口占用4. 查看 /var/log/nginx/error.log |
| 磁盘空间不足 | 1. 日志文件过大 2. 临时文件堆积 3. 业务数据增长 | 1.df -h查看磁盘使用率2. du -sh /* | sort -rh | head -10找出大目录3. 清理日志( logrotate)、docker无用镜像(docker system prune) |
| 服务器负载过高 | 1. 某个进程CPU/内存占用高 2. 磁盘IO瓶颈 3. 网络流量大 | 1.top或htop查看进程2. iostat -x 1查看磁盘IO3. iftop或nethogs查看网络流量4. 检查应用日志和监控指标 |
| SSH连接失败 | 1. 网络不通 2. SSH服务未运行 3. 防火墙阻止 4. 密钥/密码错误 | 1.ping <服务器IP>2. systemctl status sshd3. firewall-cmd --list-all(CentOS) 或ufw status(Ubuntu)4. 检查 /var/log/secure或/var/log/auth.log |
| Docker容器无法访问外网 | 1. 容器网络模式问题 2. 宿主机DNS配置问题 3. 防火墙规则 | 1.docker run --network=host测试2. docker exec <容器名> cat /etc/resolv.conf检查容器DNS3. 检查宿主机iptables规则 |
10.3 持续学习资源
- 官方文档:永远是第一手资料。Linux (kernel.org), Nginx, MySQL/MariaDB, Docker, Kubernetes, Ansible,Prometheus等。
- 在线课程与书籍:
- 书籍:《鸟哥的Linux私房菜》(基础)、《SRE:Google运维解密》、《Kubernetes权威指南》。
- 平台:各大在线教育平台(如极客时间、慕课网)有体系化的运维/SRE课程。
- 社区与博客:Reddit的r/sysadmin和r/devops,Hacker News,国内社区如V2EX的技术节点。关注一些优秀的技术博客。
- 动手实践:这是最重要的。在自己的虚拟机、云服务器上反复练习,尝试搭建一个个人博客、一个CI/CD流水线、一个微服务demo并部署到K8s。
Linux运维与SRE是一条需要持续学习和实践的路径,它没有终点,因为技术总是在演进。但只要你掌握了坚实的基础(Linux、网络、脚本),培养了自动化思维,并保持对新技术的好奇心,你就能在这个充满挑战和机遇的领域站稳脚跟,从“救火队员”成长为构建高可用系统的“工程师”。从现在开始,打开你的终端,敲下第一个命令吧。