月度归档: 2022 年 6 月

关于Glider配合CDN加速的实例

设想

《利用CDN对单条私有线路负载均衡》中提到,我试图用 Glider 作分流,但没能实现多路复用。最近又研究了一下 Glider 的配置,发现还是有解的。

最终,配出了一条自认为还算不错的方案: tls+ws+mux+ss

Glider 完整支持 TCP / UDP 且同时支持 Server / Client 的有 SOCKS5 / SS / Trojan(c) / Unix,考虑到过 CDN 的安全性,能支持 AEAD 加密的只有 SS,所以我使用 SS 作为基础协议,加密采用 AEAD_AES_128_GCM。

具体实施

Server 安装与启动,以 ubuntu 为例:

dpkg -i glider_x.x.x_linux_amd64.deb
systemctl enable glider@glider
systemctl start glider@glider
# systemctl restart glider@glider

默认配置文件 /etc/glider/glider.conf,加入 listen=ws://127.0.0.1:[port]/[path],smux://,ss://AEAD_AES_128_GCM:[pass]@。重启服务。

因为 443 端口还有其他业务,所以我把 tls 的部分交给 nginx 处理

location /[path] {
    proxy_redirect off;
    proxy_pass http://127.0.0.1:[port];
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
}

Client 配置:

直连:forward=wss://[host]/[path],smux://,ss://AEAD_AES_128_GCM:[path]@

CDN:forward=wss://[CDN_SERVER]/[path]?serverName=[YOUR_HOST]&host=[YOUR_HOST],smux://,ss://AEAD_AES_128_GCM:c2059aef-6ffb-44d1-a2ee-d9a379826cf1@

其中 CDN_SERVER 可以是 Cloudflare 自选 IP、CDN 提供的 CNAME 等,YOUR_HOST 就是回源服务器。其中,serverName 参数不是必须的,这取决于 CDN,比如:Cloudflare 要求指定,Asians.Group 可以不写。

一点技巧

如果使用 Asians.Group 的服务,host 将作为流量统计依据,这个域名无需真实存在。

例如:在后台填入自编域名 sam.ple,回源到真实的 domain.com:443,配置 Glider 客户端时将 host 指定为 sam.ple 即可。

如果流量不够,可以注册多个账户实现流量叠加,只要加入的域名不同即可,无需(也不可能)为其配置 ssl。

一点问题

以上方案并不能在手机上使用,因为手机没有 Glider,也没有客户端支持 smux 套 SS,更没有什么现成的叠速方案。

如何找到合适的线路

Cloudflare 可以用测速工具,其实就是抽签,速度只能保持一小段时间,个人感觉参考价值不大。我完整测试了全部 ip 段后得出的结论是,系统分配的基本接近最佳,建议用一批 Cloudflare 子域替代 ip,例如 h3.speed.cloudflare.comrpki.cloudflare.com 等。

子域挖掘工具:DNS DumpersterWhois XML API剔除掉 NS 子域、固定 ip 子域后,用 Glider 批量验证:

glider 2>&1 | grep --line-buffered Elapsed | awk -F "[: ]" "{print $11}"

去重后填入配置形如:

forward=wss://migp.cloudflare.com/██?serverName=█.██.███&host=█.██.███,smux://,ss://AEAD_AES_128_GCM:████@
forward=wss://blog.cloudflare.com/██?serverName=█.██.███&host=█.██.███,smux://,ss://AEAD_AES_128_GCM:████@
forward=wss://rpki.cloudflare.com/██?serverName=█.██.███&host=█.██.███,smux://,ss://AEAD_AES_128_GCM:████@
#... 适合用 ha 策略

Asians.Group 也可以通过这个方式挖掘出 yk1.net (其 CNAME 主域)下的线路,有香港、美国、台湾、日本等,分别对应到各个 cluster-xxx 子域上。不过意义不大,因为都很快,直接用 asians.group 就行。

forward=wss://asians.group/██?host=1.██.███,smux://,ss://AEAD_AES_128_GCM:████@
forward=wss://asians.group/██?host=2.██.███,smux://,ss://AEAD_AES_128_GCM:████@
#... 适合用 rr 分流

