这是一个从零到一的完整运维实践项目涵盖系统安装、服务部署、自动化脚本和监控体系。我将按照环境准备 → 系统安装 → 安全加固 → Nginx部署 → 自动化脚本 → 监控体系的顺序展开。一、环境准备与系统安装1.1 下载所需软件软件用途下载地址VMware Workstation Pro虚拟机软件VMware官网CentOS 7 ISO操作系统镜像阿里云镜像站选择DVD版本x86_64架构1.2 创建虚拟机在 VMware 中按以下步骤创建虚拟机新建虚拟机→ 选择自定义(高级)硬件兼容性→ 保持默认安装来源→ 选择稍后安装操作系统操作系统→ Linux → CentOS 7 64位命名→ 如centos-ops选择存储位置CPU配置→ 建议 2 核根据宿主机性能调整内存分配→ 至少 2GB推荐 4GB网络类型→ 选择NAT模式最方便访问外网磁盘类型→ SCSI磁盘容量→ 建议 50GB选择存储为单个文件挂载ISO→ 编辑虚拟机设置 → CD/DVD → 使用ISO映像文件选择下载的 CentOS 7 ISO1.3 安装 CentOS 7启动虚拟机选择Install CentOS 7语言选择 →中文→ 简体中文软件选择→ 选择带GUI的服务器或GNOME桌面新手友好也适合后续可视化操作安装位置→ 保持默认自动分区网络和主机名→打开以太网开关如 ens33主机名设为centos-ops.local点击开始安装安装过程中设置ROOT密码设置一个强密码创建用户创建普通用户如opuser勾选将此用户作为管理员安装完成后重启完成初始配置即可进入系统。二、网络配置静态IP3.2 Linux网络基础命令网络配置端口查看故障排查-CSDN博客三、系统安全加固防火墙与权限3.1 基础安全配置依次执行以下安全加固操作# 1. 确保普通用户有sudo权限已创建则跳过 sudo usermod -aG wheel opuser # 2. 设置SSH空闲超时10分钟无操作断开 sudo vi /etc/ssh/sshd_config # 添加或修改 # 每个600秒向客户端发送心跳请求询问对方是否还在线 ClientAliveInterval 600 # 最多发送两次心跳请求如果客户端一直没有响应SSH服务端就主动断开连接 ClientAliveCountMax 2 # 3. 设置密码有效期90天 sudo vi /etc/login.defs # 修改 # 密码使用最长天数 PASS_MAX_DAYS 90 # 两次修改密码之间间隔最短天数 PASS_MIN_DAYS 7 # 密码过期前多少天提醒用户 PASS_WARN_AGE 7 # 4. 限制密码重复使用记住5个历史密码 sudo vi /etc/pam.d/system-auth # 在 password sufficient pam_unix.so 后添加 password sufficient pam_unix.so remember5 # 5. SSH最大认证尝试次数最多4次 sudo vi /etc/ssh/sshd_config MaxAuthTries 4 # 6. 禁止空密码登录 sudo vi /etc/ssh/sshd_config PermitEmptyPasswords no # 7. 重启SSH服务生效 sudo systemctl restart sshd # 8. 启用rsyslog日志服务 sudo systemctl enable rsyslog sudo systemctl start rsyslog # 9. 设置关键文件权限 # 这里不含有密码等敏感数据-可以让所有人读防止篡改账户信息-不允许普通用户写 sudo chmod 644 /etc/passwd /etc/group # 含有密码hash-不允许普通用户读 sudo chmod 0400 /etc/shadow /etc/gshadow3.2 防火墙配置firewalldCentOS 7 默认使用 firewalld# 查看防火墙状态 sudo systemctl status firewalld # 启动并设置开机自启 sudo systemctl start firewalld sudo systemctl enable firewalld # 查看默认区域 sudo firewall-cmd --get-default-zone # 查看当前区域以及网卡 sudo firewall-cmd --get-active-zones # 查看该区域详细规则 sudo firewall-cmd --zonepublic --list-all # 开放必要端口SSH、HTTP、HTTPS、Nginx、Prometheus、Grafana、Node Exporter sudo firewall-cmd --permanent --zonepublic --add-servicessh sudo firewall-cmd --permanent --zonepublic --add-servicehttp sudo firewall-cmd --permanent --zonepublic --add-servicehttps # 允许tcp协议的8080端口通过 sudo firewall-cmd --permanent --zonepublic --add-port8080/tcp sudo firewall-cmd --permanent --zonepublic --add-port9090/tcp # Prometheus sudo firewall-cmd --permanent --zonepublic --add-port3000/tcp # Grafana sudo firewall-cmd --permanent --zonepublic --add-port9100/tcp # Node Exporter # 重载配置 sudo firewall-cmd --reload # 查看已开放端口/服务 sudo firewall-cmd --list-all3.3 禁止root直接SSH登录可选但推荐sudo vi /etc/ssh/sshd_config # 修改 PermitRootLogin no # 确保能通过普通用户sudo提权后再重启SSH sudo systemctl restart sshd四、部署 Nginx 并配置虚拟主机与反向代理4.1 配置NginxCentos 安装部署 Nginx -CSDN博客4.2 配置虚拟主机多站点这是在配置Nginx 虚拟主机Virtual Host实现在一台服务器上运行多个网站。核心概念解释1.虚拟主机是什么让一台 Nginx 服务器同时托管多个不同的网站每个网站有独立的域名、目录、日志文件访问不同的域名会显示不同的网站内容2.目录结构说明text/usr/local/nginx/conf/ ├── nginx.conf # 主配置文件 ├── sites-available/ # 存放所有虚拟主机配置可用 │ ├── site1.conf # 站点1的配置 │ └── site2.conf # 站点2的配置 └── sites-enabled/ # 存放启用的配置软链接 ├── site1.conf - ../sites-available/site1.conf └── site2.conf - ../sites-available/site2.conf这种设计的好处sites-available保存所有配置类似候选sites-enabled只链接启用的配置类似激活禁用网站时删除软链接即可配置不会丢失编辑主配置文件引入虚拟主机配置sudo vi /usr/local/nginx/conf/nginx.conf在http块中添加http { # ... 其他配置 ... # 引入虚拟主机配置目录 include /usr/local/nginx/conf/sites-enabled/*.conf; }创建配置目录sudo mkdir -p /usr/local/nginx/conf/sites-available sudo mkdir -p /usr/local/nginx/conf/sites-enabled创建第一个虚拟主机示例site1.comsudo vi /usr/local/nginx/conf/sites-available/site1.confserver { listen 80; # 监听80端口 server_name site1.local www.site1.local; # 绑定域名 root /var/www/site1; # 网站文件根目录 index index.html index.htm; # 默认首页文件 location / { # URL匹配规则 try_files $uri $uri/ 404; # 找不到文件返回404 } # 日志分开记录便于管理 access_log /var/log/nginx/site1_access.log; error_log /var/log/nginx/site1_error.log; }创建第二个虚拟主机示例site2.comsudo vi /usr/local/nginx/conf/sites-available/site2.confserver { listen 80; # 监听80端口 server_name site2.local www.site2.local; # 绑定的域名 root /var/www/site2; # 网站文件根目录 index index.html index.htm; # 默认首页文件 location / { # URL匹配规则 try_files $uri $uri/ 404; # 找不到文件返回404 } # 日志分开记录便于管理 access_log /var/log/nginx/site2_access.log; error_log /var/log/nginx/site2_error.log; }启用虚拟主机创建软链接sudo ln -s /usr/local/nginx/conf/sites-available/site1.conf /usr/local/nginx/conf/sites-enabled/ sudo ln -s /usr/local/nginx/conf/sites-available/site2.conf /usr/local/nginx/conf/sites-enabled/创建网站目录和测试页面sudo mkdir -p /var/www/site1 /var/www/site2 echo h1Welcome to Site 1/h1 | sudo tee /var/www/site1/index.html echo h1Welcome to Site 2/h1 | sudo tee /var/www/site2/index.html测试配置文件并重载sudo /usr/local/nginx/sbin/nginx -t sudo systemctl reload nginx实际访问流程用户访问http://site1.localNginx 查看请求的域名匹配到server_name site1.local返回/var/www/site1/index.html显示 Welcome to Site 1用户访问http://site2.local匹配到另一个 server 块返回/var/www/site2/index.html显示 Welcome to Site 2虚拟机本地要修改host文件不然机器不知道site1.local域名对应的IP是什么# 编辑 hosts 文件 sudo vi /etc/hosts # 添加以下内容将域名指向本机 127.0.0.1 site1.local 127.0.0.1 www.site1.local 127.0.0.1 site2.local 127.0.0.1 www.site2.local想要修改本机的hostC:\Windows\System32\drivers\etc\hosts4.3 配置反向代理反向代理是什么简单理解正向代理你通过代理服务器访问外网如翻墙、公司上网代理反向代理你访问代理服务器它帮你转发请求到后端的真实服务区别正向代理客户端配置客户端知道真实服务器服务器不知道客户端真实IP反向代理服务器配置客户端不知道真实服务器服务器知道客户端真实IP例如将/api/路径的请求代理到后端服务sudo vi /usr/local/nginx/conf/sites-available/site1.conf添加代理配置server { listen 80; server_name site1.local; root /var/www/site1; index index.html; # 静态资源 location / { try_files $uri $uri/ 404; } # API反向代理到后端服务 location /api/ { proxy_pass http://localhost:8080/; # 后端服务地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 可选关闭缓冲适合实时性要求高的场景 # proxy_buffering off; } }这里的前提是proxy_pass http://localhost:8080/而不是proxy_pass http://localhost:8080静态文件Nginx 直接从/var/www/site1/返回API 请求用户请求时带/api/前缀Nginx 转发时去掉这个前缀对用户透明用户以为在访问/api/xxx实际后端收到的是/xxx如果没有/就是直接访问/api/xxxNginx转发的时候不会去掉这个前缀访问流程# 1. 用户在浏览器输入 http://site1.local/api/getUserInfo?id123 # 2. Nginx 处理 请求路径/api/getUserInfo?id123 匹配 location/api/ ✓ 转发目标http://localhost:8080/getUserInfo?id123 ↑ 注意/api/ 被替换成 / # 3. 后端服务localhost:8080收到 GET /getUserInfo?id123 # 4. 后端返回 {name: 张三, age: 25} # 5. Nginx 原样返回给浏览器 # 6. 浏览器显示数据五、编写自动化 Shell 脚本并配置定时任务5.1 日志清理脚本sudo mkdir -p /opt/scripts sudo vi /opt/scripts/log_cleanup.sh#!/bin/bash # 日志清理脚本 - 保留最近30天日志 # 定义变量 LOG_DIRS(/var/log /usr/local/nginx/logs) RETENTION_DAYS30 CURRENT_DATE$(date %Y-%m-%d %H:%M:%S) LOG_FILE/var/log/log_cleanup.log # 记录开始日志 echo [$CURRENT_DATE] 开始清理日志文件 $LOG_FILE # 遍历目录进行清理 for DIR in ${LOG_DIRS[]}; do if [ -d $DIR ]; then echo 清理目录: $DIR $LOG_FILE # 查找超过指定天数的 .log 文件并删除 find $DIR -name *.log -type f -mtime $RETENTION_DAYS -delete # 查找并清理空的日志文件 find $DIR -name *.log -type f -size 0 -delete else echo 警告: 目录 $DIR 不存在 $LOG_FILE fi done echo [$CURRENT_DATE] 日志清理完成 $LOG_FILE5.2 文件备份脚本sudo vi /opt/scripts/backup.sh#!/bin/bash # 备份脚本 - 备份指定目录 # 定义变量 SOURCE_DIRS(/var/www /usr/local/nginx/conf) BACKUP_BASE/backup DATE$(date %Y%m%d_%H%M%S) RETENTION_DAYS7 LOG_FILE/var/log/backup.log # 创建备份目录 mkdir -p $BACKUP_BASE echo [$(date %Y-%m-%d %H:%M:%S)] 开始备份 $LOG_FILE # 逐个备份目录 for DIR in ${SOURCE_DIRS[]}; do if [ -d $DIR ]; then DIR_NAME$(basename $DIR) BACKUP_FILE$BACKUP_BASE/${DIR_NAME}_backup_$DATE.tar.gz # 压缩备份 tar -czf $BACKUP_FILE $DIR 2/dev/null if [ $? -eq 0 ]; then echo 备份成功: $DIR - $BACKUP_FILE (大小: $(du -h $BACKUP_FILE | cut -f1)) $LOG_FILE else echo 备份失败: $DIR $LOG_FILE fi else echo 警告: 目录 $DIR 不存在 $LOG_FILE fi done # 清理超过保留天数的旧备份 find $BACKUP_BASE -name *_backup_*.tar.gz -type f -mtime $RETENTION_DAYS -delete echo [$(date %Y-%m-%d %H:%M:%S)] 备份完成 $LOG_FILE5.3 系统巡检脚本sudo vi /opt/scripts/system_check.sh#!/bin/bash # 系统巡检脚本 REPORT_FILE/var/log/system_report_$(date %Y%m%d).txt THRESHOLD_CPU80 THRESHOLD_DISK85 echo $REPORT_FILE echo 系统巡检报告 - $(date %Y-%m-%d %H:%M:%S) $REPORT_FILE echo $REPORT_FILE # 1. CPU核心数 系统负载 echo -e \n【系统负载】 $REPORT_FILE uproc uptime $REPORT_FILE # 2. CPU使用率 echo -e \n【CPU使用率】 $REPORT_FILE CPU_USAGE$(top -bn1 | grep Cpu(s) | awk {print $2} | cut -d% -f1) echo CPU使用率: $CPU_USAGE% $REPORT_FILE if (( $(echo $CPU_USAGE $THRESHOLD_CPU | bc -l) )); then echo ⚠️ 警告: CPU使用率超过阈值 $THRESHOLD_CPU% $REPORT_FILE fi # 3. 内存使用 echo -e \n【内存使用】 $REPORT_FILE free -h $REPORT_FILE # 4. 磁盘使用 echo -e \n【磁盘使用】 $REPORT_FILE df -h $REPORT_FILE # 检查磁盘空间 DISK_USAGE$(df -h / | tail -1 | awk {print $5} | sed s/%//) if [ $DISK_USAGE -gt $THRESHOLD_DISK ]; then echo ⚠️ 警告: 根分区使用率已达 $DISK_USAGE% $REPORT_FILE fi # 5. 运行中的Nginx状态 echo -e \n【Nginx状态】 $REPORT_FILE if systemctl is-active --quiet nginx; then echo Nginx: 运行中 $REPORT_FILE else echo Nginx: 未运行 $REPORT_FILE fi # 6. 最近登录记录 echo -e \n【最近5条登录记录】 $REPORT_FILE last -n 5 $REPORT_FILE # 7. 未授权的sudo尝试 echo -e \n【失败的sudo尝试】 $REPORT_FILE grep COMMAND /var/log/secure 2/dev/null | tail -5 $REPORT_FILE echo -e \n巡检报告已生成: $REPORT_FILE5.4 设置脚本权限并测试# 赋予执行权限 sudo chmod x /opt/scripts/*.sh # 测试运行 sudo /opt/scripts/log_cleanup.sh sudo /opt/scripts/backup.sh sudo /opt/scripts/system_check.sh5.5 配置 crontab 定时任务crontab -e# 每天凌晨2点执行日志清理 0 2 * * * /opt/scripts/log_cleanup.sh # 每天凌晨3点执行备份 0 3 * * * /opt/scripts/backup.sh # 每天上午9点生成系统巡检报告 0 9 * * * /opt/scripts/system_check.sh # 每周日凌晨4点重启Nginx可选 0 4 * * 0 systemctl reload nginx查看和验证定时任务crontab -l # 查看当前用户的定时任务 sudo tail -f /var/log/cron # 查看cron执行日志六、搭建 Prometheus Grafana 监控体系6.1 架构说明Node Exporter (采集主机指标) → Prometheus (存储查询) → Grafana (可视化展示) ↓ Alertmanager (告警可选)6.2 安装 Node Exporter主机指标采集器# 下载并安装 cd /tmp wget -c https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz tar -xzf node_exporter-1.7.0.linux-amd64.tar.gz # 移动到系统标准路径 sudo mv node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/ # 创建服务 sudo vim /etc/systemd/system/node_exporter.service将可执行程序移动到系统标准路径就是把可执行程序放到系统能找到的地方让你在任何目录下都能直接运行node_exporter验证效果移动前你只能在那个文件夹里用./node_exporter启动。移动后打开终端无论当前目录是/home/xxx还是/tmp直接输入node_exporter就能运行。[Install] # 开机自启 WantedBymulti-user.target [Unit] DescriptionPrometheus Node Exporter Afternetwork.target [Service] Usernobody Groupnobody Typesimple ExecStart/usr/local/bin/node_exporter [Install] WantedBymulti-user.targetsudo systemctl daemon-reload sudo systemctl start node_exporter sudo systemctl enable node_exporter # 验证默认监听9100端口 curl http://localhost:9100/metrics6.3 安装 Prometheus# 下载并解压 cd /tmp wget https://github.com/prometheus/prometheus/releases/download/v2.51.0/prometheus-2.51.0.linux-amd64.tar.gz tar -xzf prometheus-2.51.0.linux-amd64.tar.gz sudo mv prometheus-2.51.0.linux-amd64 /opt/prometheus # 创建数据目录 sudo mkdir -p /opt/prometheus/data # 这里$USER就是当前user用户的意思 sudo chown -R $USER:$USER /opt/prometheus配置 Prometheus默认就是这个添加一个node_exporter就行vi /opt/prometheus/prometheus.ymlglobal: # 每 15 秒从各个目标抓取一次监控数据 scrape_interval: 15s # 每 15 秒检查一次告警规则看是否需要触发告警 evaluation_interval: 15s # 告警配置 alerting: alertmanagers: - static_configs: # 当前为空表示暂未启用告警功能;以后需要发送告警邮件、钉钉等可以在这里填上 Alertmanager 的地址 - targets: [] # 规则文件:指定告警规则文件的位置;可以创建单独的 .yml 文件定义告警条件例如 CPU 超过 80% 时告警 rule_files: [] # 采集目标配置 scrape_configs: # 监控 Prometheus 自己的运行状态 # 任务名称 - job_name: prometheus static_configs: # 要监控的目标地址IP端口 - targets: [localhost:9090] # 任务名称 - job_name: node_exporter static_configs: # 要监控的目标地址IP端口 - targets: [localhost:9100]一个是监控Prometheus自己一个是监控指定node exporter采集的硬件数据创建prometheus专属用户# 创建 prometheus 系统用户 sudo useradd --no-create-home --shell /bin/false prometheus # 修改目录权限 sudo chown -R prometheus:prometheus /opt/prometheus创建 systemd 服务sudo vi /etc/systemd/system/prometheus.service[Unit] DescriptionPrometheus Afternetwork.target [Service] Userprometheus Groupprometheus Typesimple ExecStart/opt/prometheus/prometheus --config.file/opt/prometheus/prometheus.yml --storage.tsdb.path/opt/prometheus/data [Install] WantedBymulti-user.targetsudo systemctl daemon-reload sudo systemctl start prometheus sudo systemctl enable prometheus # 验证访问 http://虚拟机IP:90906.4 安装 Grafana# 1. 安装稳定的 Grafana 10.4.7完全兼容旧系统 sudo yum install -y https://dl.grafana.com/oss/release/grafana-10.4.7-1.x86_64.rpm # 2. 启动并启用 Grafana sudo systemctl daemon-reload sudo systemctl start grafana-server sudo systemctl enable grafana-server # 3. 检查服务状态 sudo systemctl status grafana-server # 4. 验证安装 curl http://localhost:30006.5 配置 Grafana 可视化登录 Grafana浏览器访问http://虚拟机IP:3000默认用户名/密码admin/admin首次登录后提示修改密码添加 Prometheus 数据源左侧菜单 → Connections → Data Sources → Add data source选择PrometheusURL 填写http://localhost:9090划到底下点击 Save Test操作意义Data Sources告诉 Grafana你的数据从哪里来选择 Prometheus指定数据源类型Grafana 会用 PromQL 语法去查询URL:http://localhost:9090Grafana 和 Prometheus 在同一台机器上通过 localhost 访问Save Test验证连接是否成功相当于握手确认导入 Node Exporter 仪表板最常用的模板左侧菜单 → Dashboards → Import输入模板ID1860Node Exporter Full点击 Load → 选择 Prometheus 数据源 → Import操作意义Import使用别人做好的现成模板不用自己从零画图模板ID: 1860Grafana.com 上的公共模板编号1860是 Node Exporter FullLoad下载模板配置包含图表布局、要查询哪些指标等选择数据源告诉这个 Dashboard 用哪个 Prometheus 去查数据Import正式创建并导入到你的 Grafana就可以看到性能监控了注意要选择自己想要看的完整数据流Node Exporter (采集硬件数据) ↓ :9100/metrics ↓ Prometheus (每15秒抓取一次存储到时间序列数据库) ↓ PromQL 查询 ↓ Grafana (通过 Dashboard仪表盘 发送查询请求) ↓ 浏览器显示图表 时间序列数据库像心电图记录仪,记录随时间变化的历史值6.6 添加系统告警可选创建告警规则文件vim /opt/prometheus/alerts.ymlgroups: - name: node_alerts rules: - alert: 实例宕机 expr: up{jobnode_exporter} 0 for: 1m labels: severity: critical annotations: summary: 主机 {{ $labels.instance }} 已停止运行 description: 实例 {{ $labels.instance }} 已无法访问超过 1 分钟 - alert: 高CPU使用率 expr: 100 - (avg(rate(node_cpu_seconds_total{modeidle}[5m])) * 100) 85 for: 5m labels: severity: warning annotations: summary: 主机 {{ $labels.instance }} CPU使用率过高 description: CPU使用率已超过85%当前值为 {{ $value }}% - alert: 磁盘空间不足 expr: (node_filesystem_avail_bytes{mountpoint/} / node_filesystem_size_bytes{mountpoint/}) * 100 15 for: 5m labels: severity: warning annotations: summary: 主机 {{ $labels.instance }} 磁盘空间不足 description: 根分区可用空间低于15%当前可用 {{ $value }}%
实践1: Linux 系统运维环境搭建与自动化实践
发布时间:2026/6/3 4:11:12
这是一个从零到一的完整运维实践项目涵盖系统安装、服务部署、自动化脚本和监控体系。我将按照环境准备 → 系统安装 → 安全加固 → Nginx部署 → 自动化脚本 → 监控体系的顺序展开。一、环境准备与系统安装1.1 下载所需软件软件用途下载地址VMware Workstation Pro虚拟机软件VMware官网CentOS 7 ISO操作系统镜像阿里云镜像站选择DVD版本x86_64架构1.2 创建虚拟机在 VMware 中按以下步骤创建虚拟机新建虚拟机→ 选择自定义(高级)硬件兼容性→ 保持默认安装来源→ 选择稍后安装操作系统操作系统→ Linux → CentOS 7 64位命名→ 如centos-ops选择存储位置CPU配置→ 建议 2 核根据宿主机性能调整内存分配→ 至少 2GB推荐 4GB网络类型→ 选择NAT模式最方便访问外网磁盘类型→ SCSI磁盘容量→ 建议 50GB选择存储为单个文件挂载ISO→ 编辑虚拟机设置 → CD/DVD → 使用ISO映像文件选择下载的 CentOS 7 ISO1.3 安装 CentOS 7启动虚拟机选择Install CentOS 7语言选择 →中文→ 简体中文软件选择→ 选择带GUI的服务器或GNOME桌面新手友好也适合后续可视化操作安装位置→ 保持默认自动分区网络和主机名→打开以太网开关如 ens33主机名设为centos-ops.local点击开始安装安装过程中设置ROOT密码设置一个强密码创建用户创建普通用户如opuser勾选将此用户作为管理员安装完成后重启完成初始配置即可进入系统。二、网络配置静态IP3.2 Linux网络基础命令网络配置端口查看故障排查-CSDN博客三、系统安全加固防火墙与权限3.1 基础安全配置依次执行以下安全加固操作# 1. 确保普通用户有sudo权限已创建则跳过 sudo usermod -aG wheel opuser # 2. 设置SSH空闲超时10分钟无操作断开 sudo vi /etc/ssh/sshd_config # 添加或修改 # 每个600秒向客户端发送心跳请求询问对方是否还在线 ClientAliveInterval 600 # 最多发送两次心跳请求如果客户端一直没有响应SSH服务端就主动断开连接 ClientAliveCountMax 2 # 3. 设置密码有效期90天 sudo vi /etc/login.defs # 修改 # 密码使用最长天数 PASS_MAX_DAYS 90 # 两次修改密码之间间隔最短天数 PASS_MIN_DAYS 7 # 密码过期前多少天提醒用户 PASS_WARN_AGE 7 # 4. 限制密码重复使用记住5个历史密码 sudo vi /etc/pam.d/system-auth # 在 password sufficient pam_unix.so 后添加 password sufficient pam_unix.so remember5 # 5. SSH最大认证尝试次数最多4次 sudo vi /etc/ssh/sshd_config MaxAuthTries 4 # 6. 禁止空密码登录 sudo vi /etc/ssh/sshd_config PermitEmptyPasswords no # 7. 重启SSH服务生效 sudo systemctl restart sshd # 8. 启用rsyslog日志服务 sudo systemctl enable rsyslog sudo systemctl start rsyslog # 9. 设置关键文件权限 # 这里不含有密码等敏感数据-可以让所有人读防止篡改账户信息-不允许普通用户写 sudo chmod 644 /etc/passwd /etc/group # 含有密码hash-不允许普通用户读 sudo chmod 0400 /etc/shadow /etc/gshadow3.2 防火墙配置firewalldCentOS 7 默认使用 firewalld# 查看防火墙状态 sudo systemctl status firewalld # 启动并设置开机自启 sudo systemctl start firewalld sudo systemctl enable firewalld # 查看默认区域 sudo firewall-cmd --get-default-zone # 查看当前区域以及网卡 sudo firewall-cmd --get-active-zones # 查看该区域详细规则 sudo firewall-cmd --zonepublic --list-all # 开放必要端口SSH、HTTP、HTTPS、Nginx、Prometheus、Grafana、Node Exporter sudo firewall-cmd --permanent --zonepublic --add-servicessh sudo firewall-cmd --permanent --zonepublic --add-servicehttp sudo firewall-cmd --permanent --zonepublic --add-servicehttps # 允许tcp协议的8080端口通过 sudo firewall-cmd --permanent --zonepublic --add-port8080/tcp sudo firewall-cmd --permanent --zonepublic --add-port9090/tcp # Prometheus sudo firewall-cmd --permanent --zonepublic --add-port3000/tcp # Grafana sudo firewall-cmd --permanent --zonepublic --add-port9100/tcp # Node Exporter # 重载配置 sudo firewall-cmd --reload # 查看已开放端口/服务 sudo firewall-cmd --list-all3.3 禁止root直接SSH登录可选但推荐sudo vi /etc/ssh/sshd_config # 修改 PermitRootLogin no # 确保能通过普通用户sudo提权后再重启SSH sudo systemctl restart sshd四、部署 Nginx 并配置虚拟主机与反向代理4.1 配置NginxCentos 安装部署 Nginx -CSDN博客4.2 配置虚拟主机多站点这是在配置Nginx 虚拟主机Virtual Host实现在一台服务器上运行多个网站。核心概念解释1.虚拟主机是什么让一台 Nginx 服务器同时托管多个不同的网站每个网站有独立的域名、目录、日志文件访问不同的域名会显示不同的网站内容2.目录结构说明text/usr/local/nginx/conf/ ├── nginx.conf # 主配置文件 ├── sites-available/ # 存放所有虚拟主机配置可用 │ ├── site1.conf # 站点1的配置 │ └── site2.conf # 站点2的配置 └── sites-enabled/ # 存放启用的配置软链接 ├── site1.conf - ../sites-available/site1.conf └── site2.conf - ../sites-available/site2.conf这种设计的好处sites-available保存所有配置类似候选sites-enabled只链接启用的配置类似激活禁用网站时删除软链接即可配置不会丢失编辑主配置文件引入虚拟主机配置sudo vi /usr/local/nginx/conf/nginx.conf在http块中添加http { # ... 其他配置 ... # 引入虚拟主机配置目录 include /usr/local/nginx/conf/sites-enabled/*.conf; }创建配置目录sudo mkdir -p /usr/local/nginx/conf/sites-available sudo mkdir -p /usr/local/nginx/conf/sites-enabled创建第一个虚拟主机示例site1.comsudo vi /usr/local/nginx/conf/sites-available/site1.confserver { listen 80; # 监听80端口 server_name site1.local www.site1.local; # 绑定域名 root /var/www/site1; # 网站文件根目录 index index.html index.htm; # 默认首页文件 location / { # URL匹配规则 try_files $uri $uri/ 404; # 找不到文件返回404 } # 日志分开记录便于管理 access_log /var/log/nginx/site1_access.log; error_log /var/log/nginx/site1_error.log; }创建第二个虚拟主机示例site2.comsudo vi /usr/local/nginx/conf/sites-available/site2.confserver { listen 80; # 监听80端口 server_name site2.local www.site2.local; # 绑定的域名 root /var/www/site2; # 网站文件根目录 index index.html index.htm; # 默认首页文件 location / { # URL匹配规则 try_files $uri $uri/ 404; # 找不到文件返回404 } # 日志分开记录便于管理 access_log /var/log/nginx/site2_access.log; error_log /var/log/nginx/site2_error.log; }启用虚拟主机创建软链接sudo ln -s /usr/local/nginx/conf/sites-available/site1.conf /usr/local/nginx/conf/sites-enabled/ sudo ln -s /usr/local/nginx/conf/sites-available/site2.conf /usr/local/nginx/conf/sites-enabled/创建网站目录和测试页面sudo mkdir -p /var/www/site1 /var/www/site2 echo h1Welcome to Site 1/h1 | sudo tee /var/www/site1/index.html echo h1Welcome to Site 2/h1 | sudo tee /var/www/site2/index.html测试配置文件并重载sudo /usr/local/nginx/sbin/nginx -t sudo systemctl reload nginx实际访问流程用户访问http://site1.localNginx 查看请求的域名匹配到server_name site1.local返回/var/www/site1/index.html显示 Welcome to Site 1用户访问http://site2.local匹配到另一个 server 块返回/var/www/site2/index.html显示 Welcome to Site 2虚拟机本地要修改host文件不然机器不知道site1.local域名对应的IP是什么# 编辑 hosts 文件 sudo vi /etc/hosts # 添加以下内容将域名指向本机 127.0.0.1 site1.local 127.0.0.1 www.site1.local 127.0.0.1 site2.local 127.0.0.1 www.site2.local想要修改本机的hostC:\Windows\System32\drivers\etc\hosts4.3 配置反向代理反向代理是什么简单理解正向代理你通过代理服务器访问外网如翻墙、公司上网代理反向代理你访问代理服务器它帮你转发请求到后端的真实服务区别正向代理客户端配置客户端知道真实服务器服务器不知道客户端真实IP反向代理服务器配置客户端不知道真实服务器服务器知道客户端真实IP例如将/api/路径的请求代理到后端服务sudo vi /usr/local/nginx/conf/sites-available/site1.conf添加代理配置server { listen 80; server_name site1.local; root /var/www/site1; index index.html; # 静态资源 location / { try_files $uri $uri/ 404; } # API反向代理到后端服务 location /api/ { proxy_pass http://localhost:8080/; # 后端服务地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 可选关闭缓冲适合实时性要求高的场景 # proxy_buffering off; } }这里的前提是proxy_pass http://localhost:8080/而不是proxy_pass http://localhost:8080静态文件Nginx 直接从/var/www/site1/返回API 请求用户请求时带/api/前缀Nginx 转发时去掉这个前缀对用户透明用户以为在访问/api/xxx实际后端收到的是/xxx如果没有/就是直接访问/api/xxxNginx转发的时候不会去掉这个前缀访问流程# 1. 用户在浏览器输入 http://site1.local/api/getUserInfo?id123 # 2. Nginx 处理 请求路径/api/getUserInfo?id123 匹配 location/api/ ✓ 转发目标http://localhost:8080/getUserInfo?id123 ↑ 注意/api/ 被替换成 / # 3. 后端服务localhost:8080收到 GET /getUserInfo?id123 # 4. 后端返回 {name: 张三, age: 25} # 5. Nginx 原样返回给浏览器 # 6. 浏览器显示数据五、编写自动化 Shell 脚本并配置定时任务5.1 日志清理脚本sudo mkdir -p /opt/scripts sudo vi /opt/scripts/log_cleanup.sh#!/bin/bash # 日志清理脚本 - 保留最近30天日志 # 定义变量 LOG_DIRS(/var/log /usr/local/nginx/logs) RETENTION_DAYS30 CURRENT_DATE$(date %Y-%m-%d %H:%M:%S) LOG_FILE/var/log/log_cleanup.log # 记录开始日志 echo [$CURRENT_DATE] 开始清理日志文件 $LOG_FILE # 遍历目录进行清理 for DIR in ${LOG_DIRS[]}; do if [ -d $DIR ]; then echo 清理目录: $DIR $LOG_FILE # 查找超过指定天数的 .log 文件并删除 find $DIR -name *.log -type f -mtime $RETENTION_DAYS -delete # 查找并清理空的日志文件 find $DIR -name *.log -type f -size 0 -delete else echo 警告: 目录 $DIR 不存在 $LOG_FILE fi done echo [$CURRENT_DATE] 日志清理完成 $LOG_FILE5.2 文件备份脚本sudo vi /opt/scripts/backup.sh#!/bin/bash # 备份脚本 - 备份指定目录 # 定义变量 SOURCE_DIRS(/var/www /usr/local/nginx/conf) BACKUP_BASE/backup DATE$(date %Y%m%d_%H%M%S) RETENTION_DAYS7 LOG_FILE/var/log/backup.log # 创建备份目录 mkdir -p $BACKUP_BASE echo [$(date %Y-%m-%d %H:%M:%S)] 开始备份 $LOG_FILE # 逐个备份目录 for DIR in ${SOURCE_DIRS[]}; do if [ -d $DIR ]; then DIR_NAME$(basename $DIR) BACKUP_FILE$BACKUP_BASE/${DIR_NAME}_backup_$DATE.tar.gz # 压缩备份 tar -czf $BACKUP_FILE $DIR 2/dev/null if [ $? -eq 0 ]; then echo 备份成功: $DIR - $BACKUP_FILE (大小: $(du -h $BACKUP_FILE | cut -f1)) $LOG_FILE else echo 备份失败: $DIR $LOG_FILE fi else echo 警告: 目录 $DIR 不存在 $LOG_FILE fi done # 清理超过保留天数的旧备份 find $BACKUP_BASE -name *_backup_*.tar.gz -type f -mtime $RETENTION_DAYS -delete echo [$(date %Y-%m-%d %H:%M:%S)] 备份完成 $LOG_FILE5.3 系统巡检脚本sudo vi /opt/scripts/system_check.sh#!/bin/bash # 系统巡检脚本 REPORT_FILE/var/log/system_report_$(date %Y%m%d).txt THRESHOLD_CPU80 THRESHOLD_DISK85 echo $REPORT_FILE echo 系统巡检报告 - $(date %Y-%m-%d %H:%M:%S) $REPORT_FILE echo $REPORT_FILE # 1. CPU核心数 系统负载 echo -e \n【系统负载】 $REPORT_FILE uproc uptime $REPORT_FILE # 2. CPU使用率 echo -e \n【CPU使用率】 $REPORT_FILE CPU_USAGE$(top -bn1 | grep Cpu(s) | awk {print $2} | cut -d% -f1) echo CPU使用率: $CPU_USAGE% $REPORT_FILE if (( $(echo $CPU_USAGE $THRESHOLD_CPU | bc -l) )); then echo ⚠️ 警告: CPU使用率超过阈值 $THRESHOLD_CPU% $REPORT_FILE fi # 3. 内存使用 echo -e \n【内存使用】 $REPORT_FILE free -h $REPORT_FILE # 4. 磁盘使用 echo -e \n【磁盘使用】 $REPORT_FILE df -h $REPORT_FILE # 检查磁盘空间 DISK_USAGE$(df -h / | tail -1 | awk {print $5} | sed s/%//) if [ $DISK_USAGE -gt $THRESHOLD_DISK ]; then echo ⚠️ 警告: 根分区使用率已达 $DISK_USAGE% $REPORT_FILE fi # 5. 运行中的Nginx状态 echo -e \n【Nginx状态】 $REPORT_FILE if systemctl is-active --quiet nginx; then echo Nginx: 运行中 $REPORT_FILE else echo Nginx: 未运行 $REPORT_FILE fi # 6. 最近登录记录 echo -e \n【最近5条登录记录】 $REPORT_FILE last -n 5 $REPORT_FILE # 7. 未授权的sudo尝试 echo -e \n【失败的sudo尝试】 $REPORT_FILE grep COMMAND /var/log/secure 2/dev/null | tail -5 $REPORT_FILE echo -e \n巡检报告已生成: $REPORT_FILE5.4 设置脚本权限并测试# 赋予执行权限 sudo chmod x /opt/scripts/*.sh # 测试运行 sudo /opt/scripts/log_cleanup.sh sudo /opt/scripts/backup.sh sudo /opt/scripts/system_check.sh5.5 配置 crontab 定时任务crontab -e# 每天凌晨2点执行日志清理 0 2 * * * /opt/scripts/log_cleanup.sh # 每天凌晨3点执行备份 0 3 * * * /opt/scripts/backup.sh # 每天上午9点生成系统巡检报告 0 9 * * * /opt/scripts/system_check.sh # 每周日凌晨4点重启Nginx可选 0 4 * * 0 systemctl reload nginx查看和验证定时任务crontab -l # 查看当前用户的定时任务 sudo tail -f /var/log/cron # 查看cron执行日志六、搭建 Prometheus Grafana 监控体系6.1 架构说明Node Exporter (采集主机指标) → Prometheus (存储查询) → Grafana (可视化展示) ↓ Alertmanager (告警可选)6.2 安装 Node Exporter主机指标采集器# 下载并安装 cd /tmp wget -c https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz tar -xzf node_exporter-1.7.0.linux-amd64.tar.gz # 移动到系统标准路径 sudo mv node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/ # 创建服务 sudo vim /etc/systemd/system/node_exporter.service将可执行程序移动到系统标准路径就是把可执行程序放到系统能找到的地方让你在任何目录下都能直接运行node_exporter验证效果移动前你只能在那个文件夹里用./node_exporter启动。移动后打开终端无论当前目录是/home/xxx还是/tmp直接输入node_exporter就能运行。[Install] # 开机自启 WantedBymulti-user.target [Unit] DescriptionPrometheus Node Exporter Afternetwork.target [Service] Usernobody Groupnobody Typesimple ExecStart/usr/local/bin/node_exporter [Install] WantedBymulti-user.targetsudo systemctl daemon-reload sudo systemctl start node_exporter sudo systemctl enable node_exporter # 验证默认监听9100端口 curl http://localhost:9100/metrics6.3 安装 Prometheus# 下载并解压 cd /tmp wget https://github.com/prometheus/prometheus/releases/download/v2.51.0/prometheus-2.51.0.linux-amd64.tar.gz tar -xzf prometheus-2.51.0.linux-amd64.tar.gz sudo mv prometheus-2.51.0.linux-amd64 /opt/prometheus # 创建数据目录 sudo mkdir -p /opt/prometheus/data # 这里$USER就是当前user用户的意思 sudo chown -R $USER:$USER /opt/prometheus配置 Prometheus默认就是这个添加一个node_exporter就行vi /opt/prometheus/prometheus.ymlglobal: # 每 15 秒从各个目标抓取一次监控数据 scrape_interval: 15s # 每 15 秒检查一次告警规则看是否需要触发告警 evaluation_interval: 15s # 告警配置 alerting: alertmanagers: - static_configs: # 当前为空表示暂未启用告警功能;以后需要发送告警邮件、钉钉等可以在这里填上 Alertmanager 的地址 - targets: [] # 规则文件:指定告警规则文件的位置;可以创建单独的 .yml 文件定义告警条件例如 CPU 超过 80% 时告警 rule_files: [] # 采集目标配置 scrape_configs: # 监控 Prometheus 自己的运行状态 # 任务名称 - job_name: prometheus static_configs: # 要监控的目标地址IP端口 - targets: [localhost:9090] # 任务名称 - job_name: node_exporter static_configs: # 要监控的目标地址IP端口 - targets: [localhost:9100]一个是监控Prometheus自己一个是监控指定node exporter采集的硬件数据创建prometheus专属用户# 创建 prometheus 系统用户 sudo useradd --no-create-home --shell /bin/false prometheus # 修改目录权限 sudo chown -R prometheus:prometheus /opt/prometheus创建 systemd 服务sudo vi /etc/systemd/system/prometheus.service[Unit] DescriptionPrometheus Afternetwork.target [Service] Userprometheus Groupprometheus Typesimple ExecStart/opt/prometheus/prometheus --config.file/opt/prometheus/prometheus.yml --storage.tsdb.path/opt/prometheus/data [Install] WantedBymulti-user.targetsudo systemctl daemon-reload sudo systemctl start prometheus sudo systemctl enable prometheus # 验证访问 http://虚拟机IP:90906.4 安装 Grafana# 1. 安装稳定的 Grafana 10.4.7完全兼容旧系统 sudo yum install -y https://dl.grafana.com/oss/release/grafana-10.4.7-1.x86_64.rpm # 2. 启动并启用 Grafana sudo systemctl daemon-reload sudo systemctl start grafana-server sudo systemctl enable grafana-server # 3. 检查服务状态 sudo systemctl status grafana-server # 4. 验证安装 curl http://localhost:30006.5 配置 Grafana 可视化登录 Grafana浏览器访问http://虚拟机IP:3000默认用户名/密码admin/admin首次登录后提示修改密码添加 Prometheus 数据源左侧菜单 → Connections → Data Sources → Add data source选择PrometheusURL 填写http://localhost:9090划到底下点击 Save Test操作意义Data Sources告诉 Grafana你的数据从哪里来选择 Prometheus指定数据源类型Grafana 会用 PromQL 语法去查询URL:http://localhost:9090Grafana 和 Prometheus 在同一台机器上通过 localhost 访问Save Test验证连接是否成功相当于握手确认导入 Node Exporter 仪表板最常用的模板左侧菜单 → Dashboards → Import输入模板ID1860Node Exporter Full点击 Load → 选择 Prometheus 数据源 → Import操作意义Import使用别人做好的现成模板不用自己从零画图模板ID: 1860Grafana.com 上的公共模板编号1860是 Node Exporter FullLoad下载模板配置包含图表布局、要查询哪些指标等选择数据源告诉这个 Dashboard 用哪个 Prometheus 去查数据Import正式创建并导入到你的 Grafana就可以看到性能监控了注意要选择自己想要看的完整数据流Node Exporter (采集硬件数据) ↓ :9100/metrics ↓ Prometheus (每15秒抓取一次存储到时间序列数据库) ↓ PromQL 查询 ↓ Grafana (通过 Dashboard仪表盘 发送查询请求) ↓ 浏览器显示图表 时间序列数据库像心电图记录仪,记录随时间变化的历史值6.6 添加系统告警可选创建告警规则文件vim /opt/prometheus/alerts.ymlgroups: - name: node_alerts rules: - alert: 实例宕机 expr: up{jobnode_exporter} 0 for: 1m labels: severity: critical annotations: summary: 主机 {{ $labels.instance }} 已停止运行 description: 实例 {{ $labels.instance }} 已无法访问超过 1 分钟 - alert: 高CPU使用率 expr: 100 - (avg(rate(node_cpu_seconds_total{modeidle}[5m])) * 100) 85 for: 5m labels: severity: warning annotations: summary: 主机 {{ $labels.instance }} CPU使用率过高 description: CPU使用率已超过85%当前值为 {{ $value }}% - alert: 磁盘空间不足 expr: (node_filesystem_avail_bytes{mountpoint/} / node_filesystem_size_bytes{mountpoint/}) * 100 15 for: 5m labels: severity: warning annotations: summary: 主机 {{ $labels.instance }} 磁盘空间不足 description: 根分区可用空间低于15%当前可用 {{ $value }}%