Linux服务器运维入门教程

教程简介

零基础Linux服务器运维完整教程,涵盖服务器选购、SSH连接、系统初始化、用户管理、防火墙配置、Nginx配置、域名解析、SSL证书、日志管理、定时任务、监控告警等核心技能,配有从零到上线完整部署实战项目。

Linux 服务器运维入门教程

面向零基础用户的完整指南——从选购服务器到网站上线,手把手带你掌握 Linux 服务器运维核心技能。


目录

  1. 服务器选购
  2. SSH 远程连接
  3. 系统初始化
  4. 用户管理
  5. 防火墙配置
  6. Nginx 配置
  7. 域名解析
  8. SSL 证书配置
  9. 日志管理
  10. 定时任务
  11. 监控告警
  12. 实战项目:从零部署一个网站

1. 服务器选购

1.1 什么是服务器?

服务器本质上就是一台全年无休运行的远程计算机。你需要通过网络来操作它,而不是像使用个人电脑那样直接面对屏幕和键盘。

1.2 主流云服务商

服务商 特点 适合人群
阿里云 国内最大,文档齐全,生态完善 国内用户首选
腾讯云 性价比高,学生优惠力度大 学生 / 个人开发者
华为云 企业级服务强,政企市场占有率高 企业用户
AWS 全球覆盖,服务种类最多 有国际化需求的用户
DigitalOcean 界面简洁,按小时计费 海外项目 / 个人开发者
Vultr 全球多节点,支持按小时付费和随时销毁 需要灵活切换机房的用户

1.3 选购建议

操作系统选择: 推荐 Ubuntu 22.04 LTSDebian 12,社区活跃、文档丰富、软件包新。如果你偏好企业级稳定性,也可以选择 CentOS Stream 9Rocky Linux 9

配置推荐(个人网站 / 学习用途):

  • CPU:1-2 核
  • 内存:1-2 GB
  • 硬盘:20-50 GB SSD
  • 带宽:1-5 Mbps
  • 月费参考:30-100 元人民币

配置推荐(中小型生产环境):

  • CPU:2-4 核
  • 内存:4-8 GB
  • 硬盘:50-100 GB SSD
  • 带宽:5-10 Mbps
  • 月费参考:200-500 元人民币

提示: 新注册用户通常可以享受首购优惠,价格会便宜很多。各大云平台也有免费试用额度,适合学习阶段使用。

1.4 购买后的第一步

购买完成后,云服务商会给你以下信息:

  • 公网 IP 地址:如 123.45.67.89
  • root 密码SSH 密钥:用于登录服务器
  • SSH 端口:默认为 22

记好这些信息,下一步我们将用它们连接服务器。


2. SSH 远程连接

2.1 什么是 SSH?

SSH(Secure Shell)是一种加密的网络协议,让你能安全地远程登录和操作服务器。可以把 SSH 理解为一条通往服务器的"加密隧道"。

2.2 连接方式

Windows 用户

Windows 10 及以上版本自带 OpenSSH 客户端,直接打开 PowerShell命令提示符 即可使用:

ssh root@123.45.67.89

如果 SSH 端口不是默认的 22,需要指定端口:

ssh -p 2222 root@123.45.67.89

也可以使用图形化工具:

  • PuTTY:经典免费的 SSH 客户端
  • MobaXterm:功能更强大,集成了文件传输
  • Windows Terminal:微软官方终端,支持多标签页

macOS / Linux 用户

打开终端(Terminal),直接使用:

ssh root@123.45.67.89

2.3 使用 SSH 密钥登录(推荐)

密码登录存在被暴力破解的风险,强烈建议使用 SSH 密钥对进行认证。

第一步:生成密钥对

# 在你的本地电脑上执行
ssh-keygen -t ed25519 -C "your_email@example.com"

一路按回车即可。生成的文件位于:

  • 私钥:~/.ssh/id_ed25519(绝对不能泄露!)
  • 公钥:~/.ssh/id_ed25519.pub(可以公开分享)

第二步:将公钥上传到服务器

# 方法一:使用 ssh-copy-id(推荐)
ssh-copy-id root@123.45.67.89

# 方法二:手动复制
cat ~/.ssh/id_ed25519.pub | ssh root@123.45.67.89 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

第三步:测试免密登录

ssh root@123.45.67.89
# 如果不需要输入密码就成功登录,说明配置成功

2.4 SSH 配置优化

编辑本地 SSH 配置文件,简化连接命令:

# 编辑 ~/.ssh/config
cat >> ~/.ssh/config << 'EOF'
Host myserver
    HostName 123.45.67.89
    User root
    Port 22
    IdentityFile ~/.ssh/id_ed25519
EOF

