回顾
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 | 密码 | |
privateKey | SSH 私钥的目录地址 | |
passphrase | 私钥的可选密码 | |
agent | ssh套接字的目录地址 | $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 的 username
和 email
:
$ 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证书配置
部分替换成你的证书的绝对路径。