原本我把博客托管到GitHubPages并设置好了域名解析,已经算是很完美的了。但奈何恰逢618年中大促,在巨大优惠的情况下鬼使神差的买了一个云服务器。既然已经买了云服务器,为了不浪费,我又开始了我的折腾之旅,特在此记录一下我把博客部署到云服务器的过程,既为大家提供参考,也为自己做一个记忆的备份。默认已经搭建好了本地博客,搭建本地博客的过程可以参考我的另一篇文章:利用Hexo与GitHub搭建个人博客

  本文主要参考了这篇文章:Win10环境下基于Hexo的静态博客环境搭建,及其阿里云部署,并对其中存在的一些坑做了填埋。


  前置要求:

  1. 本地计算机
    1. 已安装Node.js
    2. 已安装Git
    3. 已安装Hexo,并生成本地博客静态网页
  2. 云服务器
    1. 系统版本:CentOS 7.4
    2. 安全组已开放80端口
    3. root用户密码已重置,能连接上云服务器

  部署的原理:

  首先,模仿GitHub,在云服务器里建一个远程Git仓库,以后的本地静态网页都上传到我们自己的云服务器中的Git仓库。然后,为了能从公网中访问到我们的博客,还要为服务器部署Web服务(Nginx)。但这样还不够,因为博客的静态网页要放到网站的根目录里才可以正常浏览。所以还需要一个Git的钩子,当我们上传博客的静态网页到远程Git仓库时,就触发这个钩子,自动地从远程Git仓库中把博客的静态网页移动到网站的根目录。最后,为了保证博客的正常浏览,最好也为云服务器安装Node.js环境。


  具体的操作如下:

  1. 使用root用户登录到云服务器

  2. 安装Node.js

    1. 输入以下命令:

      # cd ~
      # curl -sL https://rpm.nodesource.com/setup_10.x | bash -
      # yum install -y nodejs
    2. 查看版本号,检测是否安装成功

      # node -v
      # npm -v
  3. 安装Git

    1. 输入以下命令,若遇系统询问,一律选择yes:

      # yum install git
    2. 查看版本号,检测是否安装成功

      # git --version
  4. Nginx部署

    1. 安装Nginx

      先安装依赖环境,输入以下命令,若遇系统询问,一律选择yes
      # yum install gcc-c++
      # yum install -y pcre pcre-devel
      # yum install -y zlib zlib-devel
      # yum install -y openssl openssl-devel
      
      下载nginx安装包
      # wget -c https://nginx.org/download/nginx-1.10.1.tar.gz
      
      将安装包解压到/usr/local目录下
      # tar -xvf nginx-1.10.1.tar.gz -C /usr/local
      
      进入/usr/local目录,并确认nginx解压到该目录下
      # cd /usr/local
      # ls
      
      进入nginx-1.10.1目录,会发现该目录下有一个configure文件,执行该配置文件
      # cd nginx-1.10.1/
      # ls
      # ./configure --prefix=/usr/local/nginx --with-http_ssl_module
      
      编译并安装nginx
      # make
      # make install
      
      开放Linux的80端口并启动nginx
      # cd /usr/local/nginx
      # /sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
      # cd sbin
      # ./nginx
      
      没有任何提示消息即代表成功,此时可打开浏览器访问云服务器的公网IP,即可看到Nginx的欢迎页面
    2. 配置Nginx

      先创建一个文件夹,用来作为网站根目录
      # mkdir -p /home/www/blog
      
      更改nginx配置文件中的域名与网站根目录
      # cd /usr/local/nginx/conf
      # vim nginx.conf
      
      
      在打开的文件中,按i进入编辑模式,按下面的示例更改配置文件的相应位置:
      --------------------------------------------------------------
      user  root;		# 第一处
      worker_processes  1;
      
      #error_log  logs/error.log;
      #error_log  logs/error.log  notice;
      #error_log  logs/error.log  info;
      
      #pid        logs/nginx.pid;
      
      events {
          worker_connections  1024;
      }
      
      http {
          include       mime.types;
          default_type  application/octet-stream;
      
          #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
          #                  '$status $body_bytes_sent "$http_referer" '
          #                  '"$http_user_agent" "$http_x_forwarded_for"';
      
          #access_log  logs/access.log  main;
      
          sendfile        on;
          #tcp_nopush     on;
      
          #keepalive_timeout  0;
          keepalive_timeout  65;
      
          #gzip  on;
      
          server {
              listen       80;
              server_name  你的域名或公网IP;		# 第二处
      
              #charset koi8-r;
      
              #access_log  logs/host.access.log  main;
      
              location / {
                  root   /home/www/blog;		# 第三处
                  index  index.html index.htm;
              }
              
         以下省略.........
      ---------------------------------------------------------------
      
      更改完毕后,按Esc键进入命令模式,再输入':wq',然后回车,保存退出
      
      重启nginx服务
      # cd /usr/local/nginx/sbin
      # ./nginx -s restart
  5. 创建Git用户,并配置SSH密钥对以实现免密登录

    1. 创建Git用户并授予管理员权限

      创建Git用户
      # adduser git
      
      先获得用户配置文件的更改权限:
      # chmod 777 /etc/sudoers
      
      然后打开用户配置文件:
      # vim /etc/sudoers
      
      按i键进入编辑模式,找到 root ALL=(ALL) ALL,在下面添加一行:git ALL=(ALL) ALL
      
      添加完毕后,按Esc键进入命令模式,再输入':wq',回车,保存退出
      
      再把配置文件的权限改回去:
      # chmod 400 /etc/sudoers
      
      最后设置git用户的密码
      # sudo passwd git
      
      然后输入两次密码确认即可,输入的密码不可见,不要怀疑自己的键盘坏了
    2. 配置SSH密钥对

      在本地计算机生成SSH密钥对,若已有密钥对,可跳过这一步
      
      在本地计算机里打开Git Bash,输入以下命令,若遇到系统询问,一直回车即可
      $ ssh-keygen -t rsa -C "youremail"		
      
      找到本地生成的密钥对,一般在电脑里的这个路径:C:\Users\UserName\ .ssh
      其中,id_rsa文件是私钥,给本地计算机使用,id_rsa.pub是公钥,需要上传到云服务器
      当私钥与公钥配对成功,即可免密登录
      
      最后,检查本地.ssh文件夹里是否存在known_hosts.old与known_hosts这两个文件
      若存在这两个文件,则删除,避免后续配对出错
      
      ---------------------------------------------------------------------
      
      上传公钥到云服务器,实现Git用户的免密登录
      
      在云服务器里切换成git用户
      # su git
      
      在git用户的根目录创建.ssh文件夹
      # cd ~
      # mkdir .ssh
      
      创建公钥文件
      # vim /home/git/.ssh/authorized_keys
      
      在打开的文件中,按i键进入编辑模式
      
      然后在本地计算机里找到id_rsa.pub公钥文件,用记事本打开,复制里面的内容填入到上述云服务器里的公钥文件中
      
      粘贴完毕后,按Esc键进入命令模式,再输入':wq',回车,保存退出
      
      设置云服务器里的密钥文件的权限
      # chmod 600 ~/.ssh/authorized_keys
      # chmod 700 ~/.ssh
      
      在本地计算机测试密钥配对情况,打开Git Bash,输入以下命令,若遇到系统询问一律选择yes:
      $ ssh git@云服务器的公网IP
  6. 创建远程Git仓库,并设置钩子,以下命令均在git用户下执行

    1. 创建远程Git仓库,输入以下命令:

      # cd ~
      # git init --bare hexo.git
    2. 设置钩子

      创建钩子文件
      # vim ~/hexo.git/hooks/post-receive
      
      在打开的文件中,按i键进入编辑模式,输入以下内容:
      #!/bin/bash
      git --work-tree=/home/www/blog --git-dir=/home/git/hexo.git checkout -f
      
      输入完毕后,按Esc键进入命令模式,再输入':wq',回车,保存退出
    3. 授予钩子可执行权限

      # chmod +x ~/hexo.git/hooks/post-receive
      # cd /home
      # sudo chmod -R 777 /home/www/blog
  7. 打开本地Hexo博客文件夹下的_config.yml配置文件,把最后面的内容设置成如下:

    deploy:
      type: git
      repo: git@云服务器的公网IP:/home/git/hexo.git
      branch: main
  8. 生成本地博客静态网页并上传到云服务器

    1. 在本地博客文件夹目录下打开Git Bash后,输入下面命令:

      $ hexo Clean	// 清除缓存
      $ hexo g		// 生成静态网页
      $ hexo s		// 本地预览,没有问题后按Ctrl+C停止预览
      $ hexo d		// 把网页上传到云服务器
    2. 打开浏览器,访问你的域名或云服务器的公网IP(需与nginx配置文件对应),即可查看自己的博客

  9. 特别注意:由于还没有设置nginx的https服务,不要在本地博客设置强制使用https链接


  以上就是把博客部署到云服务器的全过程,以后只需在本地执行hexo d命令即可把博客自动部署到云服务器。