Hexo博客部署到Linux

Hexo博客部署到Linux

1711 Words 5.7 Minutes

由于国内 netlify 的访问速度太慢,恰好去年买了一台一年的轻量的服务器,所以我打算将博客的静态资源部署到 Linux 服务器上。但是需要绑定域名,域名还要备案,备案要审核 1-2 天。我记得前几年申请域名到解析域名都没这么多审核流程,看来近几年的网络普及率高了。

我打算记录一下我的部署过程,以及遇到的一些问题及解决办法。 刚开始配置的时候我是一头雾水,不过一切完成并且成功了后,看到自己的网站还是心满意足。 服务器目前还没添加域名解析,所以只能通过 ip 访问。http://124.222.67.149

原理 sample

服务器的防火墙配置

我的服务器在腾讯云,默认开启 22 端口和 80 端口。22 端口用来 ssh 远程连接到服务器,80 端口给 nginx 服务器开发。

远程登录到 Linux

现在腾讯云控制台里登录到服务器,然后创建密钥,用于授权本地远程登录到服务器 在 Linux 服务器中

# Linux服务器
cd ~

sudo mkdir .ssh && cd .ssh

sudo touch authorized_keys
# 本地
ssh-keygen -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/name/.ssh/id_rsa): # 输入密钥要保存的位置加名字,默认是/Users/name/.ssh/id_rsa
Enter passphrase (empty for no passphrase): # 相当于密码,可以不填,按回车
Enter same passphrase again:
Your identification has been saved in /Users/name/.ssh/test_rsa
Your public key has been saved in /Users/name/.ssh/test_rsa.pub
The key fingerprint is:
SHA256:GkUZfZB.....   # 这是私钥
+----[SHA256]-----+

现在看下.ssh 目录下有什么,刚生成的私钥和公钥

ls -1 ~/.ssh
id_rsa # ->这是私钥
id_rsa.pub # ->这是公钥

我们需要 id_rsa.pub 文件里的内容,用来通过服务器的验证,登录到 linux 而取消密码登录,这样登录更安全,也更方便。

cat ~/.ssh/id_rsa.pub
# 输出下面内容
ssh-rsa AAA***

现在将 id_rsa.pub 的内容复制到我们刚在服务器上的创建的 authorized_keys 文件里

# Linux服务器
sudo vim ~/.ssh/authorized_keys

# 在文件里粘贴本地id_rsa.pub文件里的内容,如下面
ssh-rsa AAA***

# 然后保存退出

然后配置本地 ssh 远程设置

# 本地
cd ~/.ssh
vi config
Host 你用来连接服务器的名字,如ubuntu
  HostName 你的服务器IP
  User 服务器用户名,如ubuntu
  Port 22
  PreferredAuthentications publickey
  IdentityFile 你的私钥地址,如 ~/.ssh/id_rsa

保存退出后,现在可以在本地直接连接到 linux 服务器了

# ubuntu是 config文件里 Host 后面你自己设置的,我的是ubuntu
ssh ubuntu

1

安装 Nginx

切换到 root 用户

sudo su root

安装 nginx

apt-get update
apt-get install nginx -y

下载完后启动 Nginx 服务器

systemctl start nginx
systemctl enable nginx

创建目录储存博客静态资源

cd /home
mkdir www
cd www
mkdir blog

配置 Nginx

创建配置文件,再添加到 nginx 路由里

cd /etc/nginx
mkdir vhost && cd vhost

vim blog.conf
---
server{
		listen    80;
        root /home/www/blog;
        server_name 你的域名;
        location /{
            }
}

vim wwwblog.conf
---
server{
		listen    80;
        root /home/www/blog;
        server_name www.你的域名;
        location /{
            }
}

保存退出后

vi /etc/nginx/nginx.conf

将第一行的 user 修改为 root,如果是 www.data 则浏览器访问到网站的时候会出现 403forbidden 2 在 http 配置里面添加刚才创建的配置文件 3 4

修改 nginx 的默认静态文件夹

vim /etc/nginx/sites-available/default

5

安装 NodeJS

curl -fsSL https://deb.nodesource.com/setup_19.x | bash - &&\
apt-get install -y nodejs

查看是否正确安装

node -v
npm -v

6

配置 Git 钩子

apt-get install git

adduser git # 添加用户,用来配置git钩子
passwd git  # 设置用户密码

修改 git 用户权限命令

chmod 740 /etc/sudoers
vi /etc/sudoers

7 保存退出后,将 sudoers 文件权限改回原样:

chmod 400 /etc/sudoers

切换到 git 用户

su git
mkdir ~/.ssh && chmod 700 ~/.ssh # 创建.ssh目录授予权限

然后把之前的公钥再复制 git 用户的.ssh 文件夹的 authorized_keys 文件里。

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

在本地添加 git 远程。

# 本地
cd ~/.ssh
vi config
Host git (随便填,将来要用来远程连接)
  HostName 你的服务器IP
  User git (这个是我们刚在服务器中创建的用户名)
  Port 22
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/id_rsa

先连接到服务器 在服务器的 git 用户下创建 git 仓库

ssh ubuntu
# Linux
sudo su git # 切换到git用户
cd ~
git init --bare blog.git
vi ~/blog.git/hooks/post-receive

在 post-receive 文件中输入以下内容

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

保存退出后给 post-receive 文件执行的权限

chmod +x ~/blog.git/hooks/post-receive

改变 blog.git 目录的拥有者为 git 用户

chown -R git:git /home/git/blog.git

将 git 仓库连接到服务器上我们用来储存静态文件的文件夹

chown -R git:git /home/www/blog
chmod -R 755 /home/www/blog  # 给git用户写入的权限

为了安全起见,移除 git 用户用 shell 登录服务器的权限。

先获取 git-shell 的路径

which git-shell

8 判断 shells 文件是否存在

cat /etc/shells

9 没有 git-shell 在里面,所以添加下

vi /etc/shells

最后一行填 git-shell 的路径 10 现在我们修改 git 用户的登录权限,禁止 git 用户使用 shell 权限:

chsh git

11 在输入框中填入获取的 git-hell 的路径

查看 git 用户的 shell 是否是 git-shell

grep git /etc/passwd

12 这样,我们只能远程登录到 git 用户对 Git 仓库进行推送和拉取操作,而不能使用其它的命令

本地部署到远程服务器

在本地你的站点根目录下

# 本地
npm install -g hexo
npm install hexo-deployer-git --save

修改站点配置文件,在根目录的_config.yml 文件里,修改

deploy:
  type: git
  repo: git:/home/git/blog.git
  branch: main

然后运行

hexo clean
hexo g
hexo d

13

现在看下服务器上是否收到了文件

ssh ubuntu # 登录到服务器

我们推送到的文件储存在服务器的/home/www/blog 文件夹里

# 服务器
sudo su root # 切换到root用户
ls -1 /home/www/blog/

14

重启下 nginx 服务器

nginx -s reload

现在在浏览器中输入服务器的 ip 地址,应该能看到博客网站了。~

用React创建一个待做事项组件