用Cloudflare Tunnel给博客放图片

虽然好多图片我已经不推送到GitHub Pages上,但没办法有些还是得上传自己的图。

怎么办?

之前我已经在办公室Fedora上配置好了Cloudflare Tunnel,FreshRSS和PaperHot都从这里出去。既然隧道已经挖通,再给博客图片留一条路似乎也不费多少事。没有用R2是因为找不到visa卡

最后的结构是:

GitHub Pages上的博客
    ↓ 请求图片
https://xxx.seis-jun.xyz/
    ↓
Cloudflare Tunnel
    ↓
Fedora上的Nginx:127.0.0.1:8081
    ↓
/var/www/seisamuse-media/

图片放在哪里

图片不再放进GitHub仓库,而是单独放在Fedora的这个目录:

/var/www/seisamuse-media/

目前分成两类:

/var/www/seisamuse-media/
├── images/
│   ├── 3.png
│   └── 其他普通博客图片
└── blog/
    └── assets/
        └── 文章slug/
            └── figure1.png

普通图片放在:

/var/www/seisamuse-media/images/

某篇文章独有的论文插图,则可以放在:

/var/www/seisamuse-media/blog/assets/文章slug/

建目录:

sudo mkdir -p /var/www/seisamuse-media/images
sudo mkdir -p /var/www/seisamuse-media/blog/assets
sudo chmod -R a+rX /var/www/seisamuse-media
sudo restorecon -Rv /var/www/seisamuse-media

这里只放准备公开的博客图片。一些不想让别人看到的东西当然不能顺手扔进去。

用Nginx提供图片

Fedora上原本已经装了Nginx,所以不用再装一次,只需要增加一个配置:

/etc/nginx/conf.d/seisamuse-media.conf

内容如下:

server {
    listen 127.0.0.1:8081;
    server_name xxxx;

    root /var/www/seisamuse-media;

    location / {
        try_files $uri =404;
        add_header Cache-Control "public, max-age=31536000, immutable";
    }

    autoindex off;
}

Nginx只监听127.0.0.1:8081。也就是说,办公室路由器不需要开放8081端口,外部访问全部交给Cloudflare Tunnel。

先检查配置,再启动服务:

sudo nginx -t
sudo systemctl enable --now nginx

本地测试:

curl -I http://127.0.0.1:8081/images/3.png

SELinux给我拦了一下

一开始并没有顺利返回图片,而是直接报错:

curl: (7) Failed to connect to 127.0.0.1 port 8081

查看Nginx状态以后才发现,真正的错误是:

bind() to 127.0.0.1:8081 failed (13: Permission denied)

Nginx配置语法没有问题,端口也没有被占用,是Fedora的SELinux不允许Nginx监听这个新端口。需要把8081加入允许的HTTP端口:

sudo semanage port -a -t http_port_t -p tcp 8081

如果系统提示8081已经有定义,则改用:

sudo semanage port -m -t http_port_t -p tcp 8081

然后重新检查并启动:

sudo nginx -t
sudo systemctl start nginx

这次本地访问终于返回了200 OK。这种问题挺有Fedora特色:东西明明都摆对了,门口的保安还是要再看一眼证件。

加进已有的Cloudflare Tunnel

我没有重新创建Tunnel,只是在已有配置中增加一个hostname。Cloudflare Tunnel的配置文件是:

/root/.cloudflared/config.yml

修改前先备份:

sudo cp /root/.cloudflared/config.yml \
  /root/.cloudflared/config.yml.bak.$(date +%Y%m%d_%H%M%S)

在最后的404兜底规则前增加:

  - hostname: img.xxxx
    service: http://127.0.0.1:8081
  - service: http_status:404

检查配置:

sudo cloudflared tunnel \
  --config /root/.cloudflared/config.yml \
  ingress validate

然后给现有Tunnel增加DNS路由:

sudo cloudflared tunnel route dns \
  <现有Tunnel名称> \
  img.seis-jun.xyz

最后重启Tunnel服务:

sudo systemctl restart cloudflared-freshrss.service

公网测试:

curl -I https://xxxx/images/3.png

实际返回了HTTP/2 200,文件大小和Fedora上的原图一致。原来的FreshRSS和PaperHot也都正常,说明新规则没有把旧服务挤下去。

博客里怎么使用

Markdown正文里直接写完整地址:

![图片说明](https://xxx/images/3.png)

首页卡片图则写在文章头部:

card_image: https://xxxx/images/3.png

文章专属图片可以写成:

![论文图](https://xxxx.xyz/blog/assets/文章slug/figure1.png)

以后写博客的流程也就变成了:图片复制到Fedora,Markdown继续放GitHub,文章通过xxx.seis-jun.xyz引用图片。GitHub仓库终于只需要负责它比较擅长的文字和代码,不必再被一堆大图压得气喘吁吁。

当然,这种办法也有代价。办公室电脑关机、Nginx停止或者Tunnel断线时,博客还能打开,图片却会暂时消失。所以重要图片仍然需要另外备份,不能觉得能在浏览器里打开就算万事大吉。

至少现在,第一张图片已经从自己的Fedora里钻过Cloudflare Tunnel,稳稳地出现在博客上了。这就可以了。

下次找到visa卡再试试cloudflare R2吧。

Comments

← 老了 Blog gmail的smtp被crack了吗? →