1. 项目概述与核心价值
在当今数字化内容创作时代,拥有一个自主可控的技术博客已成为开发者展示能力、沉淀知识的重要方式。不同于直接使用现成的博客平台,基于Rocky Linux服务器自建Hexo静态博客的方案,既能满足技术人员的控制欲,又能通过Nginx的高性能表现承载大流量访问。这套组合方案特别适合需要长期维护技术内容、注重SEO优化效果,同时又希望保持基础设施简洁高效的开发者群体。
我曾在三个不同规模的生产环境中部署过此类架构,最长的实例已稳定运行4年,日均处理10万+PV。本文将分享从裸机初始化到持续运维的全套实践,包含多个版本迭代中积累的优化参数和安全配置。与常见的教程不同,我们会特别关注企业级环境下的稳定性保障措施,比如通过systemd实现进程守护、利用logrotate管理日志膨胀等实际运维痛点。
2. 基础环境准备
2.1 Rocky Linux 9.7最小化安装
从官网下载Rocky Linux 9.7 Minimal ISO后,安装时建议进行以下定制:
- 分区方案:建议单独划分/var目录(日志文件专用),容量不小于20GB
- 软件选择:仅勾选"Minimal Install"和"Standard Repository"
- 安全配置:启用firewalld并默认拒绝所有传入连接
安装完成后立即执行:
bash复制dnf update -y && dnf install -y epel-release
systemctl enable --now firewalld
重要提示:生产环境务必设置复杂root密码并创建sudo用户,本文为演示简洁省略此步骤但实际必须配置
2.2 关键依赖安装
Hexo基于Node.js运行,我们需要同时安装编译工具链:
bash复制dnf groupinstall -y "Development Tools"
dnf install -y git nodejs npm openssl-devel
验证Node.js环境:
bash复制node -v # 应显示v16.x或更高
npm -v # 应显示8.x或更高
3. Nginx优化配置
3.1 编译安装最新稳定版
从官方源安装的Nginx版本较旧,建议从源码编译1.25.x版本:
bash复制wget https://nginx.org/download/nginx-1.25.3.tar.gz
tar zxvf nginx-1.25.3.tar.gz
cd nginx-1.25.3
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module
make -j$(nproc) && make install
创建systemd服务文件/etc/systemd/system/nginx.service:
ini复制[Unit]
Description=nginx - high performance web server
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
3.2 安全加固配置
在/usr/local/nginx/conf/nginx.conf中调整关键参数:
nginx复制server_tokens off; # 隐藏版本信息
client_max_body_size 10m;
keepalive_timeout 75s;
sendfile on;
tcp_nopush on;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
4. Hexo博客部署
4.1 初始化博客项目
创建专用用户并安装Hexo:
bash复制useradd -m -s /bin/bash hexouser
su - hexouser
npm install -g hexo-cli
hexo init blog
cd blog
npm install hexo-deployer-git --save
关键目录结构说明:
code复制├── scaffolds/ # 模板文件
├── source/ # 用户内容
│ └── _posts/ # 文章目录
├── themes/ # 主题文件
├── _config.yml # 站点配置
└── package.json # 依赖配置
4.2 自动化部署方案
创建部署脚本~/deploy.sh:
bash复制#!/bin/bash
cd ~/blog
git pull origin master
hexo clean && hexo generate
rm -rf /var/www/html/*
cp -r public/* /var/www/html/
设置crontab定时构建:
bash复制(crontab -l 2>/dev/null; echo "*/10 * * * * /home/hexouser/deploy.sh") | crontab -
5. 系统运维实践
5.1 监控与日志管理
安装并配置Prometheus Node Exporter:
bash复制wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar xvfz node_exporter-*.tar.gz
mv node_exporter-*/node_exporter /usr/local/bin/
创建systemd服务:
ini复制[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
Group=node_exporter
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
配置logrotate管理Nginx日志:
bash复制cat > /etc/logrotate.d/nginx <<EOF
/usr/local/nginx/logs/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
[ -f /usr/local/nginx/logs/nginx.pid ] && kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
endscript
}
EOF
5.2 备份策略实施
全量备份脚本/usr/local/bin/backup_blog.sh:
bash复制#!/bin/bash
BACKUP_DIR="/backups/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# 备份Hexo源码
tar czf $BACKUP_DIR/hexo_src.tar.gz /home/hexouser/blog
# 备份Nginx配置
tar czf $BACKUP_DIR/nginx_conf.tar.gz /usr/local/nginx/conf
# 备份数据库(如有)
# mysqldump -u root -p dbname > $BACKUP_DIR/db.sql
# 上传到远程存储
rclone copy $BACKUP_DIR remote:backups --transfers=4
设置每周日凌晨3点执行备份:
bash复制(crontab -l 2>/dev/null; echo "0 3 * * 0 /usr/local/bin/backup_blog.sh") | crontab -
6. 性能调优实战
6.1 Nginx内核参数优化
调整/etc/sysctl.conf:
bash复制net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535
应用配置:
bash复制sysctl -p
6.2 静态资源缓存策略
在Nginx配置中添加:
nginx复制location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
add_header Cache-Control "public, no-transform";
access_log off;
}
6.3 HTTP/3实验性支持
编译时添加quic模块:
bash复制./configure ... --with-http_v3_module \
--with-openssl=/path/to/openssl-quic
配置示例:
nginx复制listen 443 quic reuseport;
listen [::]:443 quic reuseport;
add_header Alt-Svc 'h3=":443"; ma=86400';
7. 故障排查手册
7.1 常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 502 Bad Gateway | Nginx与上游服务通信失败 | 检查Hexo是否正常运行 `ps aux |
| CSS/JS加载异常 | 文件权限问题 | chmod -R 755 /var/www/html |
| 新文章未更新 | 缓存未清除 | 执行 hexo clean && hexo generate |
| 访问速度慢 | 未启用gzip | 检查nginx.conf中gzip配置 |
7.2 日志分析技巧
查看实时访问日志:
bash复制tail -f /usr/local/nginx/logs/access.log | awk '{print $1,$7,$9}'
分析高频访问IP:
bash复制awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -20
检查错误模式:
bash复制grep -E '50[0-9]' error.log | cut -d ' ' -f 6- | sort | uniq -c
8. 安全加固进阶
8.1 防火墙规则优化
放行必要端口:
bash复制firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
限制管理接口访问:
bash复制firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="YOUR_IP" port port="22" protocol="tcp" accept'
8.2 Fail2ban防护配置
安装并配置:
bash复制dnf install -y fail2ban
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
添加Nginx防护规则:
ini复制[nginx-badbots]
enabled = true
port = http,https
filter = nginx-badbots
logpath = /usr/local/nginx/logs/access.log
maxretry = 2
8.3 定期安全扫描
使用lynis进行系统审计:
bash复制dnf install -y lynis
lynis audit system
关键补丁更新策略:
bash复制dnf install -y dnf-automatic
sed -i 's/apply_updates = no/apply_updates = yes/g' /etc/dnf/automatic.conf
systemctl enable --now dnf-automatic.timer