CloudFront 等其他付费 CDN 请随意。

让Enlighter支持Markdown(第三方编辑器)

时隔很多年,装回了 WordPress,看到后台惊呆了,根本不是我以前认识的 WordPress。新的编辑器实在适应不来,索性换成 Markdown。

安装了 WP Githuber MD,默认是 Prism 高亮代码,但样式不太喜欢。找了下有个叫 Enlighter 的热门插件,但是安装后怎么都不起效,开启了兼容模式代码还是 Plain Text。查了官方文档,最终发现兼容模式只是兼容后台 Editor,跟前台没关系。

继续搜索后发现,最近正好有人解决了这个问题。

原文:解决Githuber MD插件代码高亮不能正常工作的问题

修改外观 - 主题文件编辑器 - inc/template-functions.php(原文是 core.php),插入以下转换代码。

/**
 * Use EnlighterJS in Markdown
 * 
 * Source: http://cppdebug.com/archives/438
 * 
 * Author: 大脸猫
 */
function getPar($par,$str){
    $pieces = preg_split($par, $str,-1,PREG_SPLIT_DELIM_CAPTURE);
    $result ='';
    foreach($pieces as $piece){
        $result.=$piece;
    }
    return $result;
}

//转换代码高亮器
function bTagFilter($content) {
        $pattern_full = '{(<pre><code class="language-[\s\S]*?">[\s\S]*?<\/code><\/pre>)}';
        $pattern_full1 ='{<pre><code class="language-[\s\S]*?">([\s\S]*?)<\/code><\/pre>}';
        $pattern_full2 ='{<pre><code class="language-([\s\S]*?)">[\s\S]*?<\/code><\/pre>}';
        //使用短代码的正则分割字符串
        $pieces = preg_split($pattern_full, $content,-1,PREG_SPLIT_DELIM_CAPTURE);
        $new_content = '';
        //遍历所有的字符串 含有段代码的字符串不做自动处理
        foreach($pieces as $piece) {
            if (preg_match($pattern_full, $piece, $matches)) {
                $code = $matches[0];
                $lug = getPar($pattern_full2,$piece);
                $code = getPar($pattern_full1,$piece);
                $code = '<pre class="EnlighterJSRAW" data-enlighter-language="'.$lug.'">'.$code.'</pre>';
                $new_content .= $code;
            } else {
            $new_content .= $piece; }
        }
    return $new_content;
}

之后 Enlighter 就实时生效了,应该不局限于 Markdown,其他编辑器也可以试试。

利用CDN对单条私有线路负载均衡

需求

自有线路,服务器有业务在跑,顺带做个自用机场。在特殊时期希望隐匿服务器 IP,所以考虑挂 CDN 使用。

免费的方案一般是套 CloudFlare 减速云,少部分使用 Asians.Group。瓶颈主要在单服限速(CloudFlare 的测速工具只能保证连通,很难稳定维持)。所以我希望本地可以做负载均衡。我预期的传输方式是,客户端 - 多台 CDN - 落地机。因为出口是同一台服务器,所以 url hash 不合适,最好是轮询。

寻找解决方案

v2ray 本身支持 轮询随机两种调度方式,问题在于 Gui 管理。v2rayN 只能通过导入 .json 文件的方式使用复杂配置,因为 ip 不稳定,配置格式使得频繁修改 ip 比较麻烦。而 Clash for Windows 默认是高可用模式,除非自己修改源码 才能支持轮询,所以也只能放弃。

最终找到 nadoo/glider,本身是代理链工具,它正好拥有以下特性:

  1. 支持 vmess / vless / trojan 等协议
  2. 配置结构简单,一行一条线路
  3. 支持 round robin 策略

具体配置

协议方式:vm(l)ess + lts + websocket
客户端: glider + v2rayN / Clash for Windows

glider 说明中有很多示例,以下是针对 CDN 的具体配置。

