在服务器上部署一个自动更新的hexo博客(一)基础环境配置

First Post:

Last Update:

Word Count:
2.2k

Read Time:
9 min

部署环境

OS: Debian GNU/Linux 10 (buster) x86_64
Kernel: 4.19.0-14-amd64
CPU: Intel Xeon Gold 6161 (1) @ 2.200GHz
Memory: 1994MiB

工具列表

  • nodejs
  • npm
  • nginx
  • code-server
  • ssl证书(可选)

使用软件包管理器安装需要的软件包

在debian系统下,大部分需要的工具都已经集成在apt中了,我们只需执行以下命令即可全部安装。

BASH 共 1 行
展开
1
apt install -y nodejs npm nginx

安装code-server

Code-Server,网页版的vscode,是一个很好的用来管理hexo静态博客的前端工具。我们可以通过code-server直连服务器,同时可以执行所有权限范围内的shell指令,对于用惯了vscode的开发者来说,更是零学习成本直接上手。

不过Code-Server并没有包含在apt软件包仓库里,需要我们自行下载。
Code-Server的GitHub仓库中提供了一键安装的脚本,但是我们不用。对于中国环境来说,那个脚本的下载速度太慢了。我们可以直接进入Releases页面,下载最新的版本(截至文章写作是4.0.1)。我们可以使用wgetcutlaria2等下载工具直接下载到服务器,也可以在本地使用代理进行高速下载完成后通过scp命令或者winscp等图形化工具传输到服务器上。
这里演示三个命令以供参考:

  • 第一个是通过wget在服务端单线程下载code-server安装包

    BASH 共 1 行
    展开
    1
    wget https://github.com/coder/code-server/releases/download/v4.0.1/code-server_4.0.1_amd64.deb
  • 第二个是通过aria2(如果没有安装需要先使用apt安装)多线程下载

    BASH 共 1 行
    展开
    1
    aria2c -s 5 https://github.com/coder/code-server/releases/download/v4.0.1/code-server_4.0.1_amd64.deb
  • 第三个是通过scp指令将下载到本地的code-server安装包传到服务器上

    BASH 共 1 行
    展开
    1
    scp -P 22 /path/to/code-server.deb user@ip:~

    将code-server安装包下载到服务器后,运行命令即可自动安装。

    BASH 共 1 行
    展开
    1
    dpkg -i /path/to/code-server.deb

    此时在服务器安全组上放行的8080端口,还没有办法在 http://serverip:8080/ 访问到code-server的登录页面。
    因为这时候,code-server的部署还没结束。我们需要修改下它的配置文件。
    Code-Server的配置文件位于 ~/.config/code-server/config.yaml ,进入之后,可以看到很短的几条。

    YAML 共 4 行
    展开
    1
    2
    3
    4
    bind-addr: 127.0.0.1:8080
    auth: password
    password: ……
    cert: false

    我们首先需要修改bind-addr,将其修改为0.0.0.0:8080服务器ip:你想要访问它的任何没被占用的端口
    其次是修改password,默认的密码并不好记,请自行设置一个好记的密码。
    修改完成后,通过systemd启动code-server就可以尝试进入了。登录之后,就是熟悉的vscode页面了。一般vscode的插件都可以使用。

    BASH 共 1 行
    展开
    1
    systemctl enable --now code-server@$USER

    部署hexo博客

    hexo的中文详细教程在官网都有说明,这里就不细说了。
    首先通过如下命令安装hexo:

    BASH 共 1 行
    展开
    1
    npm install hexo-cli -g

    安装完成后,找个你喜欢的目录,初始化hexo的框架,这里以 /home/aura/hexo/ 作为演示。

    BASH 共 2 行
    展开
    1
    2
    cd /home/aura/hexo/
    hexo init

    初始化完成后,便是找主题,配置文章的过程了。这些过程都可以在code-server页面下解决。
    配置完成后,就要把这个博客发布了。发布的命令是:

    BASH 共 2 行
    展开
    1
    2
    hexo clean
    hexo g

    这样会在hexo的目录中生成一个public文件夹,这里面就是用户正式访问的内容。
    生成之后,我们有两种方法将这个文件夹里的内容公开到互联网上。

  1. 配置nginx将网页根目录指向public
  2. 将public复制到nginx默认的 /var/www/html/ 文件夹下

这两种方法的差别在下一节配置nginx的时候会提及。

配置nginx

安装好nginx后,nginx就已经是启用状态了。通过 http://serverip/ 就可以访问到nginx的默认html页。这个页面位于 /var/www/html/ 里面。
nginx的配置文件位于 /etc/nginx/ 文件夹中。通过修改它我们能达到很多目的。

配置仅特定域名访问