之后就可以用别名连接了:

ssh myserver

3. 系统初始化

拿到一台新服务器后,第一件事就是进行系统初始化配置,确保安全性和可用性。

3.1 更新系统软件包

# Ubuntu / Debian
apt update && apt upgrade -y

# CentOS / Rocky Linux / AlmaLinux
dnf update -y

3.2 设置时区

# 查看当前时区
timedatectl

# 设置时区为亚洲/上海
timedatectl set-timezone Asia/Shanghai

# 验证
date

3.3 设置主机名

# 设置主机名
hostnamectl set-hostname my-server

# 验证
hostnamectl

3.4 配置 Swap 交换空间

Swap 相当于虚拟内存,当物理内存不足时使用磁盘空间作为补充。对于小内存服务器尤其重要。

# 创建 2GB 的 Swap 文件
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

# 永久生效:写入 fstab
echo '/swapfile none swap sw 0 0' | tee -a /etc/fstab

# 调整 Swap 使用倾向(值越低越优先使用物理内存)
sysctl vm.swappiness=10
echo 'vm.swappiness=10' >> /etc/sysctl.conf

3.5 安装常用工具

# Ubuntu / Debian
apt install -y vim curl wget htop net-tools unzip git tree lsof

# CentOS / Rocky Linux
dnf install -y vim curl wget htop net-tools unzip git tree lsof

各工具用途:

工具 用途
vim 文本编辑器
curl HTTP 请求工具
wget 文件下载工具
htop 交互式进程监控
net-tools 网络工具集(ifconfig 等)
unzip 解压缩工具
git 版本控制
tree 目录结构树形展示
lsof 查看打开的文件和端口

4. 用户管理

4.1 为什么不要用 root?

root 是 Linux 的超级管理员账户,拥有系统最高权限。日常使用 root 存在严重安全隐患:

  • 误操作可能直接破坏系统
  • 被入侵后攻击者直接获得最高权限
  • 无法进行权限审计

最佳实践: 创建一个普通用户,需要时通过 sudo 提权。

4.2 创建新用户

# 创建用户并设置密码
adduser deploy

# 系统会提示你输入密码和其他信息(可以一路回车跳过)

4.3 赋予 sudo 权限

# Ubuntu / Debian:将用户加入 sudo 组
usermod -aG sudo deploy

# CentOS / Rocky Linux:将用户加入 wheel 组
usermod -aG wheel deploy

验证 sudo 权限:

# 切换到新用户
su - deploy

# 测试 sudo
sudo whoami
# 输出 root 说明权限配置成功

4.4 SSH 密钥配置(新用户)

# 切换到新用户
su - deploy

# 创建 .ssh 目录
mkdir -p ~/.ssh
chmod 700 ~/.ssh

# 将 root 的公钥复制过来(或从本地重新上传)
sudo cp /root/.ssh/authorized_keys ~/.ssh/authorized_keys
sudo chown deploy:deploy ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

4.5 禁用 root SSH 登录

确认新用户可以正常登录后,禁用 root 的远程登录:

# 编辑 SSH 配置
sudo vim /etc/ssh/sshd_config

# 找到并修改以下行:
PermitRootLogin no          # 禁止 root 登录
PasswordAuthentication no   # 禁用密码认证(只允许密钥)
PubkeyAuthentication yes    # 启用公钥认证

# 重启 SSH 服务
sudo systemctl restart sshd

注意: 修改前务必确认新用户的密钥登录已经生效!否则你可能会被锁在服务器外面。

4.6 查看和管理用户

# 查看所有用户
cat /etc/passwd

# 查看用户所属的组
groups deploy

# 查看当前登录的用户
who

# 锁定用户(禁止登录)
sudo usermod -L username

# 解锁用户
sudo usermod -U username

# 删除用户及其主目录
sudo userdel -r username

5. 防火墙配置

5.1 防火墙是什么?

防火墙是服务器的"门卫",控制哪些网络流量可以进入和离开你的服务器。默认情况下,你应该只开放必要的端口。

5.2 UFW(Ubuntu / Debian 推荐)

UFW(Uncomplicated Firewall)是 Ubuntu 系默认的防火墙管理工具,语法简洁易懂。

# 查看防火墙状态
sudo ufw status verbose

# 启用防火墙
sudo ufw enable

# 设置默认策略:拒绝所有入站,允许所有出站
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 允许 SSH(重要!先开放再启用,避免锁死自己)
sudo ufw allow ssh
# 或指定端口
sudo ufw allow 22/tcp

# 允许 HTTP 和 HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 允许特定 IP 访问
sudo ufw allow from 192.168.1.100

# 允许特定 IP 访问特定端口
sudo ufw allow from 192.168.1.100 to any port 3306

