Rocky-Linux完整Web服务部署指南

Rocky Linux 10 完整Web服务部署指南

基于实际部署经验编写 - 记录从系统准备到运维管理的完整流程

🎯 部署概述

本文档基于在 Rocky Linux 10 系统上部署 itopic.go 博客项目的实际经验,涵盖从基础环境搭建到SSL证书自动续期的完整部署流程。

部署架构

用户访问 → Nginx (HTTPS/443) → 反向代理 → Go应用 (HTTP/8001)
                    ↓
              Let's Encrypt SSL证书
                    ↓
              自动续期系统

实际部署成果

🖥️ 系统环境

基础信息

前置条件检查

# 查看系统版本
cat /etc/os-release

# 检查网络连通性
ping -c 4 8.8.8.8

# 查看可用端口
netstat -tlnp | grep :80
netstat -tlnp | grep :443

📦 第一部分:Go 环境搭建

1.1 检查Go版本

# 查看系统提供的Go版本
dnf list available | grep golang

输出示例:

golang.x86_64                          1.25.7-1.el10_1                    appstream
golang-bin.x86_64                      1.25.7-1.el10_1                    appstream
golang-docs.noarch                     1.25.7-1.el10_1                    appstream

1.2 安装Go环境

# 安装Go开发环境(推荐系统版本)
dnf install -y golang

# 验证安装
go version

输出示例:

go version go1.25.7 (Red Hat 1.25.7-1.el10_1) linux/amd64

1.3 配置Go环境

# 查看Go环境配置
go env

# 创建Go工作目录(可选)
mkdir -p ~/go/{bin,pkg,src}

# 设置环境变量(可选)
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.bashrc
source ~/.bashrc

🚀 第二部分:项目部署

2.1 创建项目目录

# 创建数据目录
mkdir -p /data

# 设置目录权限
chmod 755 /data

2.2 克隆项目

# 克隆itopic.go项目
cd /data && git clone https://github.com/pengbotao/itopic.go

# 进入项目目录
cd /data/itopic.go

# 查看项目结构
ls -la

2.3 编译项目

# 整理依赖
go mod tidy

# 编译项目
go build -o itopic main.go

# 验证编译结果
ls -la itopic

输出示例:

-rwxr-xr-x 1 root root 12709584 Mar  7 13:39 itopic

2.4 创建服务管理脚本

# 创建日志目录
mkdir -p /data/logs

# 创建服务脚本
cat > /data/scripts/itopic-service.sh << 'EOF'
#!/bin/bash

SERVICE_NAME="itopic"
SERVICE_PATH="/data/itopic.go"
LOG_PATH="/data/logs/itopic.log"
PID_FILE="/data/logs/itopic.pid"

