从零开始搭建基于Halo的的个人动态博客

本文将演示如何从零开始搭建一款基于Java的动态博客框架 — Halo,一款优秀,并且社区非常活跃的动态博客框架。感兴趣的可以展开下栏查看为什么选择Halo而不是其他框架。

博客框架选择的经验之谈

最初搭建博客框架的时候,网上搜了一大圈,几乎被Hexo,Hugo,WordPress霸屏。但是在体验一圈之后,发现WordPress虽然功能丰富,但是却过于臃肿,Azure的丐版套餐明显够呛。然后Hexo和Hugo虽然搭建方便,主题丰富,却都是静态框架而且后台管理和更新内容异常麻烦。此外,个人偏向于动态框架,遂弃。此时,我发现有两款动态框架深得我心,分别是Ghost和Halo,前者基于Node.js,而后者基于Java而且社区异常活跃(有自己的论坛和Github活跃贡献者)。出于对Java的热爱,也为了进一步了解和学习Spring的实际运用,果断选择Halo。

信息
以下部分内容来自 Halo官方文档,如有疑问可自行前往查看和验证。

硬件要求

  1. CPU:无特殊要求

  2. 内存:推荐至少1GB,否则容易导致虚拟机卡死!以下是安装Halo + Nginx剩下可用的内存,仅供参考。

     free -h
             total   used    free    shared  buff/cache  available
     Mem:    863Mi   755Mi   56Mi    0.0Ki   51Mi        16Mi
     Swap:   0B      0B      0B
     
  3. 磁盘:无特殊要求,Azure的免费的两个P6盘足以。

  4. 系统:强烈建议Ubuntu或者Debian,有任何问题也比较方便找到解决方案。

环境部署

官方建议使用Docker部署,我也偏好使用Docker部署,毕竟能省事不少。但是没办法,服务器孱弱的性能让我不得不使用Jar文件手动部署。曾试着强行在1G内存服务器上用Docker部署,结果卡到连爸都不认识了...

开始之前,建议先查看服务器安全检查和软件更新,更新服务器软件和设置一些服务器基本的安全措施。本文默认已更新系统软件和包列表。

  • 所需软件列表

    1. Java

      注意事项
      从2.21开始,要求的JRE/JDK最低版本变为21。
    2. 数据库,这里选择Mysql

      建议
      经测试,Halo + 本地MySQL + Nginx会导致1G内存服务器原地爆炸,终端卡顿严重,退出后重新登录也无法进入系统。因此强烈 建议1G服务器使用远程数据库。
    3. Nginx(反向代理)

    4. Wget,vim。依个人习惯安装,可使用其他类似功能软件,主要用于下载和编辑文件。

  • Java安装

    sudo apt install openjdk-21-jdk
    

    安装完成后输入java -version,应该会看到Java的版本信息。

  • Azure MySQL部署

    1. Azure搜索MySQL,选择弹性服务器然后在创建页面选择advanced createserver-choice

    2. 数据库基本配置 mysql_conf

    3. 配置虚拟网络,只允许虚拟机内连接 mysql_conf2