# 删除规则(先查看编号)
sudo ufw status numbered
sudo ufw delete 3    # 删除第 3 条规则

# 禁用防火墙
sudo ufw disable

5.3 firewalld(CentOS / Rocky Linux 推荐)

# 查看防火墙状态
sudo systemctl status firewalld
sudo firewall-cmd --state

# 启动防火墙
sudo systemctl start firewalld
sudo systemctl enable firewalld

# 查看当前开放的端口
sudo firewall-cmd --list-all

# 开放端口
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-port=22/tcp

# 开放服务
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https

# 重新加载规则
sudo firewall-cmd --reload

# 删除规则
sudo firewall-cmd --permanent --remove-port=80/tcp
sudo firewall-cmd --reload

# 查看所有可用服务
sudo firewall-cmd --get-services

5.4 云服务商安全组

除了系统防火墙,云服务商还提供安全组(Security Group)功能,在网络层面进行过滤。你需要在云控制台中配置安全组规则,确保对应端口已开放。两层防火墙是叠加生效的。


6. Nginx 配置

6.1 什么是 Nginx?

Nginx(发音为 "engine-x")是一款高性能的 Web 服务器和反向代理服务器。它是目前世界上最流行的 Web 服务器之一,以高并发、低内存消耗著称。

6.2 安装 Nginx

# Ubuntu / Debian
sudo apt install -y nginx

# CentOS / Rocky Linux
sudo dnf install -y nginx

# 启动并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx

# 查看运行状态
sudo systemctl status nginx

安装完成后,打开浏览器访问 http://你的服务器IP,应该能看到 Nginx 的欢迎页面。

6.3 Nginx 目录结构

/etc/nginx/
├── nginx.conf              # 主配置文件
├── sites-available/        # 可用的站点配置
│   └── default
├── sites-enabled/          # 已启用的站点配置(符号链接)
│   └── default -> ../sites-available/default
├── conf.d/                 # 额外配置目录
├── mime.types              # MIME 类型定义
└── nginx.conf              # 主配置文件

注意: CentOS / Rocky Linux 没有 sites-availablesites-enabled 目录,站点配置放在 /etc/nginx/conf.d/ 目录下。

6.4 配置一个静态网站

第一步:创建网站目录

sudo mkdir -p /var/www/mysite
sudo chown -R $USER:$USER /var/www/mysite

第二步:创建测试页面

cat > /var/www/mysite/index.html << 'EOF'
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>我的第一个网站</title>
    <style>
        body { font-family: sans-serif; text-align: center; padding-top: 50px; }
        h1 { color: #333; }
    </style>
</head>
<body>
    <h1>🎉 恭喜!你的网站已经成功部署!</h1>
    <p>这是运行在 Nginx 上的静态页面。</p>
</body>
</html>
EOF

第三步:创建 Nginx 配置

sudo vim /etc/nginx/sites-available/mysite

写入以下配置:

server {
    listen 80;
    server_name example.com www.example.com;  # 替换为你的域名

    root /var/www/mysite;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    # 静态资源缓存
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, no-transform";
    }

    # 禁止访问隐藏文件
    location ~ /\. {
        deny all;
    }

    # 日志
    access_log /var/log/nginx/mysite.access.log;
    error_log /var/log/nginx/mysite.error.log;
}

第四步:启用站点

# 创建符号链接启用站点
sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/

# 测试配置语法
sudo nginx -t

# 重新加载 Nginx
sudo systemctl reload nginx

6.5 Nginx 反向代理

反向代理是 Nginx 最常用的场景之一。比如你有一个 Node.js 应用运行在 3000 端口,通过 Nginx 反向代理让它可以通过 80 端口访问。

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        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_cache_bypass $http_upgrade;
    }
}

6.6 常用 Nginx 命令

# 测试配置文件语法
sudo nginx -t

# 重新加载配置(不中断服务)
sudo systemctl reload nginx

# 重启服务
sudo systemctl restart nginx

# 查看 Nginx 版本和编译参数
nginx -V

# 查看当前连接数
sudo ss -tlnp | grep nginx

# 实时查看访问日志
sudo tail -f /var/log/nginx/access.log

7. 域名解析

7.1 什么是域名解析?

域名解析就是将人类可读的域名(如 example.com)转换为服务器的 IP 地址(如 123.45.67.89)。这样用户只需记住域名就能访问你的网站。

7.2 购买域名

可以通过以下域名注册商购买:

  • 阿里云万网:国内主流,.com 域名约 60 元/年
  • 腾讯云 DNSPod:与腾讯云生态集成
  • Cloudflare Registrar:成本价出售,无加价
  • Namecheap:海外知名,价格透明

