首先今天过大年,祝各位网友们新年快乐!🧨🧨🎇🎇
前段时间水群聊,找到了Halo博客系统,昨天安装成功运行之后,就想和大家分享这个博客系统的安装。

  • 我为此搭建了一个新博客,用来做生活博客,预示新博客,来年新气象!🎉🎉

    Halo 是一款现代化的个人独立博客系统,给习惯写博客的同学多一个选择。
    一个优秀的开源博客发布应用,值得一试。

博客系统使用了java语言,整个应用程序只有一个jar文件,目前官方适配H2和mysql这两种数据库,接下来带大家来搭建这么一个博客系统。

注意事项

  • 本文章在ubuntu20.04系统上安装为例,ubuntu20.04+Halo 1.4.5+mysql 8.0+nginx。
  • 操作系统最好选择纯净的,没有安装过其他环境的为好,不容易出现问题。
  • 最新版本的Halo博客系统需要jre11环境。
  • 附上官方文档开源地址官网的地址。

    准备工作

    安装jre11环境

    ubuntu安装jre环境可以直接使用apt软件源里面的安装。
    $ sudo apt install openjdk-11-jdk
  • 命令中安装的是jdk11,jre会被包含在jdk软件包中。
    安装完成之后,检查java版本。
    $ java -version

安装与配置mysql数据库

安装数据库

也是通过软件源安装数据库。

$ sudo apt install mysql-server

安装好的数据库版本为 8.0.23,Halo最低mysql版本要求为5.7+。

配置数据库

接下来进入root用户环境进行配置。

$ su

一旦安装完成,MySQL 服务将会自动启动。想要验证 MySQL 服务器正在运行,输入:

$ sudo systemctl status mysql

一般都是在正常运行,出现(running)的绿色文字。

MySQL 安装文件附带了一个名为mysql_secure_installation的脚本,它允许你很容易地提高数据库服务器的安全性。
不带参数运行这个脚本:

$ sudo mysql_secure_installation

你将会被要求配置VALIDATE PASSWORD PLUGIN,它被用来测试 MySQL 用户密码的强度,并且提高安全性:

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: y

有三个级别的密码验证策略,低级,中级,高级。如果你想设置验证密码插件,按y或者其他任何按键,移动到下一个步骤:

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2

下一次被提示时,你将被要求为 MySQL root 用户设置一个密码:

Please set the password for root here.


New password: 

Re-enter new password:

如果你设置了验证密码插件,这个脚本将会显示你的新密码强度。输入y确认密码:

Estimated strength of the password: 50 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y

下一步,你将被要求移除任何匿名用户,限制 root 用户访问本地机器,移除测试数据库并且重新加载权限表。你应该对所有的问题回答y。

以 root 用户身份登录

使用 MySQl 客户端工具在命令行和 MySQL 服务器交互,这个 MySQL 客户端已经作为 MySQL 服务器安装包的依赖软件包被安装了。

在MySQL 8.0上,root 用户默认通过auth_socket插件授权。

auth_socket插件通过 Unix socket 文件来验证所有连接到localhost的用户。这意味着你不能通过提供密码,验证为 root。

以 root 用户身份登录 MySQL服务器,输入:

$ sudo mysql  #如果你本身已经处于root用户下,不需要加sudo

你将会被展示MySQL shell,就像下面一样:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.19-0ubuntu5 (Ubuntu)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

创建一个新的MySQL用户帐户

数据库root账号不能直接使用密码用于正常生产和正常使用,需要建立一个普通用户。
MySQL中的用户帐户由用户名和主机名部分组成。
要创建新的MySQL用户帐户,请运行以下命令,只需将database_user替换为要创建的用户名即可:

mysql> CREATE USER 'database_user'@'localhost' IDENTIFIED BY 'user_password';
  • 在上面的命令中,我们设置了主机名部分,localhost这意味着该用户将只能从本地主机(即从运行MySQL Server的系统)连接到MySQL服务器。如果要授予其他主机的访问权限,只需localhost使用远程计算机IP更改或'%'在主机部分使用通配符,这意味着该用户帐户将能够从任何主机进行连接。
  • user_password为用户新密码,密码强度建议使用之前选择的密码验证策略对应的强度。

与使用数据库以避免尝试创建已经存在的用户帐户时出错相同,可以使用命令:

mysql> CREATE USER IF NOT EXISTS 'database_user'@'localhost' IDENTIFIED BY 'user_password';

成功之后输出结果:

Output
Query OK, 0 rows affected, 1 warning (0.00 sec)

创建一个新的数据库

根据Halo官方文档,数据库需要两个要求

  • 字符集(Character Set):utf8mb4
  • 排序规则(Collate):utf8mb4_bin

综上,建议创建数据库采用下面的命令:

mysql> create database halodb character set utf8mb4 collate utf8mb4_bin;

注意:建立的数据库名为halodb

