一、背景 最近老的服务器过期,购买了新的服务器,需要对原有服务器的服务进行迁移,刚好以前部署博客时没有记录,这里记录下在服务器上部署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日的凌晨都会执行一次更新,保证证书不过期。