如何免费开启 CloudFlare Railgun 动态页面 CDN 加速服务

小助手读文章 00:00 / 00:00

温馨提示:
本文所述内容具有依赖性,可能因软硬条件不同而与预期有所差异,故请以实际为准,仅供参考。

关于 CloudFlare,我们学习了《通过 API 将 IP 黑名单批量添加到 CloudFlare 防火墙》、《CloudFlare Workers 设置使用自己的域名》、《利用 CloudFlare Workers 等平台零成本运行 Google Drive、OneDrive 文件列表清单程序》、《使用 CDN(CloudFlare|腾讯云|加速乐等)情况下如何获取访客真实 IP ?》、《利用 CloudFlare API 实现自动 DDNS 功能|支持IPv4|IPv6》、《如何正确启用 CloudFlare SSL》、《使用 CNAME 接入 CloudFlare 新玩法》,今天我们来看看高端用户专属的 Railgun 功能。

什么是 Railgun

CloudFlare 是这么介绍的:

当内容快速变化或个性化时,无法按照传统意义进行缓存,必须将请求发送到原始服务器进行处理。远离原点的访客在很大程度上受到这些延误的影响。

Railgun 通过对 Cloudflare 数据中心与原始服务器之间的通信进行压缩和 WAN 网络优化来加速和确保动态内容的交付,从而加快了无法直接从 Cloudflare 缓存中提供服务的请求。

Railgun 通过以下方式提高了页面加载时间:

  • 通过跟踪页面版本之间的差异(低至字节)压缩内容,仅发送实际已更改的部分
  • 维护多个同时请求的单个持久连接,消除了网络连接延迟;
  • 缓存经常更改或个性化的动态内容;

Railgun.png

Railgun 分侦听器(Railgun Listener)和发送器(Railgun Sender),发送器安装在所有Cloudflare 数据中心中,并与侦听器一定条件下保持连接,以复用连接降低连接延迟;侦听器则是今天我们所关注的,安装在我们 Web 主机上,或者 Web 主机同网络的另一台主机上,甚至可以是大佬们自建的其他位置的主机,负责使用加密二进制 Railgun 协议为发送器提供服务的服务。

一般来说,发送器跟 CDN 一样就近访问侦听器,即你在香港,访问开启 Railgun 服务的网站时,是由香港 CloudFlare 节点的发送器去连接这个网站的侦听器,这么说的意思可以理解不?这就意味着,从大陆出去的访问,将几乎都是由美国的发送器去连接网站源站的,如果源站离美国较远(比如大陆),那么加速效果在一定程度上也很有限。

由上可知,Railgun 并不能提升访客到 CloudFlare 的网络速度,而是 CloudFlare 到 Web 源站的速度,通过长连接和分析差异化页面来实现高达 99.6% 的压缩率,达到加速的效果。也正是因为只发送有差异的数据(类似增量更新),即使开启 Railgun 后连接多了一道(访客 → CloudFlare 节点 → railgun → 源站),一般来说连接速度也比直接连接(访客 → CloudFlare 节点 railgun → 源站)要来的快。

所以如果源站是动态的,那么 Railgun 加速效果会比较好,而如果是纯静态的,那么直接通过页面规缓存全站会比 Railgun 要好。

安装 Railgun

是指 Railgun 侦听器(Listener)的安装,Railgun 发送器(Sender)在 CloudFlare 数据中心也玩不了。

Railgun 侦听器可以自己安装,也可以使用 CloudFlare(付费)以及大佬们提供的公共服务(可能付费)。

如果使用使用非本机自建的第三方或官方服务,那么并不能节省源站到 CloudFlare 的流量,甚至会翻倍消耗,这一点请注意。

自己安装的话,Railgun 安装分软件安装和配置。安装可以自己操作,但是配置仍然需要有有效的 Railgun token 才可以,因此在决定尝试使用 Railgun 服务时,请先确认自己是否可以获得 token。一般加入 CloudFlare Partner(CFP)计划的大佬都可以提供 token

