预先准备

  1. 一台VPS,可见如何购买VPS及购买后的安全措施
  2. 一个DNS解析到VPS的域名,可见如何拥有一个域名
  3. 本地搭建好的Hugo博客,可见极简Hugo搭建个人博客笔记
  4. 使用Nginx作为网站服务器,可见Install Nginx Ubuntu16.04

如果一切就绪,那让我们现在开始吧~

Git部署

1
$ hugo # 在博客目录下生成了public文件夹,这就是博客网站的目录

ssh登录到VPS,我们需要修改Nginx配置文件,在目录/etc/nginx/nginx.conf下,以sudo权限修改,找到http段,修改以下项:

1
2
3
4
5
6
7
8
server {
        listen 80;
        server_name your_blog_domain_name;
        root /usr/share/nginx/html;
        location / {
                index index.html;
        }
        error_page 404 /404.html;

将include /etc/nginx/sites-enabled/*;注释掉,否则网站的默认目录会是/var/www/html,而不是/usr/share/nginx/html了。

既然是使用Git完成博客的部署,VPS上首先应先安装Git,此处略过。依次执行:

1
2
3
4
$ cd ~ # 回到用户目录
$ mkdir blog && cd blog # 此处以目录名blog为例,可自行修改
$ git init --bare && cd hook && touch post-receive # 创建裸仓库,并创建Git hook文件
$ vim post-receive # 用你喜欢的编辑器打开post-receive文件并写入以下内容:
1
2
3
4
5
6
7
8
#!/bin/sh 
GIT_REPO=/home/your_user/blog
TMP_GIT_CLONE=/tmp/blog
NGINX_HTML=/usr/share/nginx/html
rm -rf ${TMP_GIT_CLONE}
git clone $GIT_REPO $TMP_GIT_CLONE
rm -rf ${NGINX_HTML}/*
cp -rf ${TMP_GIT_CLONE}/* ${NGINX_HTML}

关于git hook的工作原理,可以查看自定义 Git - Git 钩子

保存文件后添加可执行权限sudo chmod +x post-receive,每当blog仓库有push更新,Git钩子可以自动将更新拷贝到先前设置的Nginx网站目录中去,使网站内容更新。我们还需要修改网站文件夹/usr/nginx/html的所有权为你所拥有:sudo chown your_user:your_user /usr/share/nginx/html

本地仓库建立

在博客的public目录下:

1
2
3
4
5
6
7
$ cd public
$ git init
$ git add --all
$ git commit -m "Initial blog repo"
$ git remote add origin your_user@IPAddress:/home/your_user/blog
$ git remote set-url origin ssh://your_user@VPS_IP:Port/home/your_user/blog # 若VPS的ssh默认端口不是22,需另设置ssh端口。
$ git push origin master

以上便完成了Hugo在VPS上的部署,下面我们更进一步,为自己的网站添加HTTPS支持。

添加网站HTTPS化,Let’s Encrypt!

前言

Let’s Encrypt是一个于2015年三季度推出的数字证书认证机构,旨在以自动化流程消除手动创建和安装证书的复杂流程,并推广使万维网服务器的加密连接无所不在,为安全网站提供免费的SSL/TLS证书。–wikipedia

第一步,安装Certbot

Certbot是Let’s Encrypt推出的自动化配置工具,我们通过添加官方源来下载它。

1
2
3
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-nginx

先前我们已经设置了Nginx所要配置的网站域名,可以通过以下命令查看有没有配置错误。

1
$ sudo nginx -t

第二步,调整防火墙设置

1
2
3
4
$ sudo ufw status # 查看ufw状态
$ sudo ufw allow 'Nginx Full' # 开启Nginx HTTP和HTTPS支持
$ sudo ufw delete allow 'Nginx HTTP' # 关闭先前设置的HTTP,避免和Nginx HTTP重复
$ sudo ufw status

第三步,获取SSL证书

1
$ sudo certbot --nginx -d your_domain_name

Certbot使用nginx插件,选项-d指定需要使用SSL证书的域名。一路回车,输入联系邮件地址,Certbot工具会自动完成证书的注册和部署。之后再重新打开网站,应该就会看到网站首部的绿色安全标记了。

确认Certbot自动更新

Let’s Encrypt只有三个月的有效期,这时为了督促用户及时更新网站的安全设置而考虑的。Certbot工具在/etc/cron.d/目录下设置了自动任务,可以以一天两次的频率确保证书不过期,我们来测试一下自动更新。

1
$ sudo certbot renew --dry-run

一切顺利的话将会看到模拟自动更新成功。如果当后续的自动更新失败的话,Let’s Encrypt会向我们先前设置的邮箱地址发一封警告邮件,至此,网站的HTTPS化完成。

参考资料

  1. VPS+hugo+Nginx博客搭建全过程
  2. How To Set Up Let’s Encrypt with Nginx Server Blocks on Ubuntu 16.04