背景
所谓“云服务器”,就是运行在云上的一个虚拟机,可供用户远程连接后像一台普通 PC 那样去使用。有意思的是,之前不去了解还不知道:其实就是这么个玩意儿,现国内几大厂商提供这类产品时,起的名字都不一样:华为云的叫 Elastic Cloud Server(ECS) ;腾讯云的称 Cloud Virtual Machine(CVM) 或 Lighthouse ;而阿里云则是 Elastic Compute Service(也是 ECS) 。看着唬人,实际上都一回事。
一开始我的个人博客是借助 Gitee Page 服务搭建的。后来使用该服务需要提供的个人信息也越来越多,包括身份证照片和本人手持身份证照片这种敏感信息。我心想,这要求跟自己弄个云服务器建站备案也没区别了。与其通过第三方将这些个人信息交给管理部门,还不如直接由我自己来交,减少个人信息的暴露面。于是就将自己的个人博客迁移到了云服务器上。要做的事情主要包括:
- 购买带公网 IP 的云服务器(个人博客对性能要求很低,买最便宜的就行)
- 做一些配置(见下文所述)
- (可选)购买域名,绑定公网 IP,并按要求完成工信部备案+公安备案1
配置过程
-
登录自己的云服务器(通过 SSH 公网 IP,或其他由云厂商提供的手段)
1ssh root@<CLOUD_SERVER_PUBLIC_IP> -
创建名为 git 的用户,为其创建家目录
1useradd -m git -
在该用户的家目录下创建一个裸仓(bare repo):
hugo.git,和一个(准备用来放 working tree 的)目录:~/hugo/1su git 2cd # go to $HOME dir 3git init --bare hugo.git 4mkdir hugo另外,要开放家目录的访问权限,后续供以 root 身份运行的 nginx 获取网页:
1chmod +x $HOME -
配置钩子脚本
1cat > hugo.git/hooks/post-receive <<- EOF 2 git --work-tree=/home/git/hugo --git-dir=/home/git/hugo.git checkout -f <BRANCH> 3 cd /home/git/hugo 4 hugo 5EOF 6 7# 赋予脚本可执行权限 8chmod +x hugo.git/hooks/post-receive脚本会调用
hugo生成网页,因此需要在hugo/中提前设置好用于承载生成结果的public/。这里我们将其配置为一个软链接:1ln -s ../site_build public将生成结果与博客源码分开存放。
-
安装并配置 Nginx
1apt install nginx随后编辑
/etc/nginx/sites-available/default文件,将其中的root从/var/www/html改为承载生成网页的目录/home/git/site_build。最后重启服务:1systemctl restart nginx -
配置 SSH 公钥
先拷贝本地的 SSH 公钥
1cat ~/.ssh/id_rsa.pub然后将其拷贝至云服务器上 git 用户的
.ssh/authorized_keys文件中:1# do as user 'git' 2mkdir ~/.ssh 3touch ~/.ssh/authorized_keys 4chmod 600 ~/.ssh/authorized_keys -
将本地(经 hugo)生成的博客网站推送至云服务器
1cd <HUGO_SITE_DIR> 2git add . && git commit -m "XXX" 3git remote add my-site git@<CLOUD_SERVER_PUBLIC_IP>:/home/git/hugo.git 4git push my-site <BRANCH>
完成!最后用浏览器直接输入公网 IP 就可以访问到网站啦~当然,若购买了域名,绑定 IP 并完成备案之后,通过域名访问就更方便了。
更新博客
由于我们让 hugo.git/hooks/post-receive 脚本调用 hugo 生成网页,因此每当我们向云服务器推送博客源码后,便会触发该脚本自动更新博客。
调试手段
如果按照上述步骤配置完成后,访问网站仍然有问题,则可以在 /etc/nginx/sites-available/default 中增加错误日志的输出:
1server {
2 ...
3 location / {
4 try_files $uri $uri/ =404;
5 }
6 error_log logs/error_site.log error; # ADD THIS
7}
重启 nginx 后,错误日志就会被输出到 /usr/share/nginx/ 下的 logs/error_site.log 中。路径涉及到目录的要提前创建好。
参考资料
- tiiaan 的 CSDN 博客:使用 Hugo 和阿里云ECS搭建个人站
- Git 文档:git-worktree
-
注意:若想通过域名访问则需要备案,只用公网 IP 的话无所谓。 ↩︎