7.3 配置 DNS 解析记录

在域名注册商的 DNS 管理界面添加以下记录:

记录类型 主机记录 记录值 说明
A @ 123.45.67.89 根域名指向服务器
A www 123.45.67.89 www 子域名指向服务器
A blog 123.45.67.89 blog 子域名指向服务器
CNAME mail example.com 邮件子域名别名
MX @ mail.example.com 邮件交换记录

7.4 常用 DNS 记录类型

  • A 记录:将域名指向一个 IPv4 地址
  • AAAA 记录:将域名指向一个 IPv6 地址
  • CNAME 记录:将域名指向另一个域名(别名)
  • MX 记录:指定邮件服务器
  • TXT 记录:存储文本信息(常用于域名验证)
  • NS 记录:指定域名服务器

7.5 验证解析是否生效

# 使用 dig 命令查询
dig example.com A

# 使用 nslookup
nslookup example.com

# 使用 host
host example.com

# 查询特定 DNS 服务器
dig @8.8.8.8 example.com

注意: DNS 解析有缓存机制,新增或修改记录后,全球生效通常需要 10 分钟到 48 小时 不等。大部分情况下 1 小时内即可生效。

7.6 使用 Cloudflare 加速和防护(可选)

Cloudflare 提供免费的 CDN 和 DDoS 防护:

  1. 注册 Cloudflare 账号
  2. 添加你的域名
  3. 将域名的 NS 记录改为 Cloudflare 提供的 Nameserver
  4. 在 Cloudflare 中配置 DNS 记录
  5. 开启橙色云朵图标启用 CDN 代理

8. SSL 证书配置

8.1 为什么需要 SSL?

SSL 证书让网站使用 HTTPS 协议加密传输数据。没有 SSL 的网站:

  • 浏览器会显示"不安全"警告
  • 数据以明文传输,容易被窃听
  • 搜索引擎排名会降低

8.2 使用 Let's Encrypt 免费证书

Let's Encrypt 提供免费的 SSL 证书,有效期 90 天,可以自动续期。

第一步:安装 Certbot

# Ubuntu / Debian
sudo apt install -y certbot python3-certbot-nginx

# CentOS / Rocky Linux
sudo dnf install -y certbot python3-certbot-nginx

第二步:申请证书

# 自动配置 Nginx 并申请证书
sudo certbot --nginx -d example.com -d www.example.com

# 如果只想申请证书,不自动修改 Nginx 配置
sudo certbot certonly --nginx -d example.com -d www.example.com

Certbot 会引导你完成以下步骤:

  1. 输入邮箱地址(用于接收证书到期提醒)
  2. 同意服务条款
  3. 选择是否分享邮箱给 EFF(可选)
  4. 选择 HTTP 验证方式

第三步:验证自动续期

# 测试续期流程(不会真正续期)
sudo certbot renew --dry-run

# 查看证书到期时间
sudo certbot certificates

Certbot 安装时会自动设置定时任务来续期证书。你也可以手动设置:

# 添加定时续期任务(每天凌晨 2 点检查)
echo "0 2 * * * certbot renew --quiet" | sudo crontab -

8.3 手动配置 HTTPS 的 Nginx 配置

如果 Certbot 没有自动修改 Nginx 配置,你需要手动添加:

server {
    listen 80;
    server_name example.com www.example.com;
    # HTTP 重定向到 HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # SSL 优化配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # 安全头
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options DENY;

    root /var/www/mysite;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

8.4 验证 HTTPS 配置

# 重新加载 Nginx
sudo nginx -t && sudo systemctl reload nginx

# 使用 curl 测试
curl -I https://example.com

# 检查 SSL 评级(在浏览器中访问)
# https://www.ssllabs.com/ssltest/analyze.html?d=example.com

9. 日志管理

9.1 日志的重要性

日志是服务器的"黑匣子"。当出现问题时,日志是你排查故障的第一手资料。养成定期查看日志的习惯,能帮助你提前发现潜在问题。

9.2 系统日志

# 查看系统日志(systemd 系统)
sudo journalctl

# 查看最近的 100 行日志
sudo journalctl -n 100

# 实时跟踪日志
sudo journalctl -f

# 查看特定服务的日志
sudo journalctl -u nginx
sudo journalctl -u sshd

# 查看今天的日志
sudo journalctl --since today

# 查看指定时间范围的日志
sudo journalctl --since "2024-01-01 00:00:00" --until "2024-01-02 00:00:00"

# 查看启动相关日志
sudo journalctl -b

# 查看内核日志
sudo journalctl -k

9.3 传统日志文件

# 系统通用日志
sudo tail -f /var/log/syslog          # Ubuntu / Debian
sudo tail -f /var/log/messages        # CentOS / Rocky Linux

# 认证日志(登录、sudo 等)
sudo tail -f /var/log/auth.log        # Ubuntu / Debian
sudo tail -f /var/log/secure          # CentOS / Rocky Linux

# Nginx 日志
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log

# 内核日志
sudo dmesg | tail -50

# 定时任务日志
sudo tail -f /var/log/cron

9.4 日志分析常用命令

# 统计 Nginx 访问量前 10 的 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# 统计 HTTP 状态码分布
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

# 查找 404 错误的请求
awk '$9 == 404 {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

# 查找某天的错误日志
grep "2024-01-15" /var/log/nginx/error.log

# 实时统计每秒请求数
sudo tail -f /var/log/nginx/access.log | pv -l -i 2 -r > /dev/null

9.5 logrotate 日志轮转

Linux 使用 logrotate 自动管理日志文件的轮转和压缩,防止单个日志文件过大。

# 查看 Nginx 的 logrotate 配置
cat /etc/logrotate.d/nginx

# 手动测试 logrotate
sudo logrotate -d /etc/logrotate.d/nginx

# 强制执行轮转
sudo logrotate -f /etc/logrotate.d/nginx

自定义 logrotate 配置示例:

/var/log/nginx/*.log {
    daily               # 每天轮转
    missingok           # 日志不存在时不报错
    rotate 30           # 保留 30 天
    compress            # 压缩旧日志
    delaycompress       # 延迟一天压缩
    notifempty          # 空日志不轮转
    create 0640 www-data adm  # 创建新日志文件的权限
    sharedscripts       # 所有日志轮转后只执行一次脚本
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

10. 定时任务

10.1 什么是 Cron?

Cron 是 Linux 系统的定时任务调度器。你可以用它来定期执行脚本、备份数据、清理临时文件等。

10.2 Cron 表达式

┌───────────── 分钟 (0-59)
│ ┌───────────── 小时 (0-23)
│ │ ┌───────────── 日 (1-31)
│ │ │ ┌───────────── 月 (1-12)
│ │ │ │ ┌───────────── 星期几 (0-7, 0和7都是周日)
│ │ │ │ │
* * * * * 要执行的命令

常用示例:

# 每分钟执行
* * * * * /path/to/script.sh

# 每小时执行
0 * * * * /path/to/script.sh

# 每天凌晨 3 点执行
0 3 * * * /path/to/script.sh

# 每周一上午 9 点执行
0 9 * * 1 /path/to/script.sh

# 每月 1 号凌晨 0 点执行
0 0 1 * * /path/to/script.sh

# 每 5 分钟执行
*/5 * * * * /path/to/script.sh

# 每天 8 点和 20 点执行
0 8,20 * * * /path/to/script.sh

# 工作日(周一到周五)上午 9 点执行
0 9 * * 1-5 /path/to/script.sh

10.3 管理定时任务

# 编辑当前用户的定时任务
crontab -e

# 查看当前用户的定时任务
crontab -l

# 编辑指定用户的定时任务(需要 root 权限)
sudo crontab -u username -e

# 删除所有定时任务(慎用!)
crontab -r

10.4 实用定时任务示例

# 每天凌晨 2 点备份数据库
0 2 * * * /usr/bin/mysqldump -u root -p'password' mydb > /backup/mydb_$(date +\%Y\%m\%d).sql

# 每天凌晨 3 点清理 30 天前的日志
0 3 * * * find /var/log/myapp -name "*.log" -mtime +30 -delete

# 每小时检查磁盘空间,低于 10% 时发邮件告警
0 * * * * df -h / | awk 'NR==2 {gsub(/%/,"",$5); if($5>90) print "磁盘使用率警告: "$5"%"}' | mail -s "磁盘告警" admin@example.com

# 每周日凌晨 4 点备份网站文件
0 4 * * 0 tar -czf /backup/mysite_$(date +\%Y\%m\%d).tar.gz /var/www/mysite

# 每 5 分钟检查服务是否运行,挂了就重启
*/5 * * * * systemctl is-active nginx || systemctl restart nginx

10.5 Systemd Timer(现代替代方案)

Systemd Timer 是 Cron 的现代替代品,功能更强大:

# 创建定时器单元文件
sudo vim /etc/systemd/system/backup.timer
[Unit]
Description=Daily Backup Timer

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true

[Install]
WantedBy=timers.target
# 创建对应的服务单元文件
sudo vim /etc/systemd/system/backup.service
[Unit]
Description=Daily Backup Service

[Service]
Type=oneshot
ExecStart=/opt/scripts/backup.sh
# 启用定时器
sudo systemctl enable backup.timer
sudo systemctl start backup.timer

# 查看定时器状态
sudo systemctl list-timers

11. 监控告警

11.1 系统资源监控

使用 htop 交互式监控

# 安装 htop
sudo apt install htop    # Ubuntu / Debian
sudo dnf install htop    # CentOS / Rocky Linux

# 运行
htop

htop 快捷键:

  • F1:帮助
  • F2:设置
  • F3:搜索进程
  • F4:过滤进程
  • F5:树形视图
  • F6:排序
  • F9:杀死进程
  • F10:退出

常用系统监控命令

# 查看内存使用
free -h

# 查看磁盘使用
df -h

# 查看磁盘 IO
iostat -x 1

# 查看网络连接
ss -tlnp

# 查看系统负载
uptime

# 查看 CPU 信息
lscpu

# 查看系统进程(按 CPU 使用率排序)
ps aux --sort=-%cpu | head -20

# 查看系统进程(按内存使用率排序)
ps aux --sort=-%mem | head -20

# 实时监控网络流量
iftop    # 需要安装: sudo apt install iftop

# 查看网络带宽
nload    # 需要安装: sudo apt install nload

11.2 简单的 Shell 监控脚本

创建一个基本的系统监控脚本:

sudo vim /opt/scripts/server-monitor.sh
#!/bin/bash
# 服务器监控脚本

ALERT_EMAIL="admin@example.com"
HOSTNAME=$(hostname)

# 获取系统信息
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
MEM_USAGE=$(free | awk '/Mem/{printf("%.1f"), $3/$2*100}')
DISK_USAGE=$(df -h / | awk 'NR==2{print $5}' | tr -d '%')
LOAD_AVG=$(uptime | awk -F'load average:' '{print $2}' | tr -d ' ')

# 检查 CPU 使用率
if (( $(echo "$CPU_USAGE > 90" | bc -l) )); then
    echo "[$HOSTNAME] CPU 使用率告警: ${CPU_USAGE}%" | mail -s "CPU 告警" $ALERT_EMAIL
fi

# 检查内存使用率
if (( $(echo "$MEM_USAGE > 90" | bc -l) )); then
    echo "[$HOSTNAME] 内存使用率告警: ${MEM_USAGE}%" | mail -s "内存告警" $ALERT_EMAIL
fi

# 检查磁盘使用率
if [ "$DISK_USAGE" -gt 90 ]; then
    echo "[$HOSTNAME] 磁盘使用率告警: ${DISK_USAGE}%" | mail -s "磁盘告警" $ALERT_EMAIL
fi

# 记录到日志
echo "$(date '+%Y-%m-%d %H:%M:%S') | CPU: ${CPU_USAGE}% | MEM: ${MEM_USAGE}% | DISK: ${DISK_USAGE}% | LOAD: ${LOAD_AVG}" >> /var/log/server-monitor.log
# 设置执行权限
sudo chmod +x /opt/scripts/server-monitor.sh

# 添加到定时任务(每 5 分钟执行一次)
echo "*/5 * * * * /opt/scripts/server-monitor.sh" | sudo crontab -

11.3 使用 Netdata 进行实时监控(推荐)

Netdata 是一款开源的实时性能监控工具,安装简单,界面美观。

# 一键安装
bash <(curl -Ss https://my-netdata.io/kickstart.sh)

# 安装完成后,访问 http://你的服务器IP:19999

Netdata 提供:

  • CPU、内存、磁盘、网络的实时图表
  • 进程监控
  • 系统告警
  • 历史数据回溯

11.4 使用 Uptime Kuma 监控服务可用性

Uptime Kuma 是一个开源的服务可用性监控工具,支持多种通知方式。

# 需要先安装 Docker
# 然后运行 Uptime Kuma
docker run -d \
  --restart=always \
  -p 3001:3001 \
  -v uptime-kuma:/app/data \
  --name uptime-kuma \
  louislam/uptime-kuma

安装完成后访问 http://你的服务器IP:3001 进行配置。

11.5 告警通知方式

常见的告警通知渠道:

  • 邮件:使用 mail 命令或 msmtp
  • Telegram Bot:通过 Telegram API 发送消息
  • 企业微信 / 钉钉 / 飞书:通过 Webhook 发送告警
  • Slack:通过 Webhook 发送消息

钉钉 Webhook 告警示例:

#!/bin/bash
WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=你的token"

curl -s -H 'Content-Type: application/json' \
  -d '{
    "msgtype": "text",
    "text": {
      "content": "⚠️ 服务器告警: '"$1'"
    }
  }' "$WEBHOOK_URL"

12. 实战项目:从零部署一个网站

现在,让我们把前面学到的所有知识串联起来,完成一个完整的实战项目:从零开始部署一个网站,直到通过 HTTPS 正常访问。

12.1 项目架构

用户浏览器
    ↓ (HTTPS)
Nginx (反向代理 + SSL)
    ↓
Node.js 应用 (端口 3000)
    ↓
SQLite 数据库

12.2 第一步:服务器初始化

# 连接服务器
ssh root@123.45.67.89

# 更新系统
apt update && apt upgrade -y

# 设置时区
timedatectl set-timezone Asia/Shanghai

# 创建部署用户
adduser deploy
usermod -aG sudo deploy

# 配置 SSH 密钥(在本地执行)
ssh-copy-id deploy@123.45.67.89

# 安装常用工具
apt install -y vim curl wget htop git unzip

12.3 第二步:配置防火墙

# 切换到 deploy 用户
su - deploy

# 配置防火墙
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

# 查看防火墙状态
sudo ufw status

12.4 第三步:安装运行环境

# 安装 Node.js(使用 NodeSource)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs

# 验证安装
node -v
npm -v

# 安装 Nginx
sudo apt install -y nginx

# 启动 Nginx
sudo systemctl start nginx
sudo systemctl enable nginx

12.5 第四步:部署应用代码

# 创建项目目录
sudo mkdir -p /var/www/myapp
sudo chown -R deploy:deploy /var/www/myapp

# 进入项目目录
cd /var/www/myapp

# 初始化项目
npm init -y

# 安装 Express
npm install express

创建应用文件:

cat > /var/www/myapp/app.js << 'APPEOF'
const express = require('express');
const path = require('path');
const app = express();
const PORT = 3000;

// 静态文件
app.use(express.static(path.join(__dirname, 'public')));

// 首页路由
app.get('/', (req, res) => {
    res.send(`
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>我的网站</title>
        <style>
            * { margin: 0; padding: 0; box-sizing: border-box; }
            body {
                font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
                background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                min-height: 100vh;
                display: flex;
                align-items: center;
                justify-content: center;
            }
            .card {
                background: white;
                border-radius: 20px;
                padding: 60px 40px;
                text-align: center;
                box-shadow: 0 20px 60px rgba(0,0,0,0.3);
                max-width: 500px;
            }
            h1 { font-size: 2em; margin-bottom: 20px; color: #333; }
            p { font-size: 1.1em; color: #666; line-height: 1.6; }
            .emoji { font-size: 4em; margin-bottom: 20px; }
        </style>
    </head>
    <body>
        <div class="card">
            <div class="emoji">🚀</div>
            <h1>网站部署成功!</h1>
            <p>恭喜你完成了 Linux 服务器运维的实战项目!<br>
            这个网站运行在 Nginx + Node.js 架构上。</p>
        </div>
    </body>
    </html>
    `);
});

// API 示例
app.get('/api/info', (req, res) => {
    res.json({
        status: 'ok',
        server: process.env.HOSTNAME || 'unknown',
        uptime: process.uptime(),
        timestamp: new Date().toISOString()
    });
});

app.listen(PORT, '127.0.0.1', () => {
    console.log(`应用运行在 http://127.0.0.1:${PORT}`);
});
APPEOF

12.6 第五步:使用 PM2 管理进程

PM2 是 Node.js 的进程管理器,可以让应用在后台持续运行,并在崩溃时自动重启。

# 全局安装 PM2
sudo npm install -g pm2

# 启动应用
cd /var/www/myapp
pm2 start app.js --name myapp

# 查看进程状态
pm2 status

# 查看日志
pm2 logs myapp

# 设置开机自启
pm2 startup
pm2 save

12.7 第六步:配置 Nginx 反向代理

sudo vim /etc/nginx/sites-available/myapp
server {
    listen 80;
    server_name example.com www.example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        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;
    }

    # 静态文件直接由 Nginx 处理
    location /static/ {
        alias /var/www/myapp/public/;
        expires 30d;
    }

    access_log /var/log/nginx/myapp.access.log;
    error_log /var/log/nginx/myapp.error.log;
}
# 启用站点
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/