向MySQL用户帐户授予权限

要授予对特定数据库用户帐户的所有特权,请使用以下命令:

mysql> GRANT ALL PRIVILEGES ON database_name.* TO 'database_user'@'localhost';

要授予所有数据库用户帐户的所有特权,请使用以下命令;建议使用本条命令,因为使用使用上面的命令在后续步骤运行Halo程序时程序可能还是无法对数据库进行读写,会报错,所以直接让数据库用户拥有所有数据库的权限比较方便

mysql> GRANT ALL PRIVILEGES ON *.* TO 'database_user'@'localhost';

那么配置数据库的步骤就结束了,使用命令退出mysql服务器:

mysql> \q

更多的有关使用命令进行数据库管理的命令和方法,可以移步到下面几篇文章仔细学习。

安装Halo博客程序

建立新用户

  • 如果你的操作系统拥有非root用户,并且非root用户拥有sudo管理员权限,那么可以跳过此步骤
  • 不推荐直接使用系统 root 用户来运行 Halo。如果您需要直接使用 root 用户,请跳过这一步。

下面内容和官方文档基本一致,换汤不换药。

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

$ useradd -m halo	

给予 sudo 权限:

$ usermod -aG wheel halo

为 halo 用户创建密码:

$ passwd halo

登录到 halo 账户:

$ su - halo

建立工作目录,下载Halo博客程序

下面登录到非root用户上继续
根据官方文档,Halo目录为以下结构

/home/halo(用户名)/ .halo/ application.yaml
logs/
static/
templates/
upload/
app/ halo.jar
  • 表中标的是博客程序成功运行之后自动生成的文件夹,无需我们创建。
  • halo.jarapplication.yaml是我们自己需要下载和配置好的。前者就是Halo博客的主程序,后者是博客程序的配置文件。

我们开始创建上表中相关目录与下载有关程序和文件。

创建存放运行程序的目录

$ mkdir ~/app && cd ~/app #在用户主目录创建名为app的文件夹,并且进入该文件夹

下载Halo博客程序

$ wget https://dl.halo.run/release/halo-1.4.5.jar -O halo.jar	#通过链接下载程序文件,并且将文件重命名为halo.jar
  • 如果下载速度不理想,点击这里,有官方提供的其他下载地址。

创建工作目录

$ mkdir ~/.halo && cd ~/.halo #在用户主目录创建名为.halo的文件夹,并且进入该文件夹
  • 在linux中,文件或文件夹开头带.的都是隐藏的。

下载示例配置文件到工作目录

$ wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml	#通过链接下载示例配置文件,并且将文件重命名为application.yaml

编辑配置文件

使用编辑器打开配置文件

$ vim application.yaml

可以看到默认的配置文件内容为:

server:
  port: 8090

  # Response data gzip.
  compression:
    enabled: false
spring:
  datasource:

    # H2 database configuration.
    driver-class-name: org.h2.Driver
    url: jdbc:h2:file:~/.halo/db/halo
    username: admin
    password: 123456

    # MySQL database configuration.
#    driver-class-name: com.mysql.cj.jdbc.Driver
#    url: jdbc:mysql://127.0.0.1:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
#    username: root
#    password: 123456

  # H2 database console configuration.
  h2:
    console:
      settings:
        web-allow-others: false
      path: /h2-console
      enabled: false

halo:

  # Your admin client path is https://your-domain/{admin-path}
  admin-path: admin

  # memory or level
  cache: memory

我们先解读配置文件主要的含义:(代码中如有......的标记则代表此位置是有其他内容被省略)

  • 用于指定 HTTP 服务器监听的端口,Halo默认设置为 8090:

    server:
      port: 8090
    ......

    关于端口问题, 不建议直接使用80端口,也不建议使用root用户运行该博客程序,所以要使用nginx进行反代理。

  • 我们使用的数据库是mysql数据库,所以默认被注释的部分内容是和mysql配置有关,把配置前面的#注释去除即可,默认mysql数据库配置内容为(没有去除注释):

    ......
    #    driver-class-name: com.mysql.cj.jdbc.Driver
    #    url: jdbc:mysql://127.0.0.1:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    #    username: root
    #    password: 123456
    ......

    所以我们要先把H2数据库有关的配置先删除或者#注释掉,H2数据库的配置内容为:

    ......
        driver-class-name: org.h2.Driver
        url: jdbc:h2:file:~/.halo/db/halo
        username: admin
        password: 123456
    ......
      h2:
        console:
          settings:
            web-allow-others: false
          path: /h2-console
          enabled: false
    ......

spring:字段的内容如下,我们开始配置mysql数据库有关的设置

......
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    username: root
    password: 123456
