使用NAS捣鼓一个个人博客

cec6e8b8af8824fea4a09493bb989be

设备情况

双十一购入了一台绿联DX4600+,搭配购入3块西数4T紫盘组了一个RAID5存储阵列,用来存放一些重要资料,空余的一个机械硬盘位装了一块之前笔记本拆下的西数500G硬盘,用来当做Docker的工作目录,由于Docker所在的存储空间不能进行硬盘休眠,所以单独使用了一块硬盘来搞。机器本身自带8G内存,又安装了一条之前笔记本拆下的4G内存,扩展到12G内存。固态空间的话,本来打算把之前笔记本拆下的128G固态硬盘也插上,但是后来发现时间长了没使用,已经坏了不能用了,u1s1,固态硬盘真是容易坏啊……

lQLPJwGu8tc4ch7NAaTNBUawwQuvfT-ZIykEZLzeNYDOAA_1350_420
最后一顿折腾完之后设备的配置情况为

设备:绿联DX4600+
处理器:Intel® Celeron® Processor N5105
核心:4核4线程
架构:X86
内存:12G(8G + 4G)
硬盘:12.5T(4T + 4T + 4T + 500G)
存储空间:8.5T(8T 主存储空间 + 500G Docker空间)

看了一圈下来,这是外观最漂亮的一款了!
c94f6915db34147dd2704f0d14240358_720

Docker配置

由于默认的官方镜像源DNS被污染了,经常无法拉取镜像。

方式一:使用Docker Desktop下载tar文件,再导入NAS

最开始在Windows下安装了一个Docker Desktop,本地挂上梯子,然后在cmd中使用docker pull命令拉取镜像,然后再使用docker save -o命令下载成tar文件,再导入到绿联DX4600+的Docker镜像仓库中,虽然可以使用,但是步骤比较繁琐。

方式二:切换镜像源

联系绿联私有云技术支持,给提供了下面的自定义镜像源,替换后确实好使,可以直接从NAS的Docker中直接拉取镜像了,非常方便

https://docker.nju.edu.cn,https://registry.cn-hangzhou.aliyuncs.com,https://mirror.ccs.tencentyun.com,https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com,http://hub-mirror.c.163.com,http://f1361db2.m.daocloud.io

博客搭建

Wordpress

一开始使用Wordpress+MySQL搭建了一个博客,但是搭建完成之后发现Wordpress博客比较臃肿,虽然有很多主题可以选择,但是自己很难对其中的一些样式进行调整,一旦选择了某个主题,样式就基本固定了,而且很难找到一个非常中意的主题。

Typecho

使用Typecho+MySQL搭建了一个新的博客,但是这个博客的样式过于简单,也是很难装饰成自己想要的样子。

Halo

偶然间发现了一个非常漂亮的博客,名字叫微光,使用Halo+Dream主题实现,正是我想要的样子,于是也用Halo&Dream搭建了第三版博客,于是开始装修这个博客。

HaloPlus

又在一个偶然间,发现了Dream主题开发者的博客,名字叫玖涯博客,这个博客的文章页居然有弹幕评论,原来是这位大佬针对Halo做了升级开发了一个HaloPlus,于是又把之前的第三版博客推翻,搭建了第四版博客,也就是现在看到的这个,使用HaloPlus&Dream实现,后来又对里面的主题样式进行了一系列的设置,使得博客界面看起来比价美观。

内网穿透

博客搭建完了,但是只有局域网可以访问,外网还是无法直接访问,各家厂商的NAS都没有对Docker容器做穿透的支持,只能自己想办法去实现了。

DDNS-GO

这个工具应该不属于内网穿透的工具,但是网络环境可以获取到公网IP的话,这个方式应该是最好的。

DDNS-GO是一个动态域名解析工具,如果我们的设备可以获取到公网IPv4地址或者公网IPv6地址的话,由于公网IP会不定期的发生变化,我们可以使用这个工具来将自己的域名与设备获取到的公网IP进行绑定,即使公网ip发生变化,这个工具也可以自动将域名解析到新的公网ip地址上。

其工作原理就是,它需要获取到你域名解析(DNS)服务商的token权限,在设备后台定时获取设备的公网ip地址,如果监测到地址发生改变,它就自动去DNS服务商那里更新解析地址,这样我们就不需要为公网IP经常发生变化而发愁了。

但是,这个方式的前提非常重要,是你当前的网络环境可以获取到公网IPv4或公网IPv6地址才行,否则免谈。

公网IPv4地址:非10、172、192开头的地址
公网IPv6地址:240开头的地址

验证地址是否可用
IPv4:外网环境下,使用IPv4地址:端口号的方式访问服务,可以访问到,则是可用的公网IPv4地址。
IPv6:外网环境下,使用[IPv6地址]:端口号的方式访问服务,可以访问到,则是可用的公网IPv6地址(这个也需要客户端设备的网络支持IPv6才可以)。

这里就不得不说一种特殊情况了,由于我这里用的是房东提供的网口,插上路由器之后是使用路由模式动态IP上网,这样网络的拓扑就是运营商下发的宽带先经过了房东那里的路由器先行解析了一次,然后我这里是基于房东路由器下的局域网再次经过我的路由器解析,即使拿到了公网ip,也找不到我这台设备。所以我现在设备可以拿到公网IPv6地址,但是外网环境下访问不到Nas中的Docker应用。