官方文档对侦听器(Listener)的要求比较高,双核处理器、4GB RAM、64 位架构等等,实际上这是对提供 Railgun 公共服务的服务器要求,只有我们自己在用的话,只要保证 memcached 能流畅地跑起来就行。

安装

Railgun 侦听器(Listener)由 rg-listenermemcached 组成,针对主流系统,CloudFlare 提供了官方一键安装包,我们直接拿来用即可。

CentOS6

sudo rpm --import https://pkg.cloudflare.com/pubkey.gpg
sudo rpm -e gpg-pubkey-8e5f9a5d-*
sudo rpm -ivh http://pkg.cloudflare.com/cloudflare-release-latest.el6.rpm
yum install railgun-stable -y

CentOS7

sudo rpm --import https://pkg.cloudflare.com/pubkey.gpg
sudo rpm -e gpg-pubkey-8e5f9a5d-*
sudo rpm -ivh http://pkg.cloudflare.com/cloudflare-release-latest.el7.rpm
yum install railgun-stable -y

Debian8

echo 'deb http://pkg.cloudflare.com/ jessie main' |
sudo tee /etc/apt/sources.list.d/cloudflare-main.list
curl -C - https://pkg.cloudflare.com/pubkey.gpg | sudo apt-key add -
sudo apt-get update
apt-get install railgun-stable -y

Debian9

echo 'deb http://pkg.cloudflare.com/ stretch main' |
sudo tee /etc/apt/sources.list.d/cloudflare-main.list
curl -C - https://pkg.cloudflare.com/pubkey.gpg | sudo apt-key add -
sudo apt-get update
apt-get install railgun-stable -y

Ubuntu 14.04

echo 'deb http://pkg.cloudflare.com/ trusty main' |
sudo tee /etc/apt/sources.list.d/cloudflare-main.list
curl -C - https://pkg.cloudflare.com/pubkey.gpg | sudo apt-key add -
sudo apt-get update
apt-get install railgun-stable -y

Ubuntu 16.04

echo 'deb http://pkg.cloudflare.com/ xenial main' |
sudo tee /etc/apt/sources.list.d/cloudflare-main.list
curl -C - https://pkg.cloudflare.com/pubkey.gpg | sudo apt-key add -
sudo apt-get update
apt-get install railgun-stable -y

自行编译

有些版本的系统目前暂时还无法通过软件包一键安装,但可以自己编译,下面以 Ubuntu18 为例:

安装 Railgun
wget http://pkg.cloudflare.com/pool/xenial/railgun/r/railgun-stable/railgun-stable_5.3.3_amd64.deb
ar -x *.deb
tar xvf data.tar.xz
mkdir -p /usr/local/railgun
mv etc /usr/local/etc/railgun
mv usr/bin /usr/local/lib/railgun
ln -s /usr/local/lib/railgun/* /usr/local/bin
mkdir /var/run/railgun
mkdir /var/log/railgun
chown nobody:nobody /var/run/railgun/
chown nobody:nobody /var/log/railgun/
chmod 0750 /var/log/railgun

其他系统自行使用系统代号替换 xenial(Ubuntu18 的代号),比如 Arch Linux 系统代号是 stretch,则下载地址就是 http://pkg.cloudflare.com/pool/stretch/railgun/r/railgun-stable/railgun-stable_5.3.3_amd64.deb

安装 memcached
pacman -S memcached
systemctl enable memcached
systemctl start memcached
创建 service
~ # vim /etc/systemd/system/railgun.service
[Unit]
Description=Cloudflare Railgun
After=network.target

[Service]
Type=simple
User=nobody
ExecStart=/usr/local/bin/rg-listener -config=/usr/local/etc/railgun/railgun/railgun.conf
PIDFile=/run/railgun.pid
[Install]
WantedBy=multi-user.target

配置

目前有免费提供 token 的有 CloudRaft挖站否闲吧资源站等大佬。

vi /etc/railgun/railgun.conf
    #修改以下字段
   #activation.token = Railgun token
   #activation.railgun_host = 本服务器公网 IP

如果是自己编译的:

vi /usr/local/etc/railgun/railgun/railgun.conf
  map.file = /usr/local/etc/railgun/railgun/railgun-nat.conf
  ca.bundle = /usr/local/etc/railgun/ssl/railgun-ca-certs.crt
  activation.token = Railgun token
  activation.railgun_host = 本服务器公网 IP

如果 activation.railgun_host 配置的是域名,则配置 wan.ip,特别是服务器只有 IPv6 地址的时候。其他配置可参见官方文档《Railgun Execution》。

启动

systemctl enable memcached
systemctl start memcached
systemctl enable railgun
systemctl start railgun

开放防火墙

CloudFlare 在首次通过 HTTP 标准端口连接源站时发现开启了 Railgun,CloudFlare 的发送器会立即启动并通过 2408 端口来访问 Railgun 服务,因此必须将 2408 端口开放给 CloudFlare 源 IP。

具体 IP 清单可以参见 CloudFlare 文档,如果不放行 2408 端口,前端看到的 Railgun 标头永远是 cf-railgun: direct (starting new WAN connection)

鉴于此前发生过 memcached 攻击,强烈建议开启防火墙。

回源 IP

173.245.48.0/20
103.21.244.0/22
103.22.200.0/22
103.31.4.0/22
141.101.64.0/18
108.162.192.0/18
190.93.240.0/20
188.114.96.0/20
197.234.240.0/22
198.41.128.0/17
162.158.0.0/15
104.16.0.0/12
172.64.0.0/13
131.0.72.0/22
2400:cb00::/32
2606:4700::/32
2803:f800::/32
2405:b500::/32
2405:8100::/32
2a06:98c0::/29
2c0f:f248::/32

Firewalld

使用 Firewalld 防火墙,一般是 CentOS、Redhat 等系统,命令举例:

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="173.245.48.0/20" port protocol="tcp" port="2408" accept"

UFW

使用 UFW 防火墙,一般是 Ubuntu、Debian 等系统,命令举例:

ufw allow from 173.245.48.0/20 to any port 2408

或者批量自动加:

for i in `curl https://www.cloudflare.com/ips-v4`; do ufw allow proto tcp from $i to any port 2408; done

iptables

for i in `curl https://www.cloudflare.com/ips-v4`; do iptables -I INPUT -p tcp -s $i --dport 2408 -j ACCEPT; done

测试

现在,Railgun 侦听器已经成功安装完成,我们来看看效果如何。

启用前

响应标头(已删除相同的字段):

cf-ray: 59e8b715a84e6c6e-SJC
cf-request-id: 032550c18900006c6ebe02f200000001
date: Fri, 05 Jun 2020 09:02:31 GMT

页面加载时间:

启用前.png

启用后

响应标头:

cf-railgun: direct (starting new WAN connection)
cf-ray: 59e8bb5b1d4a6c6e-SJC
cf-request-id: 0325536cef00006c6ebe0e4200000001
date: Fri, 05 Jun 2020 09:05:26 GMT

首次访问不会有明显改善,因为 Railgun 还没生效,可以看到多了一个标头:cf-railgun: direct (starting new WAN connection),再次访问:

cf-railgun: 4503b53c31 stream 0.000000 0200 57da
cf-ray: 59e8bfb86a700742-FRA
cf-request-id: 0325562745000007421e0b0200000001
date: Fri, 05 Jun 2020 09:08:25 GMT

可以看到标头变成了cf-railgun: 4503b53c31 stream 0.000000 0200 57da,表示现在已经通过 Railgun 传回了数据,但是并没有压缩(根据 Raigun 原理,通过对比前后两次数据传递差异来提高压缩率,首次访问并没有记录,因此不会有压缩,而是直接返回数据),再刷新一下:

cf-railgun: 7f0698514d 0.05 0.006445 0030 57da
cf-ray: 59e8c0eecbe00742-FRA
cf-request-id: 032556e941000007421e3a0200000001
date: Fri, 05 Jun 2020 09:09:14 GMT

可以看到标头变成了 cf-railgun: 7f0698514d 0.05 0.006445 0030 57da,表示此次访问,相对上一次访问,CloudFare 发送器从源网站仅进行了 0.05% 数据交互,使用时间仅 0.006445 秒,看看页面加载时间:

启用后.png

页面大小基本不变,但是加载时间(TTFB)却从原来的 849.88ms 降到了 496.40ms,加速效果非常明显。

细心的你可能发现了,测试中 CloudFlare 服务器从 SJC 变成了 FRA,实际上客户端连接的 IP 还是那个 IP,说明 CloudFlare IP 确实是 Anycast IP,而且路由是随时变更的。

扩展

响应标头解读

官方文档:《Reading and Interpreting the 'Cf-Railgun' Header

启用 Railgun 后,响应标头多了 cf-railgun 字段,一般格式为:

connection-id compression-ratio origin-time flags version
连接ID 压缩率 响应时间 标头标志 版本

比如:

7f0698514d 0.05 0.006445 0030 57da

连接 ID

第一个变量是 connection-id(标记为 7f0698514d),它是 Cloudflare 的发送器(rg-sender)和服务端侦听器(rg-listener)之间的唯一连接 ID。多个请求共享相同的ID,因为它标识了通过其发送 Railgun 请求的 TLS 连接。

压缩率

第二个变量是 compression-ratio,它指示请求的内容已压缩。在此示例中,资源请求被压缩到其原始大小的 0.05%(为请求实现了 99.95% 的压缩)。如果存在某种错误,则压缩率很可能会列为“normal”或“direct”。这意味着 Railgun 的压缩由于某种原因而被绕过。

stream” 代替请求、压缩都正常工作,但是此次访问未发生压缩行为。

出发时间

第三个变量是 origin-time,以为单位,表示 Railgun 等待源 Web 服务器生成页面的时间。在此示例中,从 Railgun 侦听器将请求发送到源再到响应,源服务器用时 0.006445 秒(不包含客户端到 CloudFalre 时间)。如果此数字很大,则意味着源服务器或数据库可能遇到瓶颈,这正在降低其呈现页面的时间。

标头标志

标头中的第四个变量 flags,用于指示 Railgun 请求/响应处理的各个方面。可用于处理为什么请求 Railgun 时相应的 cf-railgun 状态为 normaldirect。通常,我们可以使用 Railgun 软件包随附的实用程序 rg-diag 来查看标头标志到底是什么意思。

rg-diag

rg-diag 命令可以对 cf-railgun 的每一个字段进行解释,使用时添加参数 -decode 即可。

~ # rg-diag -decode '7f0698514d 0.05 0.006445 0030 57da'
   Compression ratio 0.05%
     Railgun version 57da
        Railgun Flag rg-sender sent dictionary
        Railgun Flag rg-listener found dictionary

其中,0030 是对压缩是否正常给出的状态码,如果第三位是 37BF 则表示正常。注意 rg-diag -decode 未必都会返回数据。

版本

最后一个变量 version 是所使用的服务端侦听器(rg-listener)版本的哈希值的前四个字符。

请求都是 direct

官方文档:《Why are Railgun Requests Showing as Direct?

分析及解决方向

如果 cf-railgun 标头包含状态 direct (有时还包含字段描述),则表明 Railgun 侦听器(Listener)并未处理该请求,而是直接转到源 Web 服务器。

如果 direct 重复出现请求状态,有两个常见原因导致这种情况发生:

  • 对于低流量的站点,这通常表示 Railgun 正在开始与远程 Railgun 侦听器(rg-listener)的新连接,并且该连接尚未准备好,第二次请求通常会成功并显示压缩;
  • 对于大流量的站点,这通常表明侦听器无法正常工作或无法连接;

那么如何解决 direct 问题呢?建议检查侦听器配置是否包含以下内容:

  • Railgun 服务正在托管侦听器的服务器上运行(ps -ef|grep railgun|grep -v grep);
  • 端口 2408 已打开(netstat -antlp|grep 2408);
  • Cloudflare IP 已加入防火墙白名单;

direct 状态说明

当请求的 Railgun 状态为 direct 时,可能的字段描述有:

  • all WAN connections are busy(所有 WAN 连接都很忙):当由于连接已达到最大的 WAN 连接数,并且所有 WAN 连接都在使用中,而无法在发送器和侦听器之间再打开 WAN 连接时,将出现此状态。WAN 连接的最大数量由 rg-senderwan.lanes 参数设置,在生产中,此设置为 1,000 个连接。
  • starting new WAN connection(开始新的 WAN 连接):发送方和侦听器之间没有已建立的空闲WAN 连接,因此与其直接等待可用的 WAN 连接,不如创建一个新连接。它通常出现在流量很小的站点上,这是一项优化措施,可以防止 Railgun 等待 WAN 连接。发生这种情况时,Railgun 将直接连接到远程 rg-listener
  • waiting for pending WAN connection(等待挂起的 WAN 连接):与“starting new WAN connection”非常相似,但表示已经建立了新连接,但是 Railgun 发送器正在等待 rg-listener 尚未建立的 WAN 连接。
  • internal error or Internal channel failure(内部错误或内部通道故障):当 Railgun 发送方(Sender)在 Cloudflare 的边缘服务器出现内部错误时,就会发生这种情况。如果在请求标题中发现此错误,建议提交工单以获取帮助。

预期行为

下面是对启用 Railgun 的网站连续访问的 cf-railgun 响应标头,这是典型的请求序列,先连接建立 WAN,然后在 Railgun 发送器和侦听器之间打开 WAN 时优化后续请求:

cf-railgun: direct (starting new WAN connection)
cf-railgun: 6a622d1e98 0.02 0.001751 0030 3350
cf-railgun: c562e934d3 0.02 0.002268 0030 3350
cf-railgun: 342a904d9c 0.02 0.002070 0030 3350
cf-railgun: c3f365ab80 0.02 0.004062 0030 3350

使用 Railgun 时,请求流中的上述模式是正常的。如果在测试或调试时正在重现此模式,则表明Railgun 正在按预期优化站点的流量。


相关文章:

1、《Railgun 5.3.3 documentation
2、《CloudFlare (CF) CDN安装并配置Railgun服务端教程|CentOS|Debian|Ubuntu
3、《在任意Linux发行版上安装Railgun
4、《【测评经验分享】cf的railgun深入解析(不减带宽反而成倍增加)
5、《Cloudflare Railgun动态CDN加速免费开启及测试手记
6、《免费开启Cloudflare Railgun加速-减少连接延迟 实现动态页面缓存和加速


ArmxMod for Typecho
个性化、自适应、功能强大的响应式主题

推广

 继续浏览关于 加速cdn免费福利cloudflare教程方法railgun 的文章

 本文最后更新于 2020/06/30 17:44:06,可能因经年累月而与现状有所差异

 引用转载请注明: VirCloud's Blog > 运维 > 如何免费开启 CloudFlare Railgun 动态页面 CDN 加速服务

精选评论

  1. 森纯博客
    森纯博客 回复

    Windows 10Chrome 83.0.4103.61来自 广东 的大神

    这教程不错,改天折腾折腾

    1. 欧文斯

      有 CFP 比较好搞,不然要 token 麻烦

  2. AWS CloudFront CDN 详细图文部署教程及自选优质 IP 方法 | 我的文本