case "$1" in
    start)
        echo "启动 $SERVICE_NAME 服务..."
        if [ -f $PID_FILE ]; then
            PID=$(cat $PID_FILE)
            if ps -p $PID > /dev/null 2>&1; then
                echo "$SERVICE_NAME 已经在运行 (PID: $PID)"
                exit 1
            else
                rm -f $PID_FILE
            fi
        fi
        
        cd $SERVICE_PATH
        nohup ./itopic -debug > $LOG_PATH 2>&1 &
        echo $! > $PID_FILE
        echo "$SERVICE_NAME 启动成功 (PID: $(cat $PID_FILE))"
        ;;
    
    stop)
        echo "停止 $SERVICE_NAME 服务..."
        if [ -f $PID_FILE ]; then
            PID=$(cat $PID_FILE)
            if ps -p $PID > /dev/null 2>&1; then
                kill $PID
                sleep 2
                if ps -p $PID > /dev/null 2>&1; then
                    kill -9 $PID
                fi
                rm -f $PID_FILE
                echo "$SERVICE_NAME 已停止"
            else
                echo "$SERVICE_NAME 没有运行"
                rm -f $PID_FILE
            fi
        else
            echo "$SERVICE_NAME 没有运行"
        fi
        ;;
    
    restart)
        echo "重启 $SERVICE_NAME 服务..."
        $0 stop
        sleep 2
        $0 start
        ;;
    
    status)
        if [ -f $PID_FILE ]; then
            PID=$(cat $PID_FILE)
            if ps -p $PID > /dev/null 2>&1; then
                echo "$SERVICE_NAME 正在运行 (PID: $PID)"
                echo "日志文件: $LOG_PATH"
                echo "服务路径: $SERVICE_PATH"
            else
                echo "$SERVICE_NAME 没有运行 (PID文件存在但进程不存在)"
                rm -f $PID_FILE
            fi
        else
            echo "$SERVICE_NAME 没有运行"
        fi
        ;;
    
    logs)
        echo "查看 $SERVICE_NAME 日志 (最后50行):"
        if [ -f $LOG_PATH ]; then
            tail -50 $LOG_PATH
        else
            echo "日志文件不存在: $LOG_PATH"
        fi
        ;;
    
    follow)
        echo "实时跟踪 $SERVICE_NAME 日志 (Ctrl+C 退出):"
        if [ -f $LOG_PATH ]; then
            tail -f $LOG_PATH
        else
            echo "日志文件不存在: $LOG_PATH"
        fi
        ;;
    
    *)
        echo "用法: $0 {start|stop|restart|status|logs|follow}"
        exit 1
        ;;
esac
EOF

# 设置执行权限
chmod +x /data/scripts/itopic-service.sh
mkdir -p /data/scripts

2.5 启动服务

# 启动Go服务
/data/scripts/itopic-service.sh start

# 验证服务状态
/data/scripts/itopic-service.sh status

# 测试本地访问
curl -s http://127.0.0.1:8001 | head -5

🌐 第三部分:Nginx安装配置

3.1 安装Nginx

# 安装Nginx
dnf install -y nginx

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

# 检查服务状态
systemctl status nginx

3.2 安装SSL证书工具

# 安装EPEL源
dnf install -y epel-release

# 安装Certbot
dnf install -y certbot python3-certbot-nginx

3.3 域名解析验证

# 检查服务器公网IP
curl -s http://ifconfig.me

# 检查域名解析
nslookup itopic.cn
nslookup www.itopic.cn

3.4 获取SSL证书

# 停止Nginx(使用standalone模式)
systemctl stop nginx

# 获取SSL证书
certbot certonly --standalone \
    -d itopic.cn -d www.itopic.cn \
    --email admin@itopic.cn \
    --agree-tos --no-eff-email --non-interactive

成功输出示例:

Account registered.
Requesting a certificate for itopic.cn and www.itopic.cn
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/itopic.cn/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/itopic.cn/privkey.pem

3.5 配置Nginx

# 创建站点配置文件
cat > /etc/nginx/conf.d/itopic.cn.conf << 'EOF'
# HTTP重定向到HTTPS
server {
    listen 80;
    server_name itopic.cn www.itopic.cn;
    return 301 https://$server_name$request_uri;
}

