阿里云轻量应用服务器上构建高可用RSSHub服务的完整指南

在信息过载的时代,RSS依然是最优雅的内容获取方式之一。作为开源项目RSSHub的拥趸,我在阿里云轻量应用服务器上部署了数十个RSSHub实例,经历了从简单运行到生产级稳定的完整进化。本文将分享如何规避Node.js版本陷阱、实现进程守护、完善日志体系,最终打造一个7x24小时可靠运行的RSSHub服务环境。

1. 环境准备与Node.js版本管理

1.1 系统基础配置

阿里云轻量应用服务器默认提供的CentOS或Ubuntu镜像已经足够运行RSSHub,但需要先完成几项基础工作:

# 更新系统软件包
sudo yum update -y  # CentOS
sudo apt update && sudo apt upgrade -y  # Ubuntu

# 安装基础编译工具
sudo yum groupinstall "Development Tools" -y  # CentOS
sudo apt install build-essential -y  # Ubuntu

1.2 Node.js版本管理最佳实践

原始文章中遇到的wanted: {"node":"^10.12.0 || >=12.0.0"} (current: {"node":"4.2.6"})错误,暴露了直接修改系统PATH的风险。更专业的解决方案是使用nvm(Node Version Manager):

# 安装nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

# 加载nvm环境
source ~/.bashrc

# 安装LTS版本的Node.js
nvm install --lts

# 验证版本
node -v  # 应显示v16.x或更高
npm -v

使用nvm的优势在于:

  • 多版本隔离:不同项目可以使用不同Node.js版本
  • 一键切换nvm use <version>即可切换环境
  • 无系统污染:所有安装位于用户目录下

2. RSSHub服务部署优化

2.1 源码获取与依赖安装

不同于简单的git clone,生产环境应该考虑以下优化点:

# 创建专用用户
sudo useradd -m rsshub -s /bin/bash
sudo passwd rsshub

# 切换用户部署
sudo -iu rsshub
git clone https://github.com/DIYgod/RSSHub.git --depth=1
cd RSSHub

# 使用国内镜像加速npm安装
npm config set registry https://registry.npmmirror.com
npm install --production

2.2 配置文件定制

创建config.js进行个性化配置:

module.exports = {
    // 监听所有网络接口
    PORT: 1200,
    HOST: '0.0.0.0',
    
    // 缓存配置
    CACHE_EXPIRE: 3600,
    CACHE_CONTENT_EXPIRE: 86400,
    
    // 请求限制
    REQUEST_RETRY: 3,
    REQUEST_TIMEOUT: 5000
};

3. PM2高级进程管理

3.1 基础进程守护

原始文章中的pm2 start lib/index.js --name rsshub是最基础用法,生产环境需要更完善的配置:

pm2 start lib/index.js --name rsshub \
    --log /var/log/rsshub.log \
    --time \
    --restart-delay 3000 \
    --max-memory-restart 200M

3.2 进阶配置方案

创建ecosystem.config.js实现更精细控制:

module.exports = {
  apps: [{
    name: 'rsshub',
    script: 'lib/index.js',
    instances: 'max',
    exec_mode: 'cluster',
    autorestart: true,
    watch: false,
    max_memory_restart: '300M',
    env: {
      NODE_ENV: 'production'
    },
    log_date_format: 'YYYY-MM-DD HH:mm Z',
    error_file: '/var/log/rsshub.err.log',
    out_file: '/var/log/rsshub.out.log',
    merge_logs: true,
    pid_file: '/tmp/rsshub.pid'
  }]
};

启动命令简化为:

pm2 start ecosystem.config.js

3.3 PM2实用功能

功能 命令 说明
日志查看 pm2 logs rsshub 实时日志
性能监控 pm2 monit 资源占用可视化
启动列表 pm2 save 保存当前进程列表
开机自启 pm2 startup && pm2 save 系统重启后自动恢复

4. 系统集成与监控

4.1 防火墙配置

阿里云控制台和安全组都需要开放端口:

# 防火墙规则(CentOS 7)
sudo firewall-cmd --zone=public --add-port=1200/tcp --permanent
sudo firewall-cmd --reload

# 验证端口开放
ss -tulnp | grep 1200

4.2 日志轮转配置

创建/etc/logrotate.d/rsshub防止日志膨胀:

/var/log/rsshub*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 640 root root
    sharedscripts
    postrotate
        pm2 reloadLogs > /dev/null
    endscript
}

4.3 健康检查脚本

设置cron定时任务检查服务存活:

# 创建检查脚本 /usr/local/bin/check_rsshub.sh
#!/bin/bash
if ! pm2 id rsshub > /dev/null; then
    echo "$(date) - RSSHub not running, restarting" >> /var/log/rsshub_monitor.log
    pm2 start ecosystem.config.js
fi

# 添加cron任务(每5分钟检查一次)
(crontab -l 2>/dev/null; echo "*/5 * * * * /usr/local/bin/check_rsshub.sh") | crontab -

5. 性能调优与问题排查

5.1 常见错误代码解析

错误代码 可能原因 解决方案
ECONNREFUSED 端口未正确监听 检查防火墙和安全组
ENOMEM 内存不足 调整max-memory-restart
ETIMEDOUT 请求超时 增加REQUEST_TIMEOUT
MODULE_NOT_FOUND 依赖缺失 重新npm install

5.2 内存泄漏处理

当发现RSSHub内存持续增长时:

  1. 生成内存快照:
pm2 trigger rsshub heapdump
  1. 使用Chrome DevTools分析生成的.heapsnapshot文件

  2. 常见内存泄漏场景:

    • 未关闭的数据库连接
    • 无限增长的缓存
    • 未清理的定时器

5.3 负载测试建议

使用artillery进行基础压力测试:

npm install -g artillery
artillery quick --count 50 -n 20 http://localhost:1200/bilibili/user/video/2267573

典型优化方向:

  • 调整PM2的instances数量(通常为CPU核心数)
  • 增加CACHE_EXPIRE减少后端请求
  • 使用REQUEST_RETRY处理不稳定源

6. 安全加固措施

6.1 访问控制

限制敏感路由访问:

// config.js
module.exports = {
    // 仅允许特定IP访问管理接口
    ALLOW_LIST: ['192.168.1.100'],
    
    // 禁用危险路由
    DISALLOW_ROUTES: [
        '/admin',
        '/config'
    ]
};

6.2 定期更新策略

建立更新流程:

  1. 停止服务:
pm2 stop rsshub
  1. 更新代码:
git pull origin master
npm install
  1. 重启服务:
pm2 restart rsshub

建议通过cron设置每周自动更新:

0 3 * * 1 /usr/local/bin/update_rsshub.sh

7. 备份与恢复方案

7.1 关键数据备份

需要定期备份的内容:

  • PM2进程列表:pm2 save
  • 配置文件:config.jsecosystem.config.js
  • 自定义路由(如有)
  • 日志文件(最近7天)

7.2 自动化备份脚本

示例备份脚本/usr/local/bin/backup_rsshub.sh

#!/bin/bash
BACKUP_DIR="/backup/rsshub/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR

# 备份配置
cp /home/rsshub/RSSHub/config.js $BACKUP_DIR
cp /home/rsshub/RSSHub/ecosystem.config.js $BACKUP_DIR

# 备份PM2状态
pm2 save
cp /home/rsshub/.pm2/dump.pm2 $BACKUP_DIR

# 打包备份
tar -czf "/backup/rsshub_$(date +%Y%m%d).tar.gz" $BACKUP_DIR

# 保留最近7天备份
find /backup -name "rsshub_*.tar.gz" -mtime +7 -delete

添加到cron每日执行:

0 2 * * * /usr/local/bin/backup_rsshub.sh

8. 扩展功能集成

8.1 与Nginx配合使用

配置反向代理提升安全性:

server {
    listen 80;
    server_name rsshub.yourdomain.com;

    location / {
        proxy_pass http://127.0.0.1:1200;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        # 限制请求频率
        limit_req zone=one burst=10;
    }

    # 静态文件缓存
    location ~* \.(js|css|png)$ {
        expires 30d;
        access_log off;
    }
}

8.2 监控告警设置

集成Prometheus监控:

  1. 安装PM2 Prometheus exporter:
pm2 install pm2-prometheus-exporter
  1. 配置Grafana仪表盘监控:
    • 进程内存占用
    • CPU使用率
    • 请求响应时间
    • 异常重启次数

8.3 自定义路由开发

扩展routes示例:

// 新建 routes/custom/example.js
module.exports = {
    '/custom/example': {
        parameters: {
            id: 'required'
        },
        features: {
            antiCrawler: true
        },
        handler: async (ctx) => {
            // 业务逻辑
            return {
                title: 'Custom Example',
                item: []
            };
        }
    }
};

在阿里云轻量应用服务器上运行RSSHub三年多,最深刻的体会是:看似简单的服务,要真正做到稳定可靠,需要在前期的系统架构上多花心思。采用PM2集群模式后,我的RSSHub实例成功处理了单日超过50万次的请求,而内存使用始终保持在300MB以下。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