Hexo博客一键部署到云服务器上

| |

获取一个云端主机并登录

在腾讯云/阿里云/华为云等平台上购买一个云服务器,搭建个人博客时可以选取轻量应用服务器,便宜。
可以获取到主机的公网ip地址。
可以xshell登录,也可以使用PuTTY,甚至腾讯云自己有很好用的后台可以用。
我这里云服务器安装的是linux操作系统,linux操作系统主流产品包括Ubuntu和centos等,我安装的是Ubuntu Server 22.04 LTS 64bit

安装nginx

依次执行以下命令

shell

# 更新软件库
sudo apt-get update
sudo apt-get upgrade
# 安装
sudo apt install nginx

安装完成后,访问http://公网IP ,如果出现初始化页面,即成功安装。
默认nginx安装文件夹在/etc/nginx/ 下,文件夹下有一些配置文件

shell

cd /etc/nginx

nginx默认读取的文件夹在/var/www/html/ 下,可以通过修改配置来修改这个文件夹的位置,但是不建议修改!

shell

cd /var/www/html

可以在这个文件夹中看到index.html文件,这就是访问http://公网IP 时默认的主页,可以简单修改一下这个文件,来看看是否配置成功。

shell

sudo vim index.html

踩坑警告:如果在这里看到的是index.nginx-debian.html文件,则使用下面的命令改回来,不然网站可能无法访问。

shell

mv index.nginx-debian.html index.html

此时只需要将我们的hexo博客工作目录下public文件夹中的内容拷贝到/var/www/html/ 中,即可将博客站部署到云服务器。
可以手动通过xftp传文件过去,也可以配置git实现一键部署,下面分别介绍。

手动部署网页文件

在用户/home/ubuntu/ 目录下新建文件夹test

shell

mkdir test
cd test

使用xftp或者其他传输工具,将public/ 下所有文件拷贝到此处。腾讯云自带的终端很好用,直接可以传文件。

shell