# HTTPS配置
server {
    listen 443 ssl http2;
    server_name itopic.cn www.itopic.cn;
    
    # SSL证书配置
    ssl_certificate /etc/letsencrypt/live/itopic.cn/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/itopic.cn/privkey.pem;
    
    # SSL安全配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    
    # 安全头部
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    
    # 反向代理到Go应用
    location / {
        proxy_pass http://127.0.0.1:8001;
        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;
        
        # WebSocket支持(如果需要)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
EOF

3.6 启动Nginx

# 测试配置文件
/usr/sbin/nginx -t

# 启动Nginx
systemctl start nginx

# 检查服务状态
systemctl status nginx

🔄 第四部分:SSL证书自动续期

4.1 证书状态检查

# 查看当前证书状态
certbot certificates

输出示例:

Found the following certs:
  Certificate Name: itopic.cn
    Serial Number: 5f01311ef12749ac87ffb75bbba39e55526
    Key Type: ECDSA
    Domains: itopic.cn www.itopic.cn
    Expiry Date: 2026-06-05 04:46:06+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/itopic.cn/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/itopic.cn/privkey.pem

4.2 配置自动续期

# 添加定时任务(每天中午12点检查)
echo "0 12 * * * /usr/bin/certbot renew --quiet" | crontab -

# 查看定时任务
crontab -l

# 测试续期流程
certbot renew --dry-run

4.3 高级续期配置

# 创建续期通知脚本
cat > /usr/local/bin/ssl-renewal-notify.sh << 'EOF'
#!/bin/bash
if [ "$1" = "renew" ]; then
    echo "$(date): SSL证书续期完成" >> /var/log/ssl-renewal.log
    # 可以在这里添加邮件或webhook通知
fi
EOF

chmod +x /usr/local/bin/ssl-renewal-notify.sh

# 更新定时任务,包含通知
echo "0 12 * * * /usr/bin/certbot renew --quiet --post-hook '/usr/local/bin/ssl-renewal-notify.sh renew'" | crontab -

4.4 证书有效期监控

# 创建监控脚本
cat > /usr/local/bin/check-ssl-expiry.sh << 'EOF'
#!/bin/bash
DOMAIN="itopic.cn"
EXPIRY_DATE=$(echo | openssl s_client -connect $DOMAIN:443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$EXPIRY_DATE" +%s)
CURRENT_EPOCH=$(date +%s)
DAYS_LEFT=$(( ($EXPIRY_EPOCH - $CURRENT_EPOCH) / 86400 ))

if [ $DAYS_LEFT -lt 30 ]; then
    echo "警告:SSL证书将在 $DAYS_LEFT 天后过期"
    # 可以在这里添加告警逻辑
fi
EOF

chmod +x /usr/local/bin/check-ssl-expiry.sh

# 添加每周检查任务
echo "0 9 * * 1 /usr/local/bin/check-ssl-expiry.sh" | crontab -

✅ 第五部分:部署验证

5.1 服务状态检查

# 检查Go应用
/data/scripts/itopic-service.sh status

# 检查Nginx
systemctl status nginx

# 检查端口监听
netstat -tlnp | grep -E ":80|:443|:8001"

5.2 HTTP访问测试

# 测试HTTP重定向
curl -I http://itopic.cn

# 测试HTTPS访问
curl -I https://itopic.cn

# 测试内容访问
curl -s https://itopic.cn | head -10

预期HTTPS响应头:

HTTP/2 200
server: nginx/1.26.3
content-type: text/html; charset=UTF-8
x-frame-options: DENY
x-content-type-options: nosniff
x-xss-protection: 1; mode=block
strict-transport-security: max-age=31536000; includeSubDomains

5.3 SSL证书验证

# 检查证书详情
echo | openssl s_client -connect itopic.cn:443 2>/dev/null | openssl x509 -noout -dates

# 检查证书链
echo | openssl s_client -connect itopic.cn:443 2>/dev/null | openssl verify

🛠️ 第六部分:日常运维管理

6.1 服务管理命令速查

# Go应用管理
/data/scripts/itopic-service.sh {start|stop|restart|status|logs|follow}

# Nginx管理
systemctl {start|stop|restart|reload|status} nginx

# SSL证书管理
certbot {certificates|renew|revoke}

6.2 日志管理

# Go应用日志
tail -f /data/logs/itopic.log

# Nginx访问日志
tail -f /var/log/nginx/access.log

# Nginx错误日志
tail -f /var/log/nginx/error.log

# SSL证书日志
tail -f /var/log/letsencrypt/letsencrypt.log

6.3 性能监控

# 查看进程资源使用
ps aux | grep -E "(itopic|nginx)"

# 查看内存使用
free -h

# 查看磁盘使用
df -h

# 查看网络连接
ss -tuln

6.4 定期维护任务

# 清理旧日志(保留7天)
find /data/logs -name "*.log" -mtime +7 -delete

# 检查证书有效期
/usr/local/bin/check-ssl-expiry.sh

# 备份配置文件
tar -czf /backup/nginx-config-$(date +%Y%m%d).tar.gz /etc/nginx/
tar -czf /backup/ssl-config-$(date +%Y%m%d).tar.gz /etc/letsencrypt/

🔧 第七部分:故障排除

7.1 常见问题诊断

问题1:服务无法启动

# 检查端口占用
netstat -tlnp | grep :8001

# 检查进程状态
ps aux | grep itopic

# 查看错误日志
/data/scripts/itopic-service.sh logs

问题2:Nginx 502错误

# 检查Go应用是否运行
curl -I http://127.0.0.1:8001

# 检查Nginx配置
/usr/sbin/nginx -t

# 查看Nginx错误日志
tail -20 /var/log/nginx/error.log

问题3:SSL证书问题

# 检查证书状态
certbot certificates

# 手动续期测试
certbot renew --dry-run --verbose

# 检查域名解析
nslookup itopic.cn

问题4:性能问题

# 查看系统负载
uptime

# 检查网络连接数
ss -s

# 查看磁盘IO
iostat -x 1

7.2 紧急恢复流程

Go应用恢复

# 停止异常进程
pkill -f itopic

# 清理PID文件
rm -f /data/logs/itopic.pid

# 重新启动服务
/data/scripts/itopic-service.sh start

Nginx配置恢复

# 备份当前配置
cp /etc/nginx/conf.d/itopic.cn.conf /etc/nginx/conf.d/itopic.cn.conf.backup

# 使用备份配置
cp /backup/nginx-config-YYYYMMDD.tar.gz /tmp/
tar -xzf /tmp/nginx-config-YYYYMMDD.tar.gz -C /

# 重新加载配置
systemctl reload nginx

📊 第八部分:安全加固

8.1 防火墙配置

# 查看防火墙状态
systemctl status firewalld

# 开放HTTP和HTTPS端口
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

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

8.2 系统更新

# 更新系统包
dnf update -y

# 安全更新
dnf update --security

8.3 访问控制

# 限制SSH访问(可选)
echo "sshd: 192.168.1.0/24" >> /etc/hosts.allow
echo "sshd: ALL" >> /etc/hosts.deny

# 配置fail2ban(可选)
dnf install -y fail2ban
systemctl enable --now fail2ban

📁 第九部分:文件路径参考

配置文件位置

文件类型 路径 说明
Go应用 /data/itopic.go/ 博客应用主目录
服务脚本 /data/scripts/itopic-service.sh 服务管理脚本
应用日志 /data/logs/itopic.log Go应用运行日志
Nginx配置 /etc/nginx/conf.d/itopic.cn.conf 站点配置文件
SSL证书 /etc/letsencrypt/live/itopic.cn/ SSL证书文件
定时任务 crontab 证书自动续期
Nginx日志 /var/log/nginx/ Nginx访问和错误日志

重要目录

/data/                    # 应用数据目录
/data/itopic.go/         # Go项目
/data/logs/              # 应用日志
/data/scripts/           # 管理脚本
/etc/nginx/              # Nginx配置
/etc/letsencrypt/        # SSL证书
/var/log/               # 系统日志

🎯 第十部分:部署总结

部署成果

性能指标

运维成本

最佳实践

  1. 监控优先: 建立完善的监控和告警机制
  2. 自动化: 脚本化所有重复性操作
  3. 文档化: 记录所有配置和操作
  4. 备份: 定期备份重要配置和数据
  5. 安全: 持续关注安全更新和漏洞

📚 相关资源

官方文档

工具参考

学习资源


部署完成时间: 2026年3月7日
文档版本: v1.0
基于实际部署经验: Rocky Linux 10 + Go 1.25.7 + Nginx 1.26.3 + Let’s Encrypt

🎊 通过本指南,你可以成功部署一个完整、安全、自动化的Web服务系统!

-- EOF --
最后更新于: 2026-03-22 08:58
发表于: 2026-03-07 20:27
标签: Linux Go Nginx SSL 自动续期 Web部署 运维