以 vless 为例,服务器配置如下:

  "inbounds": [
    {
      "port": local-port,
      "listen": "127.0.0.1",
      "protocol": "vless",
      "settings": {
        "decryption": "none",
        "clients": [
          {
            "id": "put-your-uuid-here",
            "level": 0
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "wsSettings": {
          "path": "/ws"
        }
      }
    }
...

glider 本地配置:

code>forward=wss://{CDN_IP}/ws?serverName={YOUR-DOMAIN}&host={YOUR-DOMAIN},vless://{put-your-uuid-here}@

以 vmess 为例,服务器配置如下:

"inbounds": [
    {
      "port": local-port,
      "listen": "127.0.0.1",
      "protocol": "vmess",
      "settings": {
        "clients": [
          {
            "id": "put-your-uuid-here",
            "alterId": 0
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "wsSettings": {
          "path": "/wss"
        }
      }
    }
...

glider 本地配置:

code>forward=wss://{CDN_IP}/wss?serverName={YOUR-DOMAIN}&host={YOUR-DOMAIN},vmess://chacha20-poly1305:{put-your-uuid-here}@?alterID=0

wss 是后来增加的,也可以用最原始的写法,以 vmess 为例:

code>forward=tls://{CDN_IP}:443?serverName={YOUR-DOMAIN},ws://@/wss?host={YOUR-DOMAIN},vmess://chacha20-poly1305:{put-your-uuid-here}@?alterID=0

复制多行,策略选择 rr,以后只修改 CDN_IP 部分即可。

没有特殊需求,就已经可以通过默认 http / socks 端口 8443 使用,之后在 v2rayN 中加入一个 127.0.0.1:8443 的 socks 线路即可。

关于 Clash 的小麻烦

Clash for windows 的分流策略还是挺好用的,但是加入 socks5 有点麻烦。问题来自 subconverter 的 Bug,无法直接导入 socks5,所以需要手工改配置。有两个办法解决。

方案一

将 glider 中的监听改为 code>listen=ss://aes-128-gcm:p@:8443,然后在 Clash 订阅工具中填入 code>ss://[email protected]:8443#Local。这会损失一部分性能,因为客户端不支持 ss 协议 none 加密,不过总体而言,PC 也不差这点性能。

方案二

转换订阅链接填写 clash,然后修改本地的 parser。

parsers: # array
  - url: your-sub-url
    yaml:
      prepend-proxies:
        - name: "Local"
          type: socks5
          server: 127.0.0.1
          port: 8443

clash 不是一个合法地址,所以转换时会被丢弃,同时 parser 会在导入时加入一个 socks5 服务器。具体可以参考 配置文件预处理

小结

以上方案仍然不能突破单服务器带宽限制,个人体验,打开一般网站已经很流畅,多线程下载也很顺畅,4K 视频比较吃力。另外,glider 不支持 v2ray 的 mux,算是一点遗憾。

至于如何测速和寻找稳定的 CDN IP,又是一个麻烦的问题。

一种文章挂载哔哩哔哩视频更简洁的方式

今天测试了一下文章内嵌视频,包括哔哩哔哩和Youtube,做个总结。

哔哩哔哩

直接使用官网的内嵌代码,视频会挤成豆腐块大小。网上的解决方案主要来自文章 《typecho文章挂载Bilibili视频响应式代码》

文章发布于 2019 年,采用的是固定 em,并做了好几种适配。到了 2021 年初,Chrome 88 新增支持 css 的 aspect-ratio 自适应比例,很快 Firefox、Safari 也支持该写法,所以可以改进为:

.iframe_video {
    width: 100%;
    height: auto;
    aspect-ratio: 4/3;
}

内嵌视频代码稍作修改:

<iframe class="iframe_video" src="//player.bilibili.com/player.html?aid={AID}&page=1&danmaku=0&high_quality=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true" sandbox="allow-top-navigation allow-same-origin allow-forms allow-scripts"></iframe>

添加 class="iframe_video"
酌情添加 danmakuhigh_qualitysandbox 等。

Youtube

同样也可以使用 class="iframe_video" 调整。

Youtube 主要是官方播放器臃肿,使用 WP YouTube Lyte 插件,可在点击后再加载完整播放器。

其它

以上代码可以用于任何宽度撑满的模块,不局限于挂件类型。