
本文最后更新于 天前,文中部分描述可能已经过时。
准备
- 本地:Ubuntu 20.04 LTS
- 服务器: Debian 10
- 已拥有域名
domain.com - 本地Hexo博客可以通过
localhost:4000
正常访问
服务器配置
开启80和443端口
开启80端口
1 | sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT |
开启443端口
1 | sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPT |
环境配置
Git安装
安装git
1 | sudo apt install git |
验证是否安装成功
1 | git --version |
Nginx安装
安装nginx
1 | sudo apt install nginx |
验证是否安装成功
1 | sudo nginx -v |
创建用户
由于Hexo是将生成的网页静态文件通过Git部署到服务器上的,所以我们添加一个新用户
git
,当然了也可以叫别的名字但本文后续部分与git相关名称也改变
添加git用户
1 | adduser git |
设置用户权限
改变sudoers文件的权限为可写
1 | chmod 740 /etc/sudoers |
vim编辑sudoers文件
1 | vim /etc/sudoers |
尾行附加git ALL=(ALL)ALL
改变sudoers文件的权限为可读
1 | chmod 400 /etc/sudoers |
创建SSH登陆密钥
切换到git
用户
1 | su git |
创建.ssh
文件夹
1 | mkdir ~/.ssh |
进入.shh生成ssh密钥
1 | cd ~/.ssh |
将生成的公钥id_rsa.pub
加入authorized_keys
文件
1 | cat id_rsa.pub >> authorized_keys |
将生成的私钥id_rsa
保存至本地.ssh
1 | scp username@server_ip:~/.ssh/id_rsa ~/.ssh/server_ip_username_key |
在本地添加ssh配置文件
1 | vim ~/.ssh/config |
尾行附加
1 | Host server_name |
Host
后为服务器域名Hostname
后为服务器ip地址IdentityFile
后为密钥绝对路径
重新登陆服务器验证是否可以自动登陆(若登陆仍需密码,需检查密钥或密钥文件访问权限是否正确)
创建目录
创建仓库目录
1 | sudo mkdir /var/repo |
/var/repo
为之后将要生成仓库父目录
创建博客静态文件目录
1 | sudo mkdir -p /var/www/blog |
var/www/blog
为博客静态文件的父目录,别的路径也可以,之后的操作要将此目录设置为--work-tree
,也就是说今后每一次部署都再这个目录添加静态文件,同时也是nginx的root虚拟目录。
利用Git Hook自动部署
进入仓库文件夹
1 | cd /var/repo |
创建裸仓
1 | sudo git init --bare blog.git |
创建post-update钩子
1 | sudo vim /var/repo/blog.git/hooks/post-update |
写入命令
1 |
|
--work-tree
后目录为本地部署静态文件到服务器裸仓上后触发钩子自动在此目录增加部署的文件--git-dir
后目录为裸仓目录checkout -f
为本地到服务器裸仓部署后调用post-checkout钩子,根据项目环境调整工作目录,在--work-tree
给定目录下增加文件
更改访问目录及脚本权限
1 | sudo chown -R git:git /var/repo/ |
Nginx配置
80端口监听(HTTP)
查看文件Nginx配置文件路径
1 | sudo nginx -t |
备份配置文件
1 | sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak |
编辑配置文件/etc/nginx/nginx.conf
修改http中的server关键字(没有就添加)
1 | server{ |
listen
监听端口server_name
服务器域名名称(由于最后是443端口进行https访问,可以不写这个关键字)index
指定网站初始页root
虚拟目录位置
保存修改并平滑重启Nginx
1 | sudo nginx -s reload |
这样就可以通过80端口进行HTTP访问了
443端口监听(HTTPS)
编辑配置文件/etc/nginx/nginx.conf
修改http中刚才的80端口server关键字
1 | server{ |
添加
location
关键字及其变量的是让80端口重定向433端口进行HTTPS访问
此外还要加一个443端口的server项
1 | server { |
保存修改并平滑重启Nginx
1 | sudo nginx -s reload |
这样就可以通过固定的433端口访问了,但是想要做到HTTPS还需要进行SSL证书配置
证书文件配置
通过Let’s encrypt其客户端Certbot获取免费SSL证书
安装Certbot
1 | sudo apt install certbot |
创建证书
1 | sudo certbot certonly --manual -d *.domain.com -d domain.com --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory |
按照提示进行填写信息并修改DNS CNAME后会在服务器/etc/letsencrypt/live/domain.com/fullchain.pem
处生成证书文件/etc/letsencrypt/live/domain.com/privkey.pem
处生成密钥文件
创建证书配置文件
创建letsencrypt.conf
1 | sudo vim /etc/nginx/snippets/letsencrypt.conf |
写入配置信息
1 | location ^~ /.well-known/acme-challenge/ { |
创建配置文件需要的目录
1 | sudo mkdir -p /var/www/letsencrypt/.well-known/acme-challenge |
创建ssl.conf
写入配置信息
1 | ssl_session_timeout 1d; |
重新编辑nginx.conf
编辑配置文件/etc/nginx/nginx.conf
在http中80端口server项再引入刚才创建的配置
1 | server{ |
在http中443端口server项再引入刚才创建的配置和其他信息
1 | server { |
保存修改并平滑重启Nginx
1 | sudo nginx -s reload |
至此nginx配置完成
禁用git用户ssh登陆
1 | sudo vim /etc/passwd |
最后一行git配置将/bin/bash
修改为/usr/bin/git-shell
这样就可以禁止git用户通过ssh登陆了,之后退出服务器
Hexo生成静态文件并部署
编辑博客目录_config.yml
文件
修改部署配置
1 | deploy: |
repo
仓库位置
在博客目录执行
1 | hexo g -d |
g
为generate
生成静态文件d
为deploy
通过git部署静态文件
这样就可以通过domain.com
访问博客了