Debian搭建Hexo博客流程

2020-07-27
Cover Image

本文最后更新于 天前,文中部分描述可能已经过时。

准备

  • 本地: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
2
$ cd ~/.ssh
$ ssh-keygen

将生成的公钥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
2
3
Host server_name
Hostname server_ip
IdentityFile ~/.ssh/server_ip_username_key

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
2
#!/bin/bash
git --work-tree=/var/www/blog --git-dir=/var/repo/blog.git checkout -f

--work-tree后目录为本地部署静态文件到服务器裸仓上后触发钩子自动在此目录增加部署的文件
--git-dir后目录为裸仓目录
checkout -f为本地到服务器裸仓部署后调用post-checkout钩子,根据项目环境调整工作目录,在 --work-tree给定目录下增加文件

更改访问目录及脚本权限

1
2
3
$ sudo chown -R git:git /var/repo/
$ sudo chown -R git:git /var/www/blog
$ sudo chmod +x /var/repo/blog.git/hooks/post-update

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
2
3
4
5
6
server{
listen 80;
server_name domain.com;
index index.html;
root /var/www/blog
}

listen监听端口
server_name服务器域名名称
index指定网站初始页(由于最后是443端口进行https访问,可以不写这个关键字)
root虚拟目录位置

保存修改并平滑重启Nginx

1
$ sudo nginx -s reload

这样就可以通过80端口进行HTTP访问了

443端口监听(HTTPS)

编辑配置文件/etc/nginx/nginx.conf修改http中刚才的80端口server关键字

1
2
3
4
5
6
7
server{
listen 80;
server_name domain.com;
location / {
return 301 https://domain.com$request_uri;
}
}

添加location关键字及其变量的是让80端口重定向433端口进行HTTPS访问

此外还要加一个443端口的server项

1
2
3
4
5
6
7
8
9
10
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name domain.com;
index index.html;
root /var/www/blog;
location / {
try_files $uri $uri/ =404;
}
}

保存修改并平滑重启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
2
3
4
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/letsencrypt;
}

创建配置文件需要的目录

1
sudo mkdir -p /var/www/letsencrypt/.well-known/acme-challenge

创建ssl.conf
写入配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

ssl_protocols TLSv1.2;
ssl_ciphers EECDH+AESGCM:EECDH+AES;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;

ssl_stapling on;
ssl_stapling_verify on;

add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
}

重新编辑nginx.conf

编辑配置文件/etc/nginx/nginx.conf在http中80端口server项再引入刚才创建的配置

1
2
3
4
5
6
7
8
server{
listen 80;
server_name domain.com;
include /etc/nginx/snippets/letsencrypt.conf;
location / {
return 301 https://domain.com$request_uri;
}
}

在http中443端口server项再引入刚才创建的配置和其他信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
server_name domain.com;
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
include /etc/nginx/snippets/ssl.conf;
include /etc/nginx/snippets/agent_deny.conf;
index index.html;
root /var/www/blog;
location / {
try_files $uri $uri/ =404;
}
}

保存修改并平滑重启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
2
3
4
deploy:
type: git
repo: git@domain.com:/var/repo/blog.git
branch: master

repo仓库位置

在博客目录执行

1
$ hexo g -d

ggenerate生成静态文件
ddeploy通过git部署静态文件

这样就可以通过domain.com访问博客了

评论

您所在的地区可能无法访问 Disqus 评论系统,请切换网络环境再尝试。