
虽然好多图片我已经不推送到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正文里直接写完整地址:

首页卡片图则写在文章头部:
card_image: https://xxxx/images/3.png
文章专属图片可以写成:

以后写博客的流程也就变成了:图片复制到Fedora,Markdown继续放GitHub,文章通过xxx.seis-jun.xyz引用图片。GitHub仓库终于只需要负责它比较擅长的文字和代码,不必再被一堆大图压得气喘吁吁。
当然,这种办法也有代价。办公室电脑关机、Nginx停止或者Tunnel断线时,博客还能打开,图片却会暂时消失。所以重要图片仍然需要另外备份,不能觉得能在浏览器里打开就算万事大吉。
至少现在,第一张图片已经从自己的Fedora里钻过Cloudflare Tunnel,稳稳地出现在博客上了。这就可以了。
下次找到visa卡再试试cloudflare R2吧。
Comments