定位到/etc/nginx/sites-avaliable/,新建一个空的配置文件,完整文件名为blog,里面的内容可以参考defalut配置文件。

NGINX 共 11 行
展开
1
2
3
4
5
6
7
8
9
10
11
server {
listen 80; #访问服务的端口,ipv4
listen [::]:80; #访问服务的端口,ipv6
server_name example.com; # 访问服务的特定域名
root /home/aura/hexo/public; #这里是将访问的网页目录直接指向hexo生成的文件夹
index index.html index.htm index.nginx-debian.html; #要寻找的首页文件

location / { # 这一部分可以进行url路由配置
index index.html index.htm;
}
}

保存之后,创建一个文件链接到sites-enabled,就可以重启nginx服务了。
BASH 共 2 行
展开
1
2
ln -s /etc/nginx/sites-avaliable/blog /etc/nginx/sites-enabled/
systemctl restart nginx

之后,只要服务器配置好了域名解析,且国内域名通过ICP备案,就可以通过域名正常访问博客了。
如果有多个域名解析到服务器ip,我们需要给它ban掉,保证只有一个入口能访问到网页。
在这里,我们新建一个名为ban的配置文件单独管理。
NGINX 共 10 行
展开
1
2
3
4
5
6
7
8
9
10
server {
listen 80;
listen [::]:80;
server_name _; # 这里指所有域名,包括ip,也可以指定为不想让其访问的域名

location / {
return 404; # 如果用这种方式访问就返回404
index index.html index.htm;
}
}

配置Code-Server反向代理

配置code-server反向代理的过程和上面发布网页并没有太大区别,直接上配置文件示例即可理解。(一般来说照着改改就能成)

NGINX 共 13 行
展开
1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80; #访问服务的端口,ipv4
listen [::]:80; #访问服务的端口,ipv6
server_name codeserver.example.com; # 访问服务的特定域名

location / { # 这一部分可以进行url路由配置
proxy_pass http://localhost:8080/; # 访问code-server的本地地址
proxy_set_header Host $host:80/path;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
proxy_set_header Accept-Encoding gzip; # 使用gzip压缩请求
}
}

配置url路由

如果要让code-server和博客使用同一个主机名和域名,就需要配置url路由。同样的,也是修改location这一段配置:

NGINX 共 19 行
展开
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 80; #访问服务的端口,ipv4
listen [::]:80; #访问服务的端口,ipv6
server_name example.com; # 访问服务的特定域名
root /home/aura/hexo/public; #这里是将访问的网页目录直接指向hexo生成的文件夹
index index.html index.htm index.nginx-debian.html; #要寻找的首页文件

location / { # 这一部分可以进行url路由配置
index index.html index.htm;
}

location /code-server/ { # code-server的url路由
proxy_pass http://localhost:8080/; # 访问code-server的本地地址
proxy_set_header Host $host:80/path;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
proxy_set_header Accept-Encoding gzip; # 使用gzip压缩请求
}
}

这样配置之后,重启nginx,就可以在 http://example.com/code-server/ 访问到code-server编辑器的界面了。

(可选)配置HTTPS和HTTP自动跳转

当然,有条件的话我们可以给我们的博客使用https,提高博客的安全性。使用https的话,nginx的配置文件需要进行以下改动(以上面配置好code-server url路由的配置文件举例)
不过在此之前,需要将证书文件上传到服务器,这里示例的文件地址为:

  • /home/aura/cert/cert.pem
  • /home/aura/cert/key.pem
    NGINX 共 38 行
    展开
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    server {
    # https将80端口修改为443端口
    listen 443; #访问服务的端口,ipv4
    listen [::]:443; #访问服务的端口,ipv6
    server_name example.com; # 访问服务的特定域名
    root /home/aura/hexo/public; #这里是将访问的网页目录直接指向hexo生成的文件夹
    index index.html index.htm index.nginx-debian.html; #要寻找的首页文件

    # ssl配置
    ssl on; # 启用ssl
    ssl_certificate /home/aura/cert/cert.pem; # 证书公钥地址
    ssl_certificate_key /home/aura/cert/key.pem; # 证书私钥地址
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    location / { # 这一部分可以进行url路由配置
    index index.html index.htm;
    }

    location /code-server/ { # code-server的url路由
    proxy_pass http://localhost:8080/; # 访问code-server的本地地址
    proxy_redirect http:// https://; # 将外部的https请求重定向为内部的http请求
    proxy_set_header Host $host:443/path; # 这里也是修改为443
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection upgrade;
    proxy_set_header Accept-Encoding gzip; # 使用gzip压缩请求
    }
    }

    # 以http模式访问的时候自动跳转为https
    server {
    listen 80;
    listen [::]:80;
    server_name example.com;
    rewrite ^(.*)$ https://example.com;
    }