......
  • usernamepassword 需要修改为您的MySQL数据库账号和密码。
  • 默认时区为 Asia/Shanghai,如果与您所在时区不一致,则可以修改为您所在的时区。
  • 其中url字段的内容:url: jdbc:mysql://127.0.0.1:3306/halodb?character......halodb为数据库默认名称,如果你的数据库是其他名称,请修改为其他名称。

    高级配置

    高级配置中的配置设置是可选的,如果不需要,可以略过。

后台路径

Halo 支持自定义后台管理的根路径。

......
halo:
  # Your admin client path is https://your-domain/{admin-path}
  admin-path: admin
......

注意:仅为改动后台管理的根路径,因此前后不带 /。

缓存

某些情况下,需要用户根据需求来设置缓存数据的保存方式,例如将缓存数据持久化保存在本地。

......
halo:
......
  # memory or level
  cache: memory

目前支持两种策略:

  • memory 将数据缓存至内存,重启服务缓存将清空。
  • level 将数据缓存至本地,重启服务不会清空缓存。

    压缩

    启用压缩对于减少带宽和加快页面加载非常有用,在未使用 Nginx 或 Caddy 等反向代理服务器时(反向代理服务器通常是默认开启 Gzip 的),可以考虑开启系统自带的Gzip 功能。
server:
......
  # Response data gzip.
  compression:
    enabled: false
......

综合上述,使用mysql数据库的配置文件示例为:

server:
  port: 8090

  # Response data gzip.
  compression:
    enabled: false
spring:
  datasource:

    # MySQL database configuration.
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    username: root
    password: 123456

halo:

  # Your admin client path is https://your-domain/{admin-path}
  admin-path: admin

  # memory or level
  cache: memory

测试运行

$ cd ~/app && java -jar halo.jar	#进入用户主文件夹中app文件夹,并且使用java命令带-jar参数运行halo.jar程序

接下来屏幕开始滚动日志,最后会成功输出下面内容:

......
run.halo.app.listener.StartedListener    : Halo started at         http://127.0.0.1:8090
run.halo.app.listener.StartedListener    : Halo admin started at   http://127.0.0.1:8090/admin
run.halo.app.listener.StartedListener    : Halo has started successfully!

打开http://ip:端口号即可看到安装引导界面。

注意事项:

  • 如测试启动正常,请继续看作为服务运行部分,仅仅作为测试。当你关闭 ssh 连接或者使用CTRL+C后博客程序会停止运行。
  • 记得防火墙和安全组放行对应端口。

将Halo博客程序注册为服务运行

再次进入root用户

$ su

下载 Halo 官方的 halo.service 模板

$ wget https://dl.halo.run/config/halo.service -O /etc/systemd/system/halo.service  #通过链接下载server文件,并且自定义保存位置

修改 halo.service

$ vim /etc/systemd/system/halo.service

修改配置

  • YOUR_JAR_PATH:Halo 安装包的绝对路径,例如 /home/halo/app/halo.jar
  • USER:运行 Halo 的系统用户的用户名,如果有按照上方教程创建新的用户来运行 Halo,修改为你创建的用户名称即可。反之请删除User=USER,如你使用root用户运行。
    [Unit]
    Description=Halo Service
    Documentation=https://halo.run
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    Type=simple
    User=USER
    ExecStart=/usr/bin/java -server -Xms256m -Xmx256m -jar YOUR_JAR_PATH
    ExecStop=/bin/kill -s QUIT $MAINPID
    Restart=always
    StandOutput=syslog
    
    StandError=inherit
    
    [Install]
    WantedBy=multi-user.target
  • 确保ExecStart中的/usr/bin/java命令正确并且运行成功的(命令是通过绝对路径来访问java)。

重新加载 systemd

$ systemctl daemon-reload

这样就可以通过systemctl命令来控制Halo程序的启动等操作了。

运行服务

$ systemctl start halo

在系统启动时启动服务

$ systemctl enable halo

您可以查看服务日志检查启动状态

$ journalctl -n 20 -u halo

nginx反代理

博客配置使用了非80端口,那么我们就要使用nginx来让非80端口“映射”到80端口,就可以使用nginx反代理功能。
安装nginx

$ sudo apt install nginx

编辑默认的配置文件:

$ sudo vim /etc/nginx/sites-enable/default

根据官方文档,将如下填写配置文件

upstream halo {
  server 127.0.0.1:8090;
}
server {
  listen 80;
  listen [::]:80;
  server_name youdomain.com;
  client_max_body_size 1024m;
  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;
  }
}
  • 127.0.0.1:后面填写Halo设置的端口号。
    upstream halo {
      server 127.0.0.1:8090;
    ......
  • server_name:填写你要绑定的域名
    ......
    server_name youdomain.com;
    ......
    之后保存:wq

重启nginx

$ systemctl restart nginx

使用域名访问就可以成功进入博客了!

撰写长教程文章不易,给个赞或者留一条评论再走啊😊😊
如果你觉得文章对你很有用,可以随意捐赠,非常感谢😚😚🙏🙏

参考文献: