由于国内 netlify 的访问速度太慢,恰好去年买了一台一年的轻量的服务器,所以我打算将博客的静态资源部署到 Linux 服务器上。但是需要绑定域名,域名还要备案,备案要审核 1-2 天。我记得前几年申请域名到解析域名都没这么多审核流程,看来近几年的网络普及率高了。
我打算记录一下我的部署过程,以及遇到的一些问题及解决办法。 刚开始配置的时候我是一头雾水,不过一切完成并且成功了后,看到自己的网站还是心满意足。 服务器目前还没添加域名解析,所以只能通过 ip 访问。http://124.222.67.149
原理
服务器的防火墙配置
我的服务器在腾讯云,默认开启 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
安装 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 在 http 配置里面添加刚才创建的配置文件
修改 nginx 的默认静态文件夹
vim /etc/nginx/sites-available/default
安装 NodeJS
curl -fsSL https://deb.nodesource.com/setup_19.x | bash - &&\
apt-get install -y nodejs
查看是否正确安装
node -v
npm -v
配置 Git 钩子
apt-get install git
adduser git # 添加用户,用来配置git钩子
passwd git # 设置用户密码
修改 git 用户权限命令
chmod 740 /etc/sudoers
vi /etc/sudoers
保存退出后,将 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
判断 shells 文件是否存在
cat /etc/shells
没有 git-shell 在里面,所以添加下
vi /etc/shells
最后一行填 git-shell 的路径 现在我们修改 git 用户的登录权限,禁止 git 用户使用 shell 权限:
chsh git
在输入框中填入获取的 git-hell 的路径
查看 git 用户的 shell 是否是 git-shell
grep git /etc/passwd
这样,我们只能远程登录到 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
现在看下服务器上是否收到了文件
ssh ubuntu # 登录到服务器
我们推送到的文件储存在服务器的/home/www/blog 文件夹里
# 服务器
sudo su root # 切换到root用户
ls -1 /home/www/blog/
重启下 nginx 服务器
nginx -s reload
现在在浏览器中输入服务器的 ip 地址,应该能看到博客网站了。~