什么是RSS

RSS(Really Simple Syndication,简易信息聚合)是一种(已过时的)信息获取方式。简单但不严谨地来说,它就像是你的一个报童,然后知乎、微博、豆瓣、经济学人、纽约时报、BBC 这些内容创作网站就像是一家家报社。每天早上,报童会跑遍各个报社,从它们那里拿到新鲜出炉的报纸,然后把所有报纸一股脑地塞进你的信箱,以便你醒来后一打开信箱就可以看到当天的所有新闻,而不必亲自去跑各个报社。

在上面这个比喻中,报纸是 RSS,信箱是 RSS 阅读器,每家报社的地址是 RSS 订阅源,报童是你的电脑或手机上运行的 RSS 定时拉取程序。

Mac上的RSS阅读器:Reeder

RSS 具有以下优点:

  • 方便:你不必挨个打开那些网站,就可以看到整个互联网上所有的新鲜事;
  • 透明、自主:你看到的信息将严格按照时间顺序排列。那些无休止的男女争吵、氪金营销号、耸人听闻的标题党等等将不再仅仅因为作者花了钱,或者看热闹 / 猎奇的人多而霸占你的首页。同时,你也可以看到更多舒适圈之外的观点,从而跳出信息茧房。这意味着更大的权力与自由,但同时也意味着你需要花更多的时间定制自己的排序和筛选策略。

关于 RSS 和推荐算法之间的 trade-off,这篇文章写得很好:论 RSS 的「复兴」

我个人的体验是,对于品控稳定、由职业作者进行内容输出的老牌新闻媒体(例如 NYT/BBC/FT 等)还有一些独立博客,RSS 的体验非常棒,因为即使你不自己筛选排序,也不至于读到太糟糕的内容;而对于知乎、豆瓣这种社交网络平台,内容质量方差极大,直接订阅时间线 RSS 的体验就非常糟糕。我一般仅订阅少量高质量用户,并定期通过 BFS 的方式扩大关注圈;至于一亩三分地这种以话题为中心而非以用户为中心的论坛网站,就几乎完全不能通过 RSS 来有效浏览了。

什么是RSSHub

如果 RSS 的优点对你很有吸引力,你也许会发现一个严重的问题:很多网站都没有公布他们的 RSS 订阅源。回到开头的那个比喻,这相当于报社不肯对报童(电脑程序)公开他们的地址,导致你(人类用户)只能亲自上门。

当然,这个问题难不倒一部分聪明的人类。他们开发了一个软件:RSSHub,专门用来把网站对人类开放的入口(网页)给转化成电脑程序能看懂的格式(RSS)。RSSHub 有点像是一个信息的中转站,它从各个网站下载网页,转成 RSS,然后把自己的地址提供给 RSS 订阅程序使用。

网站们大多很不希望用户们这样做。因为这样一来,他们投放的广告就无法被人类看到,同时也无法收集用户的浏览偏好数据。因此,很多公开的 RSSHub 服务(例如,RSSHub 官方提供的 rsshub.app)已经因为使用人数过多而被一部分网站屏蔽了。我接下来会详细描述如何在自己的服务器上搭建一个仅供自己使用的 RSSHub 服务。

安装和部署RSSHub

以下假设你 1)有自己的服务器,并且 2)已经为其绑定了域名(以 example.com 表示)。

非常 straightforward,直接参考官方文档使用 docker-compose 安装和即启动即可🚀(若出现内存不足导致安装过程中被 kill,可以考虑扩大服务器的 swap):

mkdir rsshub && cd rsshub
wget https://raw.githubusercontent.com/DIYgod/RSSHub/master/docker-compose.yml
docker volume create redis-data
docker-compose up -d

此步结束后,RSSHub 服务就部署在你服务器的 1200 端口上了。在浏览器中输入 http://example.com:1200,看到与 rsshub.app 相同的界面,就表示安装成功了。

支持二级域名及 https

这个步骤将会把 http://example.com:1200 转变成(看起来比较酷的)https://rss.example.com。如果你不在意这二者的区别(端口号 vs 二级域名,http vs https)的话,可以跳过此步骤。

二级域名

首先,登录你的 VPS 提供商网站(我的是 Hostwinds),在 DNS 部分加入一个 A record,将 rss.example.com 映射到你 VPS 的 IP 地址。

然后,登录你的 VPS,添加一个从 rss.example.com:80 指向 localhost:1200 的反向代理:

cd /etc/nginx/sites-available/
sudo vim rsshub.conf

rsshub.conf 的内容(请将 example.com 换成你自己的域名):

server {
    listen      80;
    listen [::]:80;
    
    return 301 https://$host$request_uri;
    root /var/www/rss.example.com;
    index index.html index.htm index.nginx-debian.html;


    server_name rss.example.com;


    location / {
        proxy_pass http://127.0.0.1:1200;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

然后刷新 nginx 服务:

sudo systemctl reload nginx

此步结束后,在浏览器中输入 http://rss.example.com,应该可以看到和刚才相同的界面。

SSL

方法和给 wordpress 装 SSL 基本一致:

sudo certbot --nginx -d rss.example.com

然后修改 nginx 配置文件,加入 https:

cd /etc/nginx/sites-available/
sudo vim rsshub.conf

rsshub.conf 的最终内容(请将 example.com 换成你自己的域名):

server {
    listen      80; 
    listen [::]:80;
    server_name rss.example.com;
        
    return 301 https://$host$request_uri;
}


server {
    listen 443 ssl;
    server_name rss.example.com;


    ssl_certificate /etc/letsencrypt/live/rss.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/rss.example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


    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;
        proxy_set_header X-Forwarded-Proto $scheme;
    }   
}

再次刷新 nginx 服务:

sudo systemctl reload nginx

现在你可以使用 https://rss.example.com 来访问你的 RSSHub 服务了。恭喜你完成了 RSSHub 的安装🚀!