Halo 博客

一直想利用自己的服务器建立一个个人博客,之前由于太懒计划一直搁置。本着能找到现成的绝不自己写原则,找到了这个著名的Halo博客,下面是服务器部署心得。为了方便之前对服务器没有了解但是想从零开始建站的同学,增加了部分内容。

购买服务器

服务器建议购买大型云服务商产品,我使用的是阿里云
注册之后购买ECS云服务器实例。一般来说个人博客选择轻量级服务器单核/双核,内存2G即可。如果想通过域名访问服务器,需要先购买域名,再在阿里云专员的帮助下进行域名的备案。
服务器建议系统选择CentOS8,当然也可以选择自己喜欢的其他系统。
购买好云服务器,我们就可以远程访问了。可以命令行使用ssh链接,也可以使用其他的比如Xshell等现成的工具链接。我是🍎电脑使用的是免费的FinalShell,非常方便。

搭建博客

推荐使用docker部署博客。Docker就相当于一个容器,将单个应用的运行环境与本身的环境隔离开,使其互相影响降到最低。同时,docker还默认自动重启,省略掉手动写systemd守护进程的环节。

安装docker

which docker #查看是否有docker
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # 卸载掉原先的docker
sudo yum install -y yum-utils   device-mapper-persistent-data   lvm2 #安装依赖包
sudo yum-config-manager     --add-repo     http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #安装仓库源
sudo yum install docker-ce docker-ce-cli containerd.io #安装docker
sudo systemctl start docker #启动docker
docker images #查看本地镜像
docker ps #查看容器
docker pull #拉取镜像

拉取官方镜像(参考官方文档)

Halo 在 Docker Hub 上发布的镜像为 halohub/halo

  1. 创建隐藏工作目录
mkdir ~/.halo && cd ~/.halo
  1. 下载示例配置文件到工作目录
wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml
  1. 编辑配置文件,配置数据库或者端口等,如需配置请参考参考配置
    默认端口为8090,数据库为H2,可选MySQL
vim application.yaml
  1. 拉取最新的 Halo 镜像
docker pull halohub/halo:latest

创建容器

 docker run -it -d --name halo -p 8090:8090 -v ~/.halo:/root/.halo --restart=unless-stopped halohub/halo

外部8090端口映射容器8090端口,外部~/.halo文件夹挂载到容器/root/.halo下。设置成自动重启,容器镜像为halohub/halo,容器名为halo。此时可以使用docker ps -a来检查容器是否启动成功。

编辑服务器安全组

8090端口服务器默认是不允许外部访问的,需要我们去服务器后台在安全组中添加对8090端口的访问权限。
image.png
添加完之后过几分钟,访问http://ip:8090应该就可以看见安装引导界面了。

搭建Nginx反向代理和配置SSL证书

完成上述的步骤之后,我们只能通过HTTP的方式访问博客,同时还要加上端口号。可以在服务器配置SSL证书,使网站只能通过HTTPS的方式访问。

申请SSL证书

image.png

之后在SSL证书免费证书中创建一个免费证书。大约十分钟就可创建成功。

image.png

选择Nginx类型下载。

安装Nginx

sudo yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
yum install -y pcre pcre-devel
sudo yum install yum-utils
cd /etc/yum.repos.d/
vi nginx.repo # 创建nginx.repo文件

将nginx.repo修改为以下内容:

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

安装:

yum install nginx
nginx -v # 查看版本

配置:

cd /etc/nginx

将之前下载的SSL证书上传到这个文件夹下。

image.png

修改conf文件:将域名改成你自己的,SSL证书相关路径也改成你自己的。

vi nginx.conf
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
    server {
      listen 80;
      server_name catchersun.cn www.catchersun.cn;
      return 301 https://$host$request_uri; 
      }
      
    
    server{
      listen 443 ssl;
      server_name catchersun.cn www.catchersun.cn;
      
      ssl_certificate "/etc/nginx/catchersun.cn.pem";
      ssl_certificate_key "/etc/nginx/catchersun.cn.key";
      ssl_session_cache shared:SSL:1m;
      ssl_session_timeout 10m;
      ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
      #表示使用的加密套件的类型。
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #表示使用的TLS协议的类型。
      ssl_prefer_server_ciphers on;
      location / {
            proxy_pass http://127.0.0.1:8090;
            proxy_http_version    1.1;
            proxy_cache_bypass    $http_upgrade;
            proxy_set_header Upgrade            $http_upgrade;
            proxy_set_header Connection         "upgrade";
            proxy_set_header Host               $host;
            proxy_set_header X-Real-IP          $remote_addr;
            proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto  $scheme;
            proxy_set_header X-Forwarded-Host   $host;
            proxy_set_header X-Forwarded-Port   $server_port;
            }   

    }
}

之后重启Nginx服务:

nginx -c /etc/nginx/nginx.conf 
# 如果重启不成功报错端口绑定失败,可以先查找占用端口的进程并强制杀死,之后重新启动。如下:
#  netstat -tunlp | grep 80 #查找占用80端口的进程
#  kill -9 $pid

启动成功就可以通过域名直接访问博客啦!如 catchersun.cn
欢迎讨论,交流学习,互相PY博客友情链接~

Q.E.D.


南七技校练习时长四年的练习生