Ryan Shang

生死看淡,不服就干

0%

使用服务器部署HEXO博客并配置HTTPS

一、背景

最近老的服务器过期,购买了新的服务器,需要对原有服务器的服务进行迁移,刚好以前部署博客时没有记录,这里记录下在服务器上部署Hexo博客的过程(假设已有Hexo的git工程)。

二、准备工作

1. 大致流程

以前为了简单方便,部署时候采用了Hexo的静态博客方案。

大致使用流程是:

  1. 本地编写Markdown文档
  2. 本地Hexo解析成静态页
  3. 提交到服务器上的Git或者GitHub等多仓库
  4. Nginx对外服务
  5. 用户访问

2. 相关环境

域名:

  • 配置好DNS解析,例如:blog.xxx.com,指向服务器ip

服务器:

  • Git
  • Nginx

PC/Mac:

  • Node
  • Git
  • hexo-cli
  • Markdown编辑器
  • Terminal

Hexo工程:

  • 已经创建好的Hexo工程,执行hexo server,可以按照提示访问开发页面

三、部署过程(以root用户为例)

1. 给服务器增加git用户

1
adduser git

2. 配置SSH公钥登录

配置SSH公钥登录是为了实现类似在Github中配置公钥可以免密码直接操作Git的效果。

先切换用户,然后创建文件:

1
2
3
4
5
su git # 切换到git用户
cd ~ # 切换刀git用户的主文件夹
mkdir .ssh # 创建.ssh文件夹
cd .ssh # 切换刀.ssh文件夹
touch authorized_keys # 创建ssh访问公钥文件

编辑/home/git/.ssh/authorized_keys,配置公钥,这里不做额外赘述。

修改authorized_keys权限:

1
2
exit # 退出git用户,会回到root用户
chmod 644 /home/git/.ssh/authorized_keys # 调整文件权限

3. 创建Git仓库并且配置Git Hooks

创建一个Git裸库(用于保存Hexo构建后的代码):

1
2
3
su git # 切换到git用户
cd ~ # 切换刀git用户的主文件夹
git init --bare blog.git #建立一个名字叫blog.git的裸库

创建一个临时文件夹,用于Git Hooks操作文件用:

1
2
cd ~ # 切换刀git用户的主文件夹
mkdir tmp

配置Git Hooks:

1
2
cd /home/git/blog.git/hooks # 进入git hooks的目录
vim post-receive # 编辑钩子内容

post-receive内容:

1
2
3
4
5
6
7
8
#!/bin/bash
GIT_REPO=/home/git/blog.git
TMP_GIT_CLONE=/home/git/tmp/blog
PUBLIC_WWW=/home/git/blog
rm -rf ${TMP_GIT_CLONE}
git clone $GIT_REPO $TMP_GIT_CLONE
rm -rf ${PUBLIC_WWW}/*
cp -rf ${TMP_GIT_CLONE}/* ${PUBLIC_WWW}

切换回root用户,赋予post-receive执行权限:

1
2
exit # 退出git用户,会回到root用户
chmod +x /home/git/blog.git/hooks/post-receive

4. 配置nginx

/etc/nginx/conf.d中增加一个配置文件blog.conf

1
2
cd /etc/nginx/conf.d # 进入nginx站点配置文件夹
vim blog.conf # 编辑博客站点配置

站点配置:

1
2
3
4
5
6
7
8
server {
listen 80;
server_name blog.xxx.com;
location / {
root /home/git/blog;
index index.html;
}
}

保存后执行nginx -s reload重新加载配置。

5. 在Hexo中配置发布信息

编辑Hexo工程中的_config.yml,增加:

1
2
3
4
deploy:
- type: git
repo: git@blog.xxx.com:/home/git/blog.git
branch: master

在PC/Mac的Hexo工程中,执行构建发布命令:

1
hexo c | hexo g | hexo d

正常情况下,执行完成后,hexo会把构建好的页面push到服务器上刚刚新建的裸库中,然后会触发post-receive钩子,把资源拉取到服务器的/home/git/blog目录中。这时候就可以在浏览器中访问blog.xxx.com来查看博客内容了。

四、配置HTTPS(以root用户为例)

博客配置好了,下一步当然是配置HTTPS了,这里使用certbot来快速配置https证书。

1. 安装certbot

1
apt install certbot -y

2. 使用cerbot申请证书

1
2
3
# 使用方法:certbot certonly --webroot -w [Web站点目录] -d [站点域名] -m [联系人email地址] --agree-tos
# 例如:
sudo certbot certonly --webroot -w /home/git/blog -d blog.xxx.com -m xxx@xxx.com --agree-tos

申请成功会提示:

1
2
3
4
5
6
7
8
9
10
11
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/blog.xxx.com/fullchain.pem. Your cert will
expire on 2017-03-20. To obtain a new or tweaked version of this
certificate in the future, simply run certbot again. To
non-interactively renew *all* of your certificates, run "certbot
renew"
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

证书的保存位置在:

1
/etc/letsencrypt/live/blog.xxx.com/

3. 调整nginx配置

修改/etc/nginx/conf.d/blog.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server {
listen 80;
server_name blog.xxx.com;
rewrite ^ https://$server_name$request_uri? permanent;
}
server {
listen 443 ssl;
server_name blog.xxx.com;

charset utf-8;
root /home/git/blog;
index index.html;

# letsencrypt生成的文件
ssl_certificate /etc/letsencrypt/live/blog.xxx.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/blog.xxx.com/privkey.pem;

ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets on;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 一般推荐使用的ssl_ciphers值: https://wiki.mozilla.org/Security/Server_Side_TLS
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK';
ssl_prefer_server_ciphers on;
}

保存后执行nginx -s reload重新加载配置。

在浏览器中访问http://blog.xxx.com,就会自动跳转到https://blog.xxx.com了。如果是 chrome 浏览器,在地址栏点击小锁的图标,可以查看证书的详情。

4. 自动更新证书

证书是有有效期的,需要再配置下自动更新证书,这样我们就可以不用关心了。

执行crontab -e,增加一行:

1
2
# 每月1号5时执行执行一次更新,并重启nginx服务器
00 05 01 * * /usr/bin/certbot renew --quiet && /bin/systemctl restart nginx

这样在每个月5日的凌晨都会执行一次更新,保证证书不过期。