如何部署hexo到服务器

为了部署hexo折腾了两天,期间不知道碰了多少次壁,遇到了许多诡异的问题,比如连接FTP前要先打开允许密码登陆等。这些问题网络上的hexo基本没有提到。网上的教程大多是使用github pages来搭建博客网站的,但是那样的话速度就比较慢,而且现在github.io由于GFW的缘故访问很不稳定,所以接下来我会介绍如何使用自己的服务器搭建hexo博客网站,并给出避坑指南。希望能对大家有帮助ヾ(≧▽≦*)o

配置服务端

安装、配置Nginx

我使用的服务器托管在甲骨文云(免费服务器真香~),系统是Ubuntu 20.04LTS,我的本地系统是Windows 11 x64。

系统预装了git和gcc,我们直接apt安装[^nginx]即可。apt安装的软件的配置文件都在 /etc/AppName下。

sudo apt install nginx

现在Ubuntu系统的防火墙会阻止我们访问网站,因此,你需要放行iptables端口:

sudo apt update
sudo apt install iptables
sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -save

这样设置的iptables会在重启之后失效,为了让iptables规则持久生效,安装iptables-persistent

sudo apt install iptables-persistent
sudo netfilter-persistent save
sudo netfilter-persistent reload

现在,直接访问服务器的IP,就可以看到Nginx的欢迎界面了!

我们需要一个存着所有网页文件网站目录。我们先新建一个目录。如果你已经有网页文件,放到里面即可。

mkdir -p /home/www/hexo

然后配置Nginx。Nginx可以在一台服务器上用同一个IP托管多个网站,其中/etc/nginx/sites-available中存储所有可用的网站配置文件,每一个配置文件对应一个网站。在/etc/nginx/sites-enabled中使用软链接指向sites-available中的配置文件,这里的配置文件才会被Nginx使用。这么做的好处是,可以通过添加/删除软链接来管理哪些网站可以被访问,而无需触及真正的配置文件。

现在你可以删除sites-enabled中的 default配置文件的符号链接,防止网站访客看到Nginx的欢迎界面——否则会显得有点业余 :)

rm /etc/nginx/sites-enabled/default

接下来我们创建自己的配置文件。/etc/nginx/sites-available/default这个文件就是我们刚删除的那个软链接对应的配置文件,它除了显示欢迎页面以外,还有作为“Server Block”配置参考的作用。“Server Block”就是Nginx的网站配置区块,配置起来很方便。接下来我们在sites-available中创建自己的配置文件。

sudo vim /etc/nginx/sites-available/gzblog

在其中添加如下内容:

server {
    listen 80;
    server_name www.gzblog.tech;
    location / {
        root /home/www/hexo;
        index index.html;
	}
}

然后,在sites-enabled中添加指向它的符号链接来启用它。

sudo ln -s /etc/nginx/sites-available/gzblog /etc/nginx/sites-enabled/gzblog

80就是nginx的默认端口(apt安装nginx的时候会自动放行),server_name后面跟的是域名,多个域名之间用空格隔开,注意每行必须以英文分号结束。下面location /的意思是以/结尾的URL(也就是域名本身)的目录在/home/www/hexo下面(我们刚刚创建了它)。如果需要托管多个网站,只需要像这样添加多个配置文件即可。这样,Nginx配置文件就编写好了。

现在我们检查一下配置文件是否存在语法错误。

sudo nginx -t

如果输出

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

那就说明Nginx准备好了!接下来重启Nginx来应用配置文件:

sudo systemctl restart nginx

安装Node.js和npm

在终端中输入

sudo apt install nodejs
sudo apt install npm

配置 Git

这个部分参考的是一篇知乎上的文章,通过新建一个git用户的方式实现hexo自动部署。

#添加名为"git" 的用户,这时除了密码,还会要求你填房间号、电话之类的,留空即可。
sudo adduser git
#修改git用户的权限为740
sudo chmod 740 /etc/sudoers
#打开文件
sudo vim /etc/sudoers

在root下面添加git(模仿root的格式)

git    ALL=(ALL:ALL)    ALL

把git用户的权限改回去

chmod 400 /etc/sudoers

接下来把本地的[^公钥]上传到服务器。首先,你得有一个公钥。如果你以前用过git,你可以在C:\user\YOURUSER\.ssh下找到id_rsa.pub。如果没有,先生成。 在本地电脑上运行:

cd ~
cd .ssh
ssh-keygen

在FTP连接前,我们要先打开允许密码登录。在服务器上切换到root用户。

sudo su

