一、背景 最近老的服务器过期,购买了新的服务器,需要对原有服务器的服务进行迁移,刚好以前部署博客时没有记录,这里记录下在服务器上部署Hexo博客的过程(假设已有Hexo的git工程)。
二、准备工作 1. 大致流程 以前为了简单方便,部署时候采用了Hexo的静态博客方案。
大致使用流程是:
本地编写Markdown文档 
本地Hexo解析成静态页 
提交到服务器上的Git或者GitHub等多仓库 
Nginx对外服务 
用户访问 
 
2. 相关环境 域名:
配置好DNS解析,例如:blog.xxx.com,指向服务器ip 
 
服务器:
PC/Mac:
Node 
Git 
hexo-cli 
Markdown编辑器 
Terminal 
 
Hexo工程:
已经创建好的Hexo工程,执行hexo server,可以按照提示访问开发页面 
 
三、部署过程(以root用户为例) 1. 给服务器增加git用户 2. 配置SSH公钥登录 配置SSH公钥登录是为了实现类似在Github中配置公钥可以免密码直接操作Git的效果。
先切换用户,然后创建文件:
1 2 3 4 5 su git  cd  ~ mkdir  .ssh cd  .ssh touch  authorized_keys 
编辑/home/git/.ssh/authorized_keys,配置公钥,这里不做额外赘述。
修改authorized_keys权限:
1 2 exit  chmod  644 /home/git/.ssh/authorized_keys 
3. 创建Git仓库并且配置Git Hooks 创建一个Git裸库(用于保存Hexo构建后的代码):
1 2 3 su git  cd  ~ git init --bare blog.git   
创建一个临时文件夹,用于Git Hooks操作文件用:
配置Git Hooks:
1 2 cd  /home/git/blog.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  chmod  +x /home/git/blog.git/hooks/post-receive
4. 配置nginx 在/etc/nginx/conf.d中增加一个配置文件blog.conf:
1 2 cd  /etc/nginx/conf.d 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 2. 使用cerbot申请证书 1 2 3 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;      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  '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 00 05 01 * * /usr/bin/certbot renew --quiet && /bin/systemctl restart nginx 
这样在每个月5日的凌晨都会执行一次更新,保证证书不过期。