安装Halo

  1. 创建一个名为 halo 的用户(名字可以随意)

    useradd -m halo
    
  2. 为 halo 用户创建密码

    passwd halo
    
  3. 切换到halo用户

    su - halo
    
  4. 在当前用户主目录创建存放jar运行包的目录,这里以 ~/app 为例

    mkdir ~/app && cd ~/app
    
  5. 下载运行包

    wget https://dl.halo.run/release/halo-2.21.0.jar -O halo.jar
    
  6. 在当前用户主目录创建Halo工作目录

    mkdir ~/.halo2 && cd ~/.halo2
    
  7. 创建 Halo 配置文件

    vim application.yaml
    
    数据库注意事项
    本文所选用的数据库是 Azure的Mysql数据库,因此,application.yaml的数据库配置也是基于此数据库而进行设置。如果你是其它类型的数据库,请参考官方文档进行配置。
    server:
     # 运行端口
     port: 
     spring:
         # 数据库配置
         r2dbc:
             url: 
             username: 
             password: 
             properties:
                 sslMode: REQUIRED
         sql:
             init:
                 mode: always
                 # 需要配合 r2dbc 的配置进行改动
                 platform: mysql
     halo:
         # 工作目录位置
         work-dir: ${user.home}/.halo2
         # 外部访问地址
         external-url: 
         # 附件映射配置,通常用于迁移场景
         attachment:
             resource-mappings:
             - pathPattern: /upload/**
                 locations:
                 - migrate-from-1.x
     
    参数注意事项
    • url的格式为:r2dbc:pool:mysql://数据库路径:数据库端口/要连接的数据库
    • external-url为网站的网址,例如:http://www.alloworld.me
  8. 设置完配置文件,需要连接数据库创建对应的database,可使用以下命令:

    create database halo character set utf8mb4 collate utf8mb4_bin;
    
  9. 输入以下命令测试运行Halo

    cd ~/app && java -Dfile.encoding=UTF-8 -jar halo.jar --spring.config.additional-location=optional:file:$HOME/.halo2/
    
  10. 如果没有出现异常日志,则表示Halo已成功安装。打开http://ip:端口号 即可前往初始化界面。

作为服务运行

之前已经介绍如何安装和配置Halo,但是当关闭当前ssh连接或者关机后,会导致Halo停止运行。因此,我们需要将Halo配置为系统服务在后台一直运行。

  1. 创建Halo的service文件

    vim /etc/systemd/system/halo.service
    
  2. 将以下内容复制到halo.service文件。

    [Unit]
     Description=Halo Service
     Documentation=https://docs.halo.run
     After=network-online.target
     Wants=network-online.target
    
     [Service]
     Type=simple
     User=
     ExecStart=/usr/bin/java -Dfile.encoding=UTF-8 -server -Xms256m -Xmx256m -jar JAR_PATH --spring.config.additional-location=optional:file:/home/halo/.halo2/
     ExecStop=/bin/kill -s QUIT $MAINPID
     Restart=always
     StandOutput=syslog
    
     StandError=inherit
    
     [Install]
     WantedBy=multi-user.target
     
    提醒
    JAR_PATH:Halo 运行包的绝对路径,例如 /home/halo/app/halo.jar,注意:此路径不支持 ~ 符号。
    Java路径注意事项
    请确保Java的安装路径是/usr/bin/java,否则可能会导致服务不能正常启动。可以使用which java查看Java安装路径。
  3. 重新加载systemd,然后启动Halo并将其设为开机启动项。

    systemctl daemon-reload && systemctl start halo && systemctl enable halo
    
  4. 可通过以下命令查看是否成功启动。

    journalctl -n 20 -u halo
    
    systemctl status halo
    

Nginx安装

反向代理是一种部署在前端的中间层组件,用于接收客户端请求并将其转发至后端服务器。简单来说,它就像一个中间人,既负责传递信息,也承担访问控制、安全防护和性能优化等工作。

由于1G服务器实在带不动图形界面的Nginx proxy manager(ngm),因此,以下将不会介绍ngm的安装和配置方式,而是介绍nginx的安装和配置方法。没办法,ngm的资源占用率比nginx高了十倍不止。如果是2G或以上的豪华配置,当我没说,感兴趣可以查看官方文档。

  1. 更新系统索引然后安装nginx

    sudo apt update && sudo apt install nginx
    
  2. 检查是否安装成功

    sudo nginx -v
    
  3. 启动并设置开机启动

    sudo systemctl start nginx && sudo systemctl enable nginx
    
  4. 可以使用以下命令查看运行状态。

    systemctl status nginx
    
  5. 在浏览器输入:http://服务器ip地址,如果看到nginx的欢迎页面,说明安装成功。

Nginx配置目录说明
  • /etc/nginx/nginx.conf:主配置文件
  • /etc/nginx/sites-available/:虚拟主机配置(网站配置文件)
  • /etc/nginx/sites-enabled/:启用的网站配置(用软链接指向 sites-available)
  • /var/www/html/:默认网站根目录
  • /var/log/nginx/:日志目录(access.log, error.log)

Nginx网站代理

  1. 创建Halo网站根目录(可自定义路径)。

    sudo mkdir /var/www/halo
    
  2. 设置网站根目录为之前创建的halo用户所有。

    sudo chown -R halo:halo /var/www/halo
    
  3. 创建虚拟主机配置。

    sudo vim /etc/nginx/sites-available/halo
    
  4. 将以下内容写入配置文件:

    upstream halo {
         server 127.0.0.1:端口;
     }
     server {
         listen 80;
         listen [::]:80;
         server_name www.alloworld.me;
         client_max_body_size 10M;
         return 301 https://$server_name$request_uri;
     }
     
     server {
         listen 443 ssl;
         client_max_body_size 10M;
         ssl_certificate .crt文件路径;
         ssl_certificate_key .key文件路径;
         server_name www.alloworld.me;
         location / {
             proxy_pass http://halo;
             proxy_set_header HOST $host;
             proxy_set_header X-Forwarded-Proto $scheme;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         }
     }
     
    SSL配置
    ssl_certificatessl_certificate_key分别填写购买ssl证书时获取的crt和key文件路径。
  5. 启用配置并重载 Nginx:

    sudo ln -s /etc/nginx/sites-available/halo /etc/nginx/sites-enabled/ && sudo nginx -t && sudo systemctl reload nginx
    

    nginx -t会检查配置语法,如果没问题,应该会输出以下内容:

    nginx -t
     nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
     nginx: configuration file /etc/nginx/nginx.conf test is successful
  6. 配置https,可前往 从零开始使用Let's Encrypt配置网站SSL 查看详细配置教程。

至此,所有配置设置完毕。如果一切顺利,在浏览器输入域名应该可以看到以下初始化界面:

初始化界面

初始化完成后就可以开始使用了 🎉🎉🎉

✍️ 作者:𝓜.𝓦𝓱𝓲𝓽𝓮

📄 共享协议: CC 4.0协议

🔗 原文链接: https://www.alloworld.me/archives/setup-dynamic-blog-with-halo

评论