最近博主在使用hexo+butterfly主题迁移和调整本站点,主要还是追求静态的性能。。。
butterfly主题设置封面 前几天用hexo迁移wordpress文章后,用hexo打开发现都没有文章封面,不像这里默认用文章得第一张图做文章封面
设置默认封面 看了下butterfly得文档,可以通过如下方式设置默认封面:
1 2 3 4 5 6 7 8 9 10 11 cover: # display the cover or not (是否顯示文章封面) index_enable: true aside_enable: true archives_enable: true # the position of cover in home page (封面顯示的位置) # left/right/both position: both # When cover is not set, the default cover is displayed (當沒有設置cover時,默認的封面顯示) default_cover: # - https://i.loli.net/2020/05/01/gkihqEjXxJ5UZ1C.jpg
这种方式是在文章没有设置封面时才使用该默认配置,如果这么设置得话,就所有得文章封面都一样了,哎,索然无味。不过仔细看了下default_cover用得列表,那就说明可以用多个图,测试了下增加了几个图链,文章封面就会不一样,但是图还是这些,它应该是随机从列表里渲染的,重复渲染几率高~
单独设置封面 看来保险的方式还是单独设置封面,就是繁琐而已,看了下hexo文档说明,单独设置则要在每个文章上配置cover参数:
1 2 3 4 5 6 7 8 9 10 11 --- title: 轻松时刻 tags: [] id: '187' categories: - - uncategorized abbrlink: 12414 date: 2018-11-26 02:14:49 cover: https://i.loli.net/2020/05/01/gkihqEjXxJ5UZ1C.jpg --- 略。。。。。
评估了下目前导出的文章都用sed+awk方式插入cover,新文章则自行编写时带上,似乎可行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #调试命令,输出文件名和第一张匹配的图图 [root@blog _posts]# for i in `ls *.md`;do echo $i ; awk -F '[()]' '/http(s+):\/\/.*.(jpgpngjpeg)/ {print $2}' $i head -1; echo;done ansible中的block.md https://static.xadocker.cn/wp-content/uploads/2022/05/cfcd624c810f351d970f760a59fa68a0.jpeg ansible中的并发和异步.md https://static.xadocker.cn/wp-content/uploads/2022/05/cfcd624c810f351d970f760a59fa68a0.jpeg ansible发布jar包.md https://static.xadocker.cn/wp-content/uploads/2022/05/cfcd624c810f351d970f760a59fa68a0.jpeg ansible批量修改密码.md https://static.xadocker.cn/wp-content/uploads/2022/05/cfcd624c810f351d970f760a59fa68a0.jpeg
写成脚本如下,不一定通用,博主这里是拿到文章第一张图片设置封面,可能没有,自行新增处理存在或不存在的逻辑哈
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@blog _posts]# cat insert-cover.sh #!/bin/bash for file_name in `ls *.md` do echo ${file_name} cover_text=`awk -F '[()]' '/http(s+):\/\/.*.(jpgpngjpeg)/ {print "cover: "$2}' ${file_name} head -1` echo ${cover_text} echo sed "3i ${cover_text}" -i ${file_name} done # 删除cover配置 [root@blog _posts]# sed '/cover: http.*/d' -i *.md
动态图片接口 开放的动态接口 根据上面操作基本结束封面配置,但是后面用typro写文章时博主又不懒得配链接,审美上看腻了,总是配置那几个关键技术的图图,食之乏味弃之可惜,于是开始整了个动态封面接口,网上挺多的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 樱花:https://www.dmoe.cc/random.php 晓晴博客:https://acg.toubiec.cn/random.php Unsplash Source API Documentation:详情请看官网介绍 夏沫博客:https://cdn.seovx.com/?mom=302 https://cdn.seovx.com/d/?mom=302 https://cdn.seovx.com/ha/?mom=302 二次元随机图:https://api.blogbig.cn/random/api.php 搏天api:https://api.btstu.cn/sjbz/api.php 姬长信API For Docker: ----每日bing:https://api.isoyu.com/bing_images.php ----美女图片壁纸:https://api.isoyu.com/mm_images.php ----网红专栏壁纸:https://api.isoyu.com/beibei_images.php ----动态IP签名图片:https://api.isoyu.com/ip_images.php?signature=早安 ----ARU(阿鲁)表情包:https://api.isoyu.com/ARU_GIF_S.php 樱道:https://api.r10086.com/动漫综合1.php (网站中有更多api接口) 小歪API:https://api.ixiaowai.cn/api/api.php(二次元动漫) https://api.ixiaowai.cn/mcapi/mcapi.php(mc酱动漫) https://api.ixiaowai.cn/gqapi/gqapi.php(高清壁纸) 保罗|API:https://api.paugram.com/wallpaper/ 墨天逸:https://api.mtyqx.cn/tapi/random.php EEE.DOG:https://api.yimian.xyz/img 动漫星空:https://api.dongmanxingkong.com/suijitupian/acg/1080p/index.php 岁月小筑:#https调用https://img.xjh.me/random_img.php #http调用http://img.xjh.me/random_img.php 东方Project:https://img.paulzzh.tech/touhou/random
试了几个,有些已荒废,有些适合收藏不适外露(●ˇ∀ˇ●),看来对于图片的质量和服务可用性还得自己出手了,质量嘛就去ins上淘一点,略。。。
因为考虑到博主不会php,也不考虑php,因为后面博主考虑关闭php~。目前博主能用的只有django,但是这玩意也好重,还是算了。基于目前服务器的负载,博主急需一个轻量的服务,突然间想起好久未使用的技能openresty,锈逗了~~~以下是初步想法
一个静态图片服务
将图片路径存入到redis 集合中
nginx去redis中获取随机值,该值就是图片路径,通过子请求去获取图片
我们来看下如何实现
静态服务 这东西最简单,配个root就行,但是博主得加点限制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 server { listen 80; server_name randimg.xadocker.cn; location / { return 301 https://randimg.xadocker.cn$request_uri; } access_log /home/wwwlogs/randimg.xadocker.cn.json.log json_logs; } server { listen 443 ssl http2; server_name randimg.xadocker.cn; ssl_certificate /usr/local/nginx/ssl/randimg.xadocker.cn/randimg.xadocker.cn.pem; ssl_certificate_key /usr/local/nginx/ssl/randimg.xadocker.cn/randimg.xadocker.cn.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5"; ssl_session_cache builtin:1000 shared:SSL:10m; # openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048 ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem; root /home/wwwroot/randimg.xadocker.cn/; valid_referers blocked *.xadocker.cn *.baidu.com ~\.google\.; if ($invalid_referer) { return 403; } location ~ ^/getImages { # 暴露接口,只能通过这个接口访问 } location ~ ^/internal/images/ { # 调试时可以将其注释直接访问站点root目录类文件 internal; } location / { return 403; } access_log /home/wwwlogs/randimg.xadocker.cn.json.log json_logs; }
将图片名字存储到redis 静态服务目录结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # 当前图片服务目录结构 [root@xadocker randimg.xadocker.cn]# tree -L 4 . `-- internal `-- images -- akb48teamsh `-- 8429494170 `-- weibocos `-- 45280393108 # 样例图片地址 [root@xadocker images]# pwd /home/wwwroot/randimg.xadocker.cn/internal/images [root@xadocker images]# ls akb48teamsh/8429494170/89352102_1063660667326708_8589188623952390983_n.jpg akb48teamsh/8429494170/89352102_1063660667326708_8589188623952390983_n.jpg # 博主这里将akb48teamsh/8429494170/89352102_1063660667326708_8589188623952390983_n.jpg这个做为value存储redis中得集合中
将图片相对路径存入redis集合中 使用find和xargs配合插入,但是xargs -n10 这个参数不生效,导致我redis-cli插入是一个一个插入
但是使用xargs -n10打印倒是能打10个一行,奇怪~~~~
1 [root@xadocker images]# find */ -type f xargs -n10 -i{} redis-cli -a passwordxxxxx sadd myimages {}
查看redis键值
1 2 3 4 5 6 7 8 9 10 11 12 [root@xadocker images]# redis-cli 127.0.0.1:6379> auth passwordxxxxx OK 127.0.0.1:6379> SRANDMEMBER myimages "akb48teamsh/8429494170/301554207_1130519864512854_7745758296285175055_n.jpg" 127.0.0.1:6379> SRANDMEMBER myimages "akb48teamsh/8429494170/272933045_146856814381529_1286943523991638639_n.jpg" 127.0.0.1:6379> SRANDMEMBER myimages "akb48teamsh/8429494170/79644807_2932310016787538_275067540623034722_n.jpg" 127.0.0.1:6379> SRANDMEMBER myimages "akb48teamsh/8429494170/191033593_483170126285325_8916111552677783580_n.jpg"
接下来就是通过lua去redis获取集合随机值了
lua调用redis 使用redis链接池减少链接得创建,此处用到lua-resty-redis模块和redis_iresty第三方提供模块可查看此篇文章:https://www.xadocker.cn/archives/1580.html
使用ngx.location.capture子请求进行内部location调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 [root@xadocker lua]# cat get_random_images.lua local redis = require "comm.redis_iresty" local opts = { host = "127.0.0.1", port = "6379", password = "passworddddd", db = 0, keepalive = 60000, pool_size = 32, } local red = redis:new(opts) --- 获取随机图片路径 local pic_name, err = red:srandmember('myimages') if nil == pic_name then ngx.log(ngx.INFO, "redis key myimages not found", pic_name, err) --- ngx.exit(ngx.HTTP_FORBIDDEN) ngx.header['Content-Type'] = 'text/html' ngx.exit(ngx.HTTP_NOT_FOUND) return else ngx.log(ngx.INFO, "get images: ", pic_name) ngx.header['Content-Type'] = 'image/jpeg, image/png, image/gif' local res = ngx.location.capture("/internal/images/" .. pic_name, { method = ngx.HTTP_GET, always_forward_body = true}) if res.status == 404 then ngx.exit(ngx.HTTP_NOT_FOUND) return else ngx.say(res.body) end end
此处有个坑,就是使用ngx.location.capture去调用http2的服务会报错
1 lua:30: http2 requests not supported yet
搜索了下,说可以是用lua-resty-http模块去处理
最后博主没有采用lua-resty-http,而是取消http2就可以了,注意nginx只要存在一个server配置了http2,那就会导致该server地址下的所有其他server都是http2,要关只能一起关
1 2 3 4 5 # listen上配置http2 listen 443 ssl http2; # listen上关闭http2 listen 443 ssl;
最后的nginx配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 [root@xadocker vhost]# cat randimg.xadocker.cn.conf server { listen 80; server_name randimg.xadocker.cn; location / { return 301 https://randimg.xadocker.cn$request_uri; } access_log /home/wwwlogs/randimg.xadocker.cn.json.log json_logs; } server { listen 443 ssl; server_name randimg.xadocker.cn; ssl_certificate /usr/local/nginx/ssl/randimg.xadocker.cn/randimg.xadocker.cn.pem; ssl_certificate_key /usr/local/nginx/ssl/randimg.xadocker.cn/randimg.xadocker.cn.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5"; ssl_session_cache builtin:1000 shared:SSL:10m; # openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048 ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem; root /home/wwwroot/randimg.xadocker.cn/; valid_referers blocked *.xadocker.cn *.baidu.com ~\.google\.; if ($invalid_referer) { return 403; } location ~ ^/getImages { content_by_lua_file lua/get_random_images.lua; } location ~ ^/internal/images/ { internal; } location / { return 403; } access_log /home/wwwlogs/randimg.xadocker.cn.json.log json_logs; }
至此基本功能以实现,在hexo中就不用为挑选封面发愁了,直接每篇文章配置cover即可,注意需要保证每个接口地址不能一样,否则会导致获得得图片封面都是一样的,所以此处加了个 date +%s%N
进去
1 for i in `ls *.md`;do sed -i -r "2i cover: http://randimg.xadocker.cn/getImages?ts=`date +%s%N`" $i;done
目前先放出跑几天,目前多多少少还是有点问题得,后面得加点限制。。。