在Ubuntu服务器部署Nginx和Hexo并加载SSL证书
看这篇文章的你,有自己手动部署博客的想法,应该有一定的技术基础。所以本文略过基础内容,主要记录一下我遇到的一些相对复杂的问题。
服务器
不多作介绍,本来以为阿里建站挺稳的,但是发现新手套餐的2.4GHz实在拖后腿。
开了台以前瞧不起的Vultr,High Frequency 3.8GHz真香。测试完之后,就决定是它了。
- 点我的推广链接注册充值,可以白拿$100 我的推广链接
- 利益相关:我可以拿$25回报
Node.js
建议安装新版本,参看 https://github.com/nodesource/distributions
Hexo
测试运行
官网链接 https://hexo.io/
- 安装
npm install hexo-cli -g
- 切换到你想要放置博客的目录,然后初始化Hexo
hexo init <目录名>
- 切换到刚才初始化的目录,然后安装依赖
npm install
- 此时,已经可以运行Demo了
hexo s
,或者hexo s -p 80
指定端口 - 推荐使用Screen保持Hexo运行
Screen -R hexo
值得一提:Hexo基于Node.js,本质是一个Web程序。包管理、运行以及迁移与普通Node.js程序一致
配置
配置你的博客,参考 https://hexo.io/zh-cn/docs/configuration
主题
默认主题太简陋,选择一个好看的主题吧: https://hexo.io/themes/
本站使用的是 Icarus ,主题的配置教程在其Demo页面可以查看。
Icarus 配置记录
记录一些我遇到的难点
- 生成SVG矢量图。可以采用比较方便的操作,在 Unsplash 等网站下载自己喜欢的图片,然后在 SVGCreator 等网站在线转换为SVG。avatar头像等图片可以在 TinyPNG 压缩后上传。
- ShareThis分享模块。这是Icarus目前默认的分享模块,在 ShareThis 注册登录之后,打开
Image Share Buttons
点击Get The Code
然后把<script></script>
标签中的src
复制到主题的配置文件即可。 - Disqus评论模块。在 Disqus注册后把
Short Name
填入配置文件即可
Nginx
命令 Hexo s
是使用Node.js 内置服务端启动项目。由于配置Https比较繁琐;也难以实现一些个性化配置,例如类似于本站的双语博客。一般不直接使用此内置服务端。
更常用的运行方式是使用Nginx分配或反向代理网络请求。
在Ubuntu中使用apt安装的Nginx,配置文件在 /etc/nginx
中,主体配置文件是 /etc/nginx/nginx.conf
,而网站有关的server配置模块拆分开来放在 sites-enabled
文件夹中,我们主要需要修改的是后者,也就是 /etc/nginx/sites-enabled/default
- sites-enabled 中的文件其实是 sites-available 对应文件的软链接
Nginx 直接作为服务端
因为Hexo是静态博客,只需要将/etc/nginx/sites-enabled/default
中Server的root设置为博客的目录即可。此方法能显著降低博客访问时间,推荐此方法。
1 | server { |
保存后重启Nginx即可访问你的博客:service nginx restart
Nginx 反代Node.js服务端
此方法需要同时运行Nginx和Node.js,因此比上一种方法需要多占用约100MB的内存,并且访问速度大幅增加。
Nginx 反代配置
如果你不需要加载SSL,即Https,你可以如下更改配置:
1 | server { |
在Screen中运行Hexo然后重启Nginx就可以访问你的博客啦:service nginx restart
SSL
2020年了,几乎所有网站都支持Https了,你的博客当然也该支持啦!
SSL证书,有免费也有付费,免费可以拿来玩玩,如果想稳定建站还是推荐付费SSL证书。 本站使用的是NameCheap的PositiveSSL证书,便宜好用。
加载SSL需要三步:
- 生成你的钥匙对
- 证书颁发机构验证你的域名
- 在Nginx上加载SSL
生成钥匙对
在你想要存放的目录输入以下代码,server.key 以及 server.csr 可以改名,妥善保管。
openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr
按照命令提示输入位置名称等内容,需要注意的是
- Common Name 填域名作为验证
- A challenge password 作为保险机制,可以设置一个不会忘记的密码
验证域名
将生成的.csr
的内容复制到颁发机构给的验证窗口,可以选择以下三种方式验证
- Email 如果有域名邮箱,推荐此方法
- DNS 解析一条记录证明你持有此域名
- Http 上传个指定的可以被访问的文件证明你运行此域名。如果没有域名邮箱,而且新增解析的生效时间较长,此方法可能更为方便
Http 方法排坑
如果你在上一步选择方法一,直接使用Nginx作为服务端。你需要上传给定文件到对应目录,然后将/etc/nginx/sites-enabled/default
改成:
1 | server { |
而如果选择的是方法二。你需要上传给定文件到对应目录,然后将/etc/nginx/sites-enabled/default
改成:
1 | server { |
加载SSL
验证成功后,下载证书,将.crt
上传到之前.csr
同目录。然后配置Nginx的443端口。
如果你在上一步选择方法一,直接使用Nginx作为服务端。你需要上传给定文件到对应目录,然后将/etc/nginx/sites-enabled/default
改成:
1 | server { |
而如果选择的是方法二。你需要上传给定文件到对应目录,然后将/etc/nginx/sites-enabled/default
改成:
1 | server { |
建议选择强制跳转Https
重启Nginx就可以访问带小绿锁的博客啦:service nginx restart
其他
至此,本文主要内容已经结束了。说点其他内容吧。
迁移
从阿里云迁移到Vultr,其实很简单。
- 安装Node.js以及Hexo
- 将旧服务器上博客目录打包传至新服务器拆包(包含SSL所需要的文件)
- 安装Nginx并配置
然后启动就可以啦,这就是Node.js的便利性;