# 删除默认站点(可选)
sudo rm /etc/nginx/sites-enabled/default

# 测试并重载
sudo nginx -t
sudo systemctl reload nginx

12.8 第七步:配置域名解析

在你的域名注册商控制台中添加:

记录类型 主机记录 记录值
A @ 123.45.67.89
A www 123.45.67.89

12.9 第八步:配置 SSL 证书

# 安装 Certbot
sudo apt install -y certbot python3-certbot-nginx

# 申请证书
sudo certbot --nginx -d example.com -d www.example.com

# 验证自动续期
sudo certbot renew --dry-run

12.10 第九步:配置日志和监控

# 创建日志目录
sudo mkdir -p /var/log/myapp
sudo chown deploy:deploy /var/log/myapp

# PM2 日志轮转
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30
pm2 set pm2-logrotate:compress true

# 配置系统监控脚本(参考第 11 章)
sudo vim /opt/scripts/server-monitor.sh
sudo chmod +x /opt/scripts/server-monitor.sh

# 添加定时任务
crontab -e
# 添加以下内容:
# */5 * * * * /opt/scripts/server-monitor.sh

12.11 第十步:设置自动备份

sudo vim /opt/scripts/backup.sh
#!/bin/bash
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d_%H%M%S)

# 创建备份目录
mkdir -p $BACKUP_DIR

