Hugo部署历程
情景描述
使用 WordPress 写博客有一个学期了,博客没写几篇,Nginx 和 WordPress 倒是折腾了不少。也是嘛,如果不是折腾了一个学期的 Nginx,这次学校网络更新架构,要给城市热点的服务分配域名,然后那个端口问题还真搞不定了。
不过,WordPress 的写作体验是真的不太好。不仅没有 MarkDown 写着舒服,每天还要担心有没有人进行网络渗透。WordPress 的速度的确不算快,我上了缓存插件,直接生成静态页面,然后还配置了 tmpfs。
现在,我决定迁移到 Hugo,纯静态网站,你来入侵啊。Hugo 生成的网站文件,我还给放到了 tmpfs里,起飞吧,哔u哔u。
安装相关软件
首先是安装 Hugo,这个建议不要使用包管理器直接安装,建议到 GitHub 下载编译好的二进制安装包,实在不行,自己编译也好。
可以到 https://github.com/gohugoio/hugo/releases 下载。
以 DEB 系的 32位 Linux 为例,首先下载 deb 包:
wget https://github.com/gohugoio/hugo/releases/download/v0.47.1/hugo_0.47.1_Linux-32bit.deb
然后进行安装
sudo dpkg -i hugo_0.47.1_Linux-32bit.deb
然后安装 Git、Nginx,这个直接安装就好
sudo apt install -y git nginx
配置 MathJax
我所使用的 Hugo 主题已经支持了 MathJax,不过是从 CDN 那里加载的 MathJax 文件。而我想让所有的文件都在我自己的服务器上,于是我就魔改了一下下主题。这里对其他 Hugo 用户应该也有些参考价值。
首先是下载 MathJax,不要直接复制 CDN 里的链接,这是无效的。
wget https://github.com/mathjax/MathJax/archive/master.zip
解压这个压缩包,然后将这个压缩包里的内容移动到你的 Hugo 网站的目录下,最好为这些文件创建一个叫做 MathJax 的目录。我的放在了 static/lib/MathJax 下面,最终生成网站后,应该在 /lib/MathJax 下面。
编辑 local.js 文件,这个文件应该在 MathJax/config/local 里。
MathJax.Ajax.loadComplete("/lib/MathJax/config/local/local.js");
这里配置为 MathJax 在你的网站的位置。
然后你要想办法在你的生成的静态 Html里加上如下几行:
<script type="text/javascript">
window.MathJax = {
tex2jax: {
inlineMath: [['$','$'], ['\\(','\\)']],
displayMath: [['$$','$$'], ["\\[","\\]"]],
processEscapes: true
},
TeX: {equationNumbers: {autoNumber: "AMS"}},
showProcessingMessages: true,
messageStyle: 'none'
};
</script>
<script type="text/javascript" async src="/lib/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML,/lib/MathJax/config/local/local.js"></script>
注意最后那个引用 MathJax 的链接,建议你查查 MathJax 的文档。
以下是一个测试例子:开源中国不支持 MathJax?
$$ \sum_1^2 $$
\sum_1^2
使用 Git 发布文章
首先配置一下服务器端的 Git。我的做法是直接上传本地的 Git 配置文件。毕竟这个配置用了两年了。但是,仅仅这样还是不够的。
在服务器上找个目录放你的网站,然后:
git init
git add -A
git commit -m "迁移博客到 Hugo"
这些都是常规操作了。不过这个时候,本地的 push 操作是失败的。没错,之所以说使用本地的配置不够是因为,本地的配置少了一些。
[core]
autocrlf = input
[receive]
denyCurrentBranch = ignore
第一个配置是转换 Linux 的换行符与 Windows 的换行符,否则就会一直提示,很烦的。第二个配置是关键。进行 push 时,如果远程库是非 bare 库,本地 push 会被禁止。所以,加上这个配置,本地的 push 会同步过去,但是远程的文件内容不会更改。
其实,到了这里就结束了。
之后,本地的更改直接 push 就好了,然后 ssh 到服务器,直接检出、合并、构建就完事了。
这里提一下具体操作
git log
git status
git checkout dca8b26 .
hugo
首先查看我们提交的历史,以及版本号。然后我们看看此时仓库的状态。可以看到我们提交成功了,并且已经到了暂存区里,但是工作区还未同步。所以只要从暂存区同步出来就好。所以使用 checkout 将 dca8b26 的改动应用到工作区,也就是那个 . 了。
使用 Nginx 部署网站
一个静态网站,有啥好配置的。直接贴出来。
server {
listen 0.0.0.0:443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate /website/nginx/sslcert/www.pem;
ssl_certificate_key /website/nginx/sslcert/www.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
server_name www.huanggefan.cn;
root /website/www.git/public;
index index.html;
access_log /website/log/www-access.log main;
error_log /website/log/www-error.log;
location ~* \.(jpg|jpeg|png|icon|bmp|gif|tty|js|css)$ {
access_log off;
log_not_found off;
}
error_page 404 403 500 502 503 504 /404.html;
}
使用内存进行加速
Hugo 默认会把构建的静态网站文件放到 public 目录下,我觉得这样挺好的,也没有更改路径。Ubuntu有一个特性,就是 /dev/shm 其实是个目录,而且,是在内存里的一个目录,这个目录有内存的一半大。所以,我就直接在这里创建一个目录,通过软链接,链接到 public。这样,public 其实就在内存里了。Hugo 也就是把静态网站文件放到了内存里了。
阿里云 ECS 的磁盘性能不是很好,不过内存性能很好,这样算是进行了最大化的性能优化。