之前看到一篇帖子,介绍了这种多级路由的环境下如何可以获取到可用的公网地址,方式为:直接连接运营商宽带的路由器设置为桥接模式,由子级路由器进行拨号上网,这样就可以拿到可用的公网IP地址了,因为租房的条件也没法更改上级网络环境……

DDNS-TO

DDNS-TO是一个提供内网穿透的服务商,免费试用7天,长期需要付费使用。4Mbps的穿透服务为¥26/年,8Mbps的穿透服务为¥78/年。
优点:

  1. 穿透局域网内不同设备或不同服务很方便,在NAS的Docker中部署一个ddnsto容器用于跟DDNS-TO服务器连接,即可在DDNS-TO的配置页面添加多条隧道,很方便的访问NAS中的不同Docker容器,或者穿透访问路由器管理页面。
  2. 提供了http和https两种访问方式,不用自己解决证书问题。

缺点:需要密码或扫码认证后才可以访问页面,这样就不利于博客场景的使用。

image

SAKURA FRP

SAKURA FRP又名樱花,也是一个提供内网穿透的服务商,提供2条长期免费的隧道可以使用,带宽限速10 Mbps,流量的话,可以签到获取,也可以购买。

image-1702367198654
image-1702367247345

优点:

  1. 不需要认证就可以直接穿透访问应用
  2. 可以免费使用,并且带宽速度还可以

缺点:

  1. 除免费的两条隧道外,再购买隧道和流量价格相比于DDNSTO更贵一些
  2. 想要穿透多个应用需要在Docker中创建多个frpc容器来创建隧道,部署起来比较麻烦,而且无法穿透访问其他设备(路由器等)

花生壳、蒲公英

这两个需要单独购买设备,花生壳是普通的内网穿透,需要经过贝锐服务器转发,价格高带宽低,不是很划算;蒲公英是点对点穿透,不经过贝瑞服务器转发,但是需要先建立P2P连接,不支持直接访问,就不考虑这个了。

最后

最后,使用了免费的SAKURA FRP樱花穿透,再把自己的域名解析到樱花给分配的域名上,但是有2个问题

  1. 有一个很长的端口号,每次访问都需要拼接在域名后面。
  2. 一直没有配置好SSL证书,导致每次访问都会被拦截,提示网站不安全,也是很不方便。

image-1702366716118

Cloudflare托管隐藏真实端口,自动配置SSL证书

一个偶然的机会,看到一个帖子,使用Cloudflare托管域名实现隐藏实际的端口,使得网站更加安全。于是将阿里的域名解析托管到Cloudflare上,配置了自动HTTPS,并且配置了端口重写。然后发现,这样配置之后证书问题也解决了,一举两得。
image-1702369097903

网站访问加速问题

到这一步,网站访问速度还是不理想,内网环境直接访问也不是很快,简单分析了一下

1. 部分图片文件太大,导致浏览器加载速度过慢

由于图片都是网站下载的4K、8K高清图片,每张图片都在十几甚至几十Mb,使用Photoshop对文件处理了一下,文件缩小了一些,但是还是在几Mb,后来发现微信发送非原图,压缩质量比较高,文件基本都可以压缩到1Mb以下,并且画质不会损失太严重。再替换到网站中,网站访问速度有了一定的提升。

2. 机械硬盘读取文件速度瓶颈导致获取资源速度不理想

又购置了一根512G樊想固态硬盘,一开始将这跟固态硬盘设置为了docker空间的缓存空间,网站访问速度当时就有了很明显的提升。但是后来了解到固态硬盘有一定的写入最大量,超过这个阈值就非常容易损坏,并且如果直接将docker放在固态上的话,速度应该跟之前的方式不相上下,甚至可能更快,于是又将docker空间迁移到固态硬盘上,迁移之后访问速度与使用固态做缓存相比没有很明显的变化,但是这样固态硬盘可以尽其所用,最终还是使用固态直接放置docker了。

这里使用了绿联nas的数据迁移功能和haloplus的整站备份功能,非常方便的迁移了docker的存储空间。

3. nginx反向代理配置ServiceWorker,开启并发CDN

这是 SW 要做的第一件事,一些免费 CDN 目前可能不是很稳定,例如 jsDeliverSW 中收集了多个 CDN 源,将一个请求转换成并发对多个CDN源的请求,然后以最早响应的请求为准,获得响应后 SW 将对请求进行缓存。这么做出了避免 CDN 源站异常外,也为了提高网站访问速度。

使用cym1102/nginxwebui镜像搭建nginxwebui,在里面配置反向代理

load_module /usr/lib/nginx/modules/ngx_stream_module.so;
worker_processes auto;
events {
    worker_connections  1024;
    accept_mutex on;
  }
http {
  include mime.types;
  default_type application/octet-stream;
  server {
    listen xxx30;
    location / {
      proxy_pass http://192.168.xxx.xxx:xxx20;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
    }
    location ~ ^/sw.min.js {
      rewrite ^/(.*) /themes/dream/source/js/$1 break;
      proxy_pass http://192.168.xxx.xxx:xxx20;
      proxy_set_header HOST $host;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }
}

访问https://域名/sw.min.js,可以访问到配置文件,在博客配置里开启并发CDN

image-1704720718843

END

最后大功告成,可以直接使用https://blog.haojianxiang.top访问Nas中的博客了!