# 备份网站文件
tar -czf $BACKUP_DIR/mysite_$DATE.tar.gz /var/www/myapp

# 备份 Nginx 配置
tar -czf $BACKUP_DIR/nginx_$DATE.tar.gz /etc/nginx

# 删除 30 天前的备份
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete

echo "[$(date)] 备份完成: $DATE" >> /var/log/backup.log
sudo chmod +x /opt/scripts/backup.sh

# 添加定时任务(每天凌晨 3 点备份)
sudo crontab -e
# 添加:0 3 * * * /opt/scripts/backup.sh

12.12 验收清单

完成以上所有步骤后,检查以下项目:

  • 通过 https://example.com 能正常访问网站
  • HTTP 自动跳转到 HTTPS
  • SSL 证书有效(浏览器显示锁图标)
  • pm2 status 显示应用正在运行
  • sudo systemctl status nginx 显示 Nginx 正常运行
  • sudo ufw status 显示防火墙已启用
  • 日志正常记录
  • 备份定时任务已配置
  • 监控脚本已运行

附录:常用运维速查表

服务管理

# 启动 / 停止 / 重启 / 查看状态
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl status nginx

# 开机自启
sudo systemctl enable nginx
sudo systemctl disable nginx

# 查看所有运行中的服务
systemctl list-units --type=service --state=running

文件操作

# 查看文件内容
cat file.txt          # 全部输出
less file.txt         # 分页查看(按 q 退出)
head -20 file.txt     # 查看前 20 行
tail -20 file.txt     # 查看后 20 行
tail -f file.txt      # 实时跟踪

# 查找文件
find / -name "*.log" -mtime -7    # 查找 7 天内修改的 .log 文件
find /var -size +100M             # 查找 /var 下大于 100M 的文件

# 搜索文件内容
grep -r "error" /var/log/         # 递归搜索
grep -i "error" file.txt          # 忽略大小写

网络调试

# 查看端口占用
sudo ss -tlnp
sudo lsof -i :80

# 测试网络连通性
ping example.com
traceroute example.com

# 测试端口连通性
nc -zv 123.45.67.89 80
curl -I http://example.com

# 查看网络接口
ip addr show
ip route show

性能分析

# CPU 和内存概览
top -bn1 | head -20
free -h
vmstat 1 5

# 磁盘性能
iostat -x 1 5
iotop    # 需要安装

# 进程资源使用
ps aux --sort=-%cpu | head -10
ps aux --sort=-%mem | head -10

结语

恭喜你完成了 Linux 服务器运维入门教程的学习!让我们回顾一下你已经掌握的技能:

  1. ✅ 服务器选购和基本概念
  2. ✅ SSH 安全连接和密钥认证
  3. ✅ 系统初始化和安全加固
  4. ✅ 用户管理和权限控制
  5. ✅ 防火墙配置和网络安全
  6. ✅ Nginx Web 服务器配置
  7. ✅ 域名解析和 DNS 管理
  8. ✅ SSL 证书和 HTTPS 配置
  9. ✅ 日志管理和分析
  10. ✅ 定时任务和自动化
  11. ✅ 系统监控和告警
  12. ✅ 完整的网站部署实战

下一步学习建议:

  • Docker 容器化:学习 Docker 和 Docker Compose,让部署更简单
  • 数据库管理:学习 MySQL / PostgreSQL 的安装、配置和备份
  • CI/CD 持续集成:学习 GitHub Actions 或 GitLab CI 自动化部署
  • Ansible 自动化:学习用 Ansible 批量管理多台服务器
  • Kubernetes:学习容器编排,管理大规模应用

运维是一个需要不断实践的领域。建议你在学习过程中多动手操作,遇到问题善用搜索引擎和官方文档。每一次排查故障的经历,都会让你变得更加熟练。

祝你在 Linux 运维的道路上越走越远!🚀

内容声明

本文内容为AI技术学习教程,仅供学习参考。如涉及技术问题,欢迎通过 xurj005@163.com 与我们交流。

目录