缘起
之前的hexo是创建在国内的腾讯云上的,当时撸羊毛,学生机一年40。眼看着要到期了,打算把博客环境迁移到国外的一台小主机上。主要那台小主机我本来就有,是刚需,且价格一年70左右,比腾讯云良心很多。
迁移的主要原因是网站的访问速度太慢了,有人反映半天加载不出来。托管在github上的网页确实是这样的,网速时好时坏。所以我打算把网页直接运行在自己的国外主机上,然后用cloudflare的cdn给网站加速、加密,这样比Github绝对是要快的。
网络代理
国外的小主机,ip已经被封死了。为了能ssh到它,需要挂梯子,然后在本机上走网络代理去ssh它。
xshell自带网络代理功能,但是我的编辑器vscode没有自带的网络代理。写博客vscode又必不可少。所以我搜了些文章,给vscode的国外主机远程配置里边添了一行:
1 | #走代理 |
这里的ncat是一个软件,我看过了,必须安装它。然后端口根据个人情况,一般梯子里都会看到本地socks5是哪个端口。
这一行添加之后,就可以用vscode远程ip被墙的主机了。
Hexo工程迁移
Hexo的工程文件都还是在本地的,只有public文件夹下生成的静态文件是托管在github的,所以不能直接从Github克隆整个hexo工程。
最简单的方法是直接拷贝包含以下几个重要的文件、目录的Hexo文件夹到到新的机器上,其他的都丢掉:
1 | _config.yml |
然后重复之前的工作,安装node/npm/hexo-cli…
这个时候hexo-deployer-git其实没必要装了,想装也能装。
由于新主机是国外的,各种源也都是国外的,这次直接参考这篇文章里的第一个nvm方法,直接从就把node和npm装好了,速度快得一批,不像之前在腾讯云上遇到各种问题。
此时,hexo工程就已经完整的迁移好了。
用nginx部署Hexo
原本以为直接在新机器上hexo s -p 80
就能搞定,结果试了下没这么简单。搜了一下,基本都用了nginx,有修改hexo自身文件的方法,我不想改动hexo自身的文件太多。
- 先下载nginx
1 | apt install nginx |
- 看看配置文件在哪
-t 是test的意思,让nginx测试一下自己的配置对不对。会显示配置文件的位置“/etc/nginx/nginx.conf”。vscode里直接单击这个文件,就能打开编辑。
1 | root@racknerd-88d4c8:~/blog# nginx -t |
- 修改nginx配置
首先,把第一行改成:
1 | user root; |
因为我的博客都放在root目录下。
然后,在http {...}
里边加上一段:
1 | server { |
重点是端口443,域名设置,ssl证书位置(我的证书虽然名字是二级域名,但是实际上是通用域名,适用所有的*.jixinlong.top(我的猜的))。
重中之重是站点目录,要写到public目录下。假如还想实现http自动跳转https,再加下边一段,和上边的并列。
1 | server { |
最后,service nginx restart
,开启nginx。此nginx服务运行在国外主机的443端口后,并能将80端的访问改到443。外置cloudflare的cdn加速解析,将域名www.jixinlong.top解析到主机ip:443上。```sudo systemctl enable nginx```可以设置nginx开机自启动。
爷从此和腾讯云说拜拜了。
用nginx部署其他服务
上一节中,nginx被配置成监听443端口,并让443端口和系统位置“/root/blog/public/”下的静态网页关联起来,实现nginx对hexo所生成的静态的网页的代理。该方法实际上是用自己的nginx服务替换了github pages的托管服务。
nginx还可以有其他代理方式。例如,也可以直接执行hexo s
命令,让hexo运行一个在4000端口后的网页服务。然后将域名www.jixinlong.top在443上的location改成:
1 | location / { |
这样便很容易的将https://www.jixinlong.top和本地已经能成功运行的hexo自带服务器关联起来。hexo仅负责提供网页内容,https所需要的证书依然是在nginx中配置。
受此启发,一个服务器上便可以架设更多的服务或应用,这些服务先都在本地不同端口下调试成功。同时,设定不同的域名来对应不同的服务,虽然这些域名解析到同一个ip,但是可以在nginx里设置,让他们对应上服务器上不同端口后的服务。例如,www.jixinlong.top用于个人博客,master.jixinlong.top用于挂导师评价网的静态文件:
1 | server { |
!!! 1 注意,在原先已经为jump.jixinlong.top配置过ssl证书的基础上,新增二级域名来对应服务器上新的服务时,无需重新申请ssl证书,只需要在域名解析那里用一个CNAME记录将新域名指向原域名。即:
jump.jixinlong.top(申请ssl证书)–> 真实ip https访问网站成功
再添加功能:
www.jixinlong.top –> jump.jixinlong.top nginx代理www.jixinlong.top
master.jixinlong.top –> jump.jixinlong.top nginx代理master.jixinlong.top
nginx检查第一次输入CNAME前的域名来区分不同的服务,而ssl证书主要看CNAME的最终域名。
禁用IP直接访问网站
网站到IP的解析已经被加密。
为了防止IP暴露时有人反向试探出该IP上的网站,需要在nginx里设置禁用IP直接访问网站。单独添加以下两段:
1 | #http |
其含义是,涉及80端口和443端口上的访问默认展示403界面。配合着其他“server”段对 域名-代理端口-服务地址或端口 的明确指定,就能保住用户指定的域名访问之外所有访问都返回以403。