sudo cp -r /home/ubuntu/test/* /var/www/html/

即可完成文件拷贝,现在打开http://公网IP 网页,可以发现网站部署成功。
下次写了新的博客之后,先将/var/www/html/ 文件夹下原有文件删除,再复制过来,以避免潜在的问题。

shell

# 先删去旧文件
sudo rm -r /var/www/html/*
# 再将新的文件复制进去
sudo cp -r /home/ubuntu/test/* /var/www/html/

这种办法简单,易于理解。不过如果每次写博客时都要登录、传输文件、复制文件,实在是麻烦,因此考虑一键部署的办法。

git实现远程ssh部署

创建空仓库

一种做法是新建一个用户专用于ssh远程登陆,也可以直接使用默认用户。使用默认的ubuntu用户比较方便简单。 先创建一个空仓库,例如创建一个名为john.git的仓库

shell

cd /home/ubuntu
mkdir htmltest
cd htmltest
git init --bare john.git

创建钩子文件

shell

cd john.git/hooks #进入hooks文件夹
vim post-receive //创建hook钩子函数文件(git提交时自动部署)

输入以下内容:

bash

#!/bin/sh
git --work-tree=/var/www/html --git-dir=/home/ubuntu/htmltest/john.git checkout -f

回到本地,测试一下仓库能否被正常拉取,如果能被正常拉取,则一切正常

shell

git clone ubuntu@服务器公网IP:/home/ubuntu/htmltest/john.git

配置ssh免密连接

创建本地和云主机的远程免密连接: 找到本地的公钥文件,windows用户一般在C:\Users\用户名.ssh文件夹下,找到id_rsa.pub文件,复制其中的所有内容,注意必须有一个空行。

如何在windows上创建ssh密钥对:参阅微软官方文档OpenSSH for Windows 中基于密钥的身份验证

如果没有.ssh文件夹,就需要先配置ssh服务

shell

sudo apt-get install openssh-server
/etc/init.d/ssh start
/etc/init.d/ssh restart
ssh-keygen

# 连续回车,即可
shell

cd .ssh
touch authorized_keys #存放客户端的ssh公钥(id_rsa.pub)
vim authorized_keys #将id_rsa.pub文件中内容复制进去,注意必须在最后有一行空行
chmod 600 authorized_keys   #配置权限
chmod 700 .ssh

然后在本地主机的命令行(windows为powershell)执行命令,测试能否登录

shell

ssh ubuntu@公网IP

这里登录应该是不需要手动输入密码的。
如果登录成功,那么很快就要成功啦!

修改权限

重要!

shell

# 在john.git/hooks文件夹下,修改post-receive文件权限,使其能够被正常执行
chmod +x post-receive

修改/var/www/html 文件夹权限,使ubuntu用户能够直接修改

shell

sudo chown -R ubuntu:ubuntu /var/www/html/

在hexo中配置

yaml

deploy:
  type: git
  repo: ubuntu@公网IP:/home/ubuntu/htmltest/john.git
  branch: master

执行部署命令:

shell

hexo d

成功,即可。

配置SSL证书

参阅腾讯云文档
SSL(Secure Sockets Layer 安全套接层),SSL是一种安全套接层协议,是Web浏览器与Web服务器之间安全交换信息的协议,提供两个基本的安全服务:鉴别与保密。
将下载好的ssl证书文件夹下.com_bundle.crt 证书文件和.key 私钥文件从本地目录拷贝到 Nginx 服务器的 /etc/nginx 目录(此处为 Nginx 默认安装目录,请根据实际情况操作)下。
如存在权限问题,可以先拷贝到/home/ubuntu/文件夹下,再使用sudo赋予管理员权限复制过去。

查看nginx是否已安装ssl模块

shell

nginx -V

在configure-arguments:后面查找是否有–with-http_ssl_module,如有则无需手动安装,如没有,则需要安装。

安装完成ssl模块后,修改Nginx 根目录下的 nginx.conf 文件。修改内容如下: 这里参考腾讯云官方文档示例:

plaintext

server {
     #SSL 默认访问端口号为 443
     listen 443 ssl; 
     #请填写绑定证书的域名
     server_name cloud.tencent.com; 
     #请填写证书文件的相对路径或绝对路径
     ssl_certificate cloud.tencent.com_bundle.crt; 
     #请填写私钥文件的相对路径或绝对路径
     ssl_certificate_key cloud.tencent.com.key; 
     ssl_session_timeout 5m;
     #请按照以下协议配置
     ssl_protocols TLSv1.2 TLSv1.3; 
     #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
     ssl_prefer_server_ciphers on;
     location / {
         #网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
         #例如,您的网站主页在 Nginx 服务器的 /etc/www 目录下,则请修改 root 后面的 html 为 /etc/www。
         root html; 
         index  index.html index.htm;
     }
 }

修改完成后,使用以下命令验证配置文件是否配置成功

shell

sudo nginx -t

如终端反馈配置成功,则重载nginx即可

shell

sudo nginx -s reload

重载成功后,访问https://域名 可以看到浏览器地址栏显示安全锁标识,证书安装成功。

重定向到https://www.weiyeji.com

一定要先在服务器后台放行443和80端口(服务器控制台-安全组)!否则无法成功!
添加如下代码,含义分别是将http://www.weiyeji.com 重定向到https://www.weiyeji.com ,将 http://weiyeji.com 重定向到 https://www.weiyeji.com 将https://weiyeji.com 重定向到 https://www.weiyeji.com

shell

cd /etc/nginx/
sudo vim nginx.conf

http是侦听80端口,https是侦听443端口,301重定向是永久重定向网页。

plaintext

server {
 listen 80;
 server_name weiyeji.com; 
 #把http的域名请求转成https
 return 301 https://www.weiyeji.com$request_uri; 
}
server {
 listen 80;
 #请填写绑定证书的域名
 server_name www.weiyeji.com; 
 #把http的域名请求转成https
 return 301 https://$host$request_uri; 
}
server {
 listen 443;
 server_name weiyeji.com; 
 return 301 https://www.weiyeji.com$request_uri; 
}

再运行

shell

sudo nginx -t
sudo systemctl reload nginx

重新打开网页,可以发现http的网址自动重定向到了https,不带www的自动重定向到了带www的网址,成功!

apache版本

实测,apache用得更舒服。
apache,读作“阿帕奇”,跟nginx类似。
安装apache

shell

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install apache2

安装完毕后,访问http://公网IP ,如果出现初始化页面,即成功安装。
初始化页面上写了一些使用说明,包括安装目录、配置说明之类

配置文件夹

apache的配置文件夹在 /etc/apache2/ 下,默认网页目录在 /var/www/html/ 下,可以在 /var/www/html/ 下看到index.html

shell

# 查看配置文件夹
cd /etc/apache/
ls
# 查看网页文件
cd /var/www/html/

# 修改文件夹权限
sudo chown -R ubuntu:ubuntu /var/www/html/

如果想要修改网页默认文件夹的位置,只能修改为/var/www/文件夹下的其他位置,不能在其他地方,否则报错。(也许是我没弄明白,反正不能改到其他地方去)

shell

# 查看配置文件夹
cd /etc/apache/
# apache2.conf  conf-available  conf-enabled  envvars  magic  mods-available  mods-enabled  ports.conf  sites-available  sites-enabled

配置SSL

一定要检查服务器后台是不是开放了443端口。

shell

cd /etc/apache2/sites-available/
# 000-default.conf  default-ssl.conf
# 000-default.conf是80端口的配置信息,default-ssl.conf是443端口的配置信息

sudo vim /etc/apache2/sites-available/default-ssl.conf

填入合适的信息。

plaintext

<VirtualHost *:443>

    DocumentRoot 网站根目录

    SSLEngine on

     #填写证书名称
     ServerName cloud.tencent.com 
     #启用 SSL 功能
     SSLEngine on 
     #证书文件的路径
     SSLCertificateFile /etc/httpd/ssl/cloud.tencent.com.crt 
     #私钥文件的路径
     SSLCertificateKeyFile /etc/httpd/ssl/cloud.tencent.com.key 
     #证书链文件的路径
     SSLCertificateChainFile /etc/httpd/ssl/root_bundle.crt 

    SSLProtocol  all -SSLv2 -SSLv3

    SSLCipherSuite ECDH:AESGCM:HIGH:!RC4:!DH:!MD5:!aNULL:!eNULL

    SSLHonorCipherOrder on

</VirtualHost>

然后执行下面的命令

shell

# 为apache服务器添加ssl模块支持
sudo a2enmod ssl
# 将sites-available/default-ssl.conf文件内容添加到sites-enabled/文件夹下,使能
sudo a2ensite default-ssl

# 修改完成后,验证配置是否正确
apache2ctl -t
# Syntax OK

# 重启服务
sudo service apache2 restart

打开浏览器,输入https://域名,如浏览器地址栏显示加密小锁,则表示证书配置成功。若显示无法连接,请确保防火墙或安全组等策略有放行443端口(SSL配置端口)。

http重定向到https

也比nginx更简单!

shell

# 打开文件
sudo vim /etc/apache2/sites-available/000-default.conf

添加内容

plaintext

<VirtualHost *:80>
...
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
...
</VirtualHost>

保存,继续

shell

sudo a2enmod rewrite
# 重启
sudo service apache2 restart

完成。

设置文件夹权限

在设置网站根目录及子目录的文件和文件夹权限时,需要确保安全性和可访问性之间的平衡。

文件夹权限

文件权限

详细说明

这确保了Web服务器(如Apache)能够读取和执行目录中的文件。

这确保了Web服务器可以读取文件内容,但防止其他用户修改文件。

设置权限的命令

假设网站根目录为 /var/www/html,以下是设置权限的命令:

bash

# 设置文件夹权限为755
find /var/www/html -type d -exec chmod 755 {} \;

# 设置文件权限为644
find /var/www/html -type f -exec chmod 644 {} \;

注意事项

合理的权限设置不仅能确保网站的正常运行,还能有效保护网站内容的安全。

参阅