回顾

1️⃣ 「小白教程」Hexo静态博客1 —— 安装篇

2️⃣ 「小白教程」Hexo静态博客2 —— 基本命令、效果(画饼)篇

3️⃣ 「小白教程」Hexo静态博客3 —— 部署篇(Github Pages)

前言

这里介绍两种方式将本地的博客的静态文件(即public文件夹)上传到自己的服务器上,并设置域名。

①SFTP,最简单的办法

②在VPS上建立Github仓库,并配置钩子更新VPS上的本地文件

两种方法没有明显的优劣之分,挑选自己喜欢并适应的方式就可以。

所以你需要准备的是:一台服务器(演示使用Debian/Ubuntu系统),一个域名。

SFTP部署

安装hexo-deployer-sftp

安装 hexo-deployer-sftp。 通过 SFTP 部署站点,允许使用 ssh-agent 进行无密码连接。

运行命令:npm install hexo-deployer-sftp --save

修改_config.yml配置

修改_config.yml文件中的deploy选项,模板参考如下:

deploy:  type: sftp  host: <host>  user: <user>  pass: <password>  remotePath: [remote path]  port: [port]  privateKey: [path/to/privateKey]  passphrase: [passphrase]  agent: [path/to/agent/socket]
选项描述默认值
host远程主机的地址
port端口22
user使用者名称
pass密码
privateKeySSH 私钥的目录地址
passphrase私钥的可选密码
agentssh套接字的目录地址$SSH_AUTH_SOCK
remotePath远程主机的根目录/
forceUpload覆盖现有的文件false
concurrency同时处理的 SFTP 任务的最大数量100

<host>:请填入你的服务器的公网IP。

<user>:如果你不打算adduser,那么填入root就可以了。如果你为了安全性,可以选择新建一个用户并填入<user>选项。adduser的操作也可以在下个部分看到

<password>:填入你对应user的密码。

privateKey:如果你在本地已经生成好了证书并将pubkey传至.ssh文件夹,并设置好了sshd文件允许密钥登陆,那么你可以填写该选项。如果设置了密码,记得填写[passphrase]生成本地密钥详见下一个部分。

[remote path]:请在你的VPS本地创建一个目录,例如/var/blog,并填入其中。你也可以设置别的目录。public文件夹内的静态文件将存入其中。

Git部署

配置本地密钥

为了使本地可以跟远程的 github 建立联系,需要在本地配置 SSH 密钥,这样我们就可以在本地直接提交代码到 GitHub 上或者远端 git 仓库。如果你是第一次配置 SSH,则配置一下 git 的 usernameemail

$ git config --global user.name "你要设置的名字"$ git config --global user.email "你要设置的邮箱"

然后再生成本地密钥:$ ssh-keygen -t rsa -C "你刚刚设置的邮箱"。如果不需要设置密码的话,连续三个回车就好了。如果你设置了密码,请务必记住。

之后在你的用户的根目录会出现id_rsa.pub文件,这是你生成的公钥。后续需要上传到.ssh文件夹内

服务器用户设置

我们创建一个git用户:adduser git,密码以及个人信息随意填写。

切换至 git 用户,创建 ~/.ssh 文件夹和 ~/.ssh/authorized_keys 文件,并赋予相应的权限:

su gitmkdir ~/.sshvim ~/.ssh/authorized_keys

按”i” 进入编辑模式,将我们在本地生成的 id_rsa.pub 文件中的公钥复制到 authorized_keys 中,按”esc”,然后按”:wq”,保存退出。如果你不喜欢用vim,也可以用nano等其他编辑器。能把公钥放进去就行。

同时,请确保在sshd配置文件中pubkey authentication的选项是yes。

接着,输入一下命令,赋予权限:

chmod 600 /home/git/.ssh/authorized_keyschmod 700 /home/git/.ssh

之后,测试一下,能否在本地的终端免密登录 git:ssh -v git@SERVER.

创建Github仓库

在 var 目录下创建 repo 作为 Git 仓库目录,返回服务端命令行切换到 root 账户,然后输入:mkdir /var/repo,然后赋予权限:chmod -R 755 /var/repo

接下来创建 hexo 目录作为网站根目录,并赋予权限:

mkdir /var/hexochown -R git:git /var/hexochmod -R 755 /var/hexochown -R git:git /var/repo/chown -R git:git /var/hexo/

然后来创建一个空白的 git 仓库:

cd /var/repogit init --bare hexo.git

我们需要创建一个新的 Git 钩子,用于自动部署。在 /var/repo/hexo.git 下,有一个自动生成的 hooks 文件夹。我们需要在里边新建一个新的钩子文件 post-receive。新建/var/repo/hexo.git/hooks/post-receive文件,写入以下内容:

#!/bin/bashgit --work-tree=/var/hexo --git-dir=/var/repo/hexo.git checkout -f

并修改权限:

chown -R git:git /var/repo/hexo.git/hooks/post-receivechmod +x /var/repo/hexo.git/hooks/post-receive

修改 hexo 配置

编辑站点配置文件 _config.yml,找到 deploy,修改模板如下:

deploy:  type: git  #repo改为repo: git@your_ip:/var/repo/hexo.git  repo: git@your_ip:/var/repo/hexo.git  branch: master

域名设置

Caddy

my.domain {    root * /var/hexo    file_server    encode gzip    # 可选:配置日志    log {        output file /var/log/caddy/my.domain.access.log        format common    }}

只需将my.domain换成你自己的域名,root * /var/hexo换成你自己的目录即可。

Nginx

server {    listen 80;    listen [::]:80;    server_name my.domain;        return 301 https://$server_name$request_uri;}server {    listen 443 ssl http2;    listen [::]:443 ssl http2;    server_name my.domain;        # SSL证书配置 - 需要替换为实际证书路径    ssl_certificate /etc/ssl/certs/my.domain.crt;    ssl_certificate_key /etc/ssl/private/my.domain.key;        ssl_session_cache shared:SSL:10m;    ssl_session_timeout 10m;        ssl_protocols TLSv1.2 TLSv1.3;        root /var/hexo;    index index.html;        access_log /var/log/nginx/my.domain.access.log;    error_log /var/log/nginx/my.domain.error.log;        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {        expires 1y;        add_header Cache-Control "public, immutable";    }        location / {        try_files $uri $uri/ =404;                add_header X-Frame-Options "SAMEORIGIN" always;        add_header X-XSS-Protection "1; mode=block" always;        add_header X-Content-Type-Options "nosniff" always;        add_header Referrer-Policy "no-referrer-when-downgrade" always;    }        error_page 404 /404.html;    location = /404.html {        internal;    }        location ~ /\. {        deny all;        access_log off;        log_not_found off;    }        location ~* \.(log|txt|sql)$ {        deny all;    }}

请自己申请证书,在SSL证书配置部分替换成你的证书的绝对路径。