本文将演示如何从零开始搭建一款基于Java的动态博客框架 — Halo,一款优秀,并且社区非常活跃的动态博客框架。感兴趣的可以展开下栏查看为什么选择Halo而不是其他框架。
最初搭建博客框架的时候,网上搜了一大圈,几乎被Hexo,Hugo,WordPress霸屏。但是在体验一圈之后,发现WordPress虽然功能丰富,但是却过于臃肿,Azure的丐版套餐明显够呛。然后Hexo和Hugo虽然搭建方便,主题丰富,却都是静态框架而且后台管理和更新内容异常麻烦。此外,个人偏向于动态框架,遂弃。此时,我发现有两款动态框架深得我心,分别是Ghost和Halo,前者基于Node.js,而后者基于Java而且社区异常活跃(有自己的论坛和Github活跃贡献者)。出于对Java的热爱,也为了进一步了解和学习Spring的实际运用,果断选择Halo。
以下部分内容来自 Halo官方文档,如有疑问可自行前往查看和验证。
硬件要求
CPU:无特殊要求
内存:推荐至少1GB,否则容易导致虚拟机卡死!以下是安装Halo + Nginx剩下可用的内存,仅供参考。
free -h total used free shared buff/cache available Mem: 863Mi 755Mi 56Mi 0.0Ki 51Mi 16Mi Swap: 0B 0B 0B磁盘:无特殊要求,Azure的免费的两个P6盘足以。
系统:强烈建议Ubuntu或者Debian,有任何问题也比较方便找到解决方案。
环境部署
官方建议使用Docker部署,我也偏好使用Docker部署,毕竟能省事不少。但是没办法,服务器孱弱的性能让我不得不使用Jar文件手动部署。曾试着强行在1G内存服务器上用Docker部署,结果卡到连爸都不认识了...
开始之前,建议先查看服务器安全检查和软件更新,更新服务器软件和设置一些服务器基本的安全措施。本文默认已更新系统软件和包列表。
所需软件列表
Java
注意事项
从2.21开始,要求的JRE/JDK最低版本变为21。数据库,这里选择Mysql
建议
经测试,Halo + 本地MySQL + Nginx会导致1G内存服务器原地爆炸,终端卡顿严重,退出后重新登录也无法进入系统。因此强烈 建议1G服务器使用远程数据库。Nginx(反向代理)
Wget,vim。依个人习惯安装,可使用其他类似功能软件,主要用于下载和编辑文件。
Java安装
sudo apt install openjdk-21-jdk安装完成后输入
java -version,应该会看到Java的版本信息。Azure MySQL部署
Azure搜索MySQL,选择弹性服务器然后在创建页面选择advanced create

数据库基本配置

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

安装Halo
创建一个名为 halo 的用户(名字可以随意)
useradd -m halo为 halo 用户创建密码
passwd halo切换到halo用户
su - halo在当前用户主目录创建存放jar运行包的目录,这里以 ~/app 为例
mkdir ~/app && cd ~/app下载运行包
wget https://dl.halo.run/release/halo-2.21.0.jar -O halo.jar在当前用户主目录创建Halo工作目录
mkdir ~/.halo2 && cd ~/.halo2创建 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
设置完配置文件,需要连接数据库创建对应的database,可使用以下命令:
create database halo character set utf8mb4 collate utf8mb4_bin;输入以下命令测试运行Halo
cd ~/app && java -Dfile.encoding=UTF-8 -jar halo.jar --spring.config.additional-location=optional:file:$HOME/.halo2/如果没有出现异常日志,则表示Halo已成功安装。打开
http://ip:端口号即可前往初始化界面。
作为服务运行
之前已经介绍如何安装和配置Halo,但是当关闭当前ssh连接或者关机后,会导致Halo停止运行。因此,我们需要将Halo配置为系统服务在后台一直运行。
创建Halo的service文件
vim /etc/systemd/system/halo.service将以下内容复制到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安装路径。重新加载systemd,然后启动Halo并将其设为开机启动项。
systemctl daemon-reload && systemctl start halo && systemctl enable halo可通过以下命令查看是否成功启动。
journalctl -n 20 -u halosystemctl status halo
Nginx安装
反向代理是一种部署在前端的中间层组件,用于接收客户端请求并将其转发至后端服务器。简单来说,它就像一个中间人,既负责传递信息,也承担访问控制、安全防护和性能优化等工作。
由于1G服务器实在带不动图形界面的Nginx proxy manager(ngm),因此,以下将不会介绍ngm的安装和配置方式,而是介绍nginx的安装和配置方法。没办法,ngm的资源占用率比nginx高了十倍不止。如果是2G或以上的豪华配置,当我没说,感兴趣可以查看官方文档。
更新系统索引然后安装nginx
sudo apt update && sudo apt install nginx检查是否安装成功
sudo nginx -v启动并设置开机启动
sudo systemctl start nginx && sudo systemctl enable nginx可以使用以下命令查看运行状态。
systemctl status nginx在浏览器输入:
http://服务器ip地址,如果看到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网站代理
创建Halo网站根目录(可自定义路径)。
sudo mkdir /var/www/halo设置网站根目录为之前创建的halo用户所有。
sudo chown -R halo:halo /var/www/halo创建虚拟主机配置。
sudo vim /etc/nginx/sites-available/halo将以下内容写入配置文件:
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_certificate和ssl_certificate_key分别填写购买ssl证书时获取的crt和key文件路径。启用配置并重载 Nginx:
sudo ln -s /etc/nginx/sites-available/halo /etc/nginx/sites-enabled/ && sudo nginx -t && sudo systemctl reload nginxnginx -t会检查配置语法,如果没问题,应该会输出以下内容:nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful配置https,可前往 从零开始使用Let's Encrypt配置网站SSL 查看详细配置教程。
至此,所有配置设置完毕。如果一切顺利,在浏览器输入域名应该可以看到以下初始化界面:

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