Linux 服务器运维入门教程
面向零基础用户的完整指南——从选购服务器到网站上线,手把手带你掌握 Linux 服务器运维核心技能。
目录
1. 服务器选购
1.1 什么是服务器?
服务器本质上就是一台全年无休运行的远程计算机。你需要通过网络来操作它,而不是像使用个人电脑那样直接面对屏幕和键盘。
1.2 主流云服务商
| 服务商 | 特点 | 适合人群 |
|---|---|---|
| 阿里云 | 国内最大,文档齐全,生态完善 | 国内用户首选 |
| 腾讯云 | 性价比高,学生优惠力度大 | 学生 / 个人开发者 |
| 华为云 | 企业级服务强,政企市场占有率高 | 企业用户 |
| AWS | 全球覆盖,服务种类最多 | 有国际化需求的用户 |
| DigitalOcean | 界面简洁,按小时计费 | 海外项目 / 个人开发者 |
| Vultr | 全球多节点,支持按小时付费和随时销毁 | 需要灵活切换机房的用户 |
1.3 选购建议
操作系统选择: 推荐 Ubuntu 22.04 LTS 或 Debian 12,社区活跃、文档丰富、软件包新。如果你偏好企业级稳定性,也可以选择 CentOS Stream 9 或 Rocky 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-available和sites-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 | 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 防护:
- 注册 Cloudflare 账号
- 添加你的域名
- 将域名的 NS 记录改为 Cloudflare 提供的 Nameserver
- 在 Cloudflare 中配置 DNS 记录
- 开启橙色云朵图标启用 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 会引导你完成以下步骤:
- 输入邮箱地址(用于接收证书到期提醒)
- 同意服务条款
- 选择是否分享邮箱给 EFF(可选)
- 选择 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 服务器运维入门教程的学习!让我们回顾一下你已经掌握的技能:
- ✅ 服务器选购和基本概念
- ✅ SSH 安全连接和密钥认证
- ✅ 系统初始化和安全加固
- ✅ 用户管理和权限控制
- ✅ 防火墙配置和网络安全
- ✅ Nginx Web 服务器配置
- ✅ 域名解析和 DNS 管理
- ✅ SSL 证书和 HTTPS 配置
- ✅ 日志管理和分析
- ✅ 定时任务和自动化
- ✅ 系统监控和告警
- ✅ 完整的网站部署实战
下一步学习建议:
- Docker 容器化:学习 Docker 和 Docker Compose,让部署更简单
- 数据库管理:学习 MySQL / PostgreSQL 的安装、配置和备份
- CI/CD 持续集成:学习 GitHub Actions 或 GitLab CI 自动化部署
- Ansible 自动化:学习用 Ansible 批量管理多台服务器
- Kubernetes:学习容器编排,管理大规模应用
运维是一个需要不断实践的领域。建议你在学习过程中多动手操作,遇到问题善用搜索引擎和官方文档。每一次排查故障的经历,都会让你变得更加熟练。
祝你在 Linux 运维的道路上越走越远!🚀