修改SSH配置文件,把PasswordAuthentication设为yes。为以后使用考虑,也可以把PermitRootLogin也设为yes。这样我们就可以使用密码连接FTP了,即使是root用户也可以。

sudo vim /etc/ssh/sshd_config

然后重启服务器。

reboot

请自行下载FileZilla软件,在主机项填写服务器IP,用户名填git,端口号填22。点击快速连接即可连接到远端服务器。

FileZilla界面
把本地的id_rsa.pub文件拖动到服务器的/home/git/.ssh文件夹下。

回到服务器端,以 Git 用户身份在 .ssh 文件夹内新建 authorized_keys 文件,并将公钥内容拷贝到该文件中。

cd ~/.ssh
cp id_rsa.pub authorized_keys
cat id_rsa.pub >> ~/.ssh/authorized_keys

修改文件权限。

chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh

由于Linux和Windows的文件尾不一样,为了防止出错,需要确保设置了正确的SELinux上下文。首先,安装必需的软件。

apt install policycoreutils

然后运行

restorecon -Rv ~/.ssh

现在我们来测试一下是否设置成功。在本地任意位置右键打开Git Bash,输入:

ssh -v git@你的公网IP

期间会问你要不要接收数字指纹,输入yes即可。如果出现Linux命令行界面,说明我们配置成功了。

接下来在服务端配置Git仓库。

服务端切换到git用户

su git

创建 post-receive 钩子文件。

cd ~
git init --bare hexo.git
vim ~/hexo.git/hooks/post-receive

输入以下内容:

git --work-tree=/home/www/hexo --git-dir=/home/git/hexo.git checkout -f

授予钩子文件可执行权限。

chmod +x ~/hexo.git/hooks/post-receive
cd ~
sudo chmod -R 777 /home/www/hexo

重启服务器。

reboot

这样,我们就完成了服务端的配置。

本地配置

安装 Node.js

Node.js 官网下载长期支持版。

输出版本号,测试是否安装成功:

node -v
npm -v

安装hexo

首先,找一个你喜欢的目录,在这里打开Git Bash,输入:

npm install -g hexo-cli

在此目录下创建blog文件夹(你可以改成你喜欢的名字):

hexo init blog
cd blog
npm install

这个文件夹就成为你博客的根目录。在blog文件夹打开Git Bash:

npm install hexo-deployer-git --save
npm install hexo-server

如果你还没有,配置Git全局变量:

git config --global user.email "你的邮箱@mail.com"
git config --global user.name "你的名字"

在根目录下打开Git bash,输入:

hexo server
或
hexo s

这时终端会显示本地链接,一般是http://localhost:4000,打开它就能在本地预览博客。

同步博客到服务端

进入本地计算机blog文件夹的根目录,找到_config.yml文件并打开。找到deploy行,将其修改为如下内容:

deploy:
  type: git
  repo:
    gcp: git@你的IP:/home/git/hexo.git
  branch: master

此外,还可以找到url项将其修改为自己的域名。

激动人心的时刻到了!把博客推送到服务器!

如果使用git bash,实际上就是cmd,使用这个命令:

hexo cl && hexo g && hexo d

如果使用现代得多、好用得多的PowerShell,用以下命令,主要是命令分隔符的不同:

hexo cl; hexo g; hexo d

设置PowerShell Alias,简化命令

每次都要在本地博客文件夹下打开git bash或者Powershell再输入上面的命令未免太麻烦,接下来配置一下让我们输入hexo2themoon这个命令来一键推送。

打开PowerShell,输入

echo $PROFILE

得到配置文件的路径与文件名。在里面输入以下内容:

function hexo2themoon {cd "C:\dev\blog";hexo cl; hexo g; hexo d}

这会创建一个PowerShell函数,先切换到博客文件夹下,再执行推送文件的操作。

为了让PowerShell每次启动时都加载这个文件,用管理员模式打开PowerShell,输入命令

Set-ExecutionPolicy RemoteSigned

重启PowerShell,大功告成!快去试试hexo2themoon命令吧!

进阶操作

配置HTTPS

使用cerbot配置比较简单。照着它网站上说的做就成了。

配置好后,运行cerbot获取证书并修改Nginx配置文件:

sudo certbot --nginx
或只获取证书:
sudo certbot certonly --nginx

在SSL证书到期前,输入

sudo certbot renew

即可续签所有证书。

注释

nginx: 这是一个广泛使用的网站服务器软件。

输入: 请自行查阅vim编辑器的用法。

公钥:也就是你和服务器通讯加密时使用的密钥,私钥是用于解密的。

评论

此博客中的热门博文

搭建你自己的“云游戏”

标点论

SSH可以做任何事情!