[toc]

一、在 Linux 服务器部署 Halo

1.环境配置

centos 7.0 x64

512MB内存及以上

2.服务器配置

2.1 更新软件包

请确保服务器的软件包已经是最新的。

yum update -y

2.2 安装 Java 运行环境

  • 若已经存在 Java 11 运行环境的可略过这一步,但路径要相同。

yum安装 openjdk11

yum install -y java-11-openjdk

安装位置默认为/usr/lib/jvm/,修改目录名

mv -v java-11-openjdk-11.0.12.0.7-0.el7_9.x86_64 jdk11

修改配置文件

vim /etc/profile

将光标移动到最后,在后面添加

export JAVA_HOME=/usr/lib/jvm/jdk11
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

立即生效

source /etc/profile

检测是否安装成功

java -version

openjdk version "11.0.12" 2021-07-20 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.12+7-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.12+7-LTS, mixed mode, sharing)

3.安装 Halo

3.1 下载运行包

创建存放运行包的目录

mkdir ~/app && cd ~/app

下载运行包

wget https://dl.halo.run/release/halo-1.4.11.jar -O halo.jar

创建工作目录

mkdir ~/.halo && cd ~/.halo

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

wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml

3.2 修改配置文件

完成上一步操作,我们就可以自己配置 Halo 的运行端口,以及数据库相关的配置了。

使用 Vim 工具修改配置文件

vim ~/.halo/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
  1. 如果需要自定义端口,修改 server 节点下的 port 即可。
  2. 默认使用的是 H2 Database 数据库,这是一种嵌入式的数据库,使用起来非常方便。需要注意的是,默认的用户名和密码为 admin123456,这个是自定义的,最好将其修改,并妥善保存。
  3. 如果需要使用 MySQL 数据库,需要将 H2 Database 的所有相关配置都注释掉,并取消 MySQL 的相关配置。另外,MySQL 的默认数据库名为 halodb,请自行配置 MySQL 并创建数据库,以及修改配置文件中的用户名和密码。
  4. h2 节点为 H2 Database 的控制台配置,默认是关闭的,如需使用请将 h2.console.settings.web-allow-othersh2.console.enabled 设置为 true。控制台地址即为 域名/h2-console。注意:非紧急情况,不建议开启该配置。
  5. server.compression.enabledGzip 功能配置,如有需要请设置为 true,需要注意的是,如果你使用 Nginx 或者 Caddy 进行反向代理的话,默认是有开启 Gzip 的,所以这里可以保持默认。
  6. halo.admin-path 为后台管理的根路径,默认为 admin,如果你害怕别人猜出来默认的 admin(就算猜出来,对方什么都做不了),请自行设置。仅支持一级,且前后不带 /
  7. halo.cache 为系统缓存形式的配置,可选 memorylevel,默认为 memory,将数据缓存到内存,使用该方式的话,重启应用会导致缓存清空。如果选择 level,则会将数据缓存到磁盘,重启不会清空缓存。如不知道如何选择,建议默认。

注意

使用 MySQL 之前,必须要先新建一个 halodb 数据库,MySQL 版本需 5.7 以上。

create database halodb character set utf8mb4 collate utf8mb4_bin;

3.3 运行 Halo

Halo 的整个应用程序只有一个 Jar 包,且不包含用户的任何配置,它放在任何目录都是可行的。需要注意的是,Halo 的整个额外文件全部存放在 ~/.halo 目录下,包括 application.yaml(用户配置文件)template/themes(主题目录)upload(附件上传目录)halo.db.mv(数据库文件)。一定要保证 ~/.halo 的存在,你博客的所有资料可都存在里面。所以你完全不需要担心安装包的安危,它仅仅是个服务而已。

GitHub release

启动测试

cd ~/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:端口号 即可看到安装引导界面。

提示

以上的启动仅仅为测试 Halo 是否可以正常运行,如果我们关闭 ssh 连接,Halo 也将被关闭。要想一直处于运行状态,请继续看下面的教程。

3.4 进阶配置

上面我们已经完成了 Halo 的整个配置和安装过程,接下来我们对其进行更完善的配置,比如:需要开机自启?更简单的启动方式?

实现以上功能我们只需要新增一个配置文件即可,也就是使用 Systemd 来完成这些工作。

下载 Halo 官方的 halo.service 模板

curl -o /etc/systemd/system/halo.service --create-dirs https://dl.halo.run/config/halo.service

下载完成之后,我们还需要对其进行修改。

修改 halo.service

vim /etc/systemd/system/halo.service

打开之后我们需要进行修改以下三处

[Unit]
Description=Halo Service
Documentation=https://halo.run
After=network-online.target
Wants=network-online.target

[Service]
User=USER        #删去此行
Type=simple
ExecStart=/usr/lib/jvm/jdk11/bin/java -server -Xms128m -Xmx128m -jar /root/app/halo.jar     # 修改此行
ExecStop=/usr/lib/jvm/jdk11/bin/kill -s QUIT $MAINPID  # 修改此行,上行也别忘了
Restart=always
StandOutput=syslog

StandError=inherit

[Install]
WantedBy=multi-user.target

参数:

  • -Xms256m:为 JVM 启动时分配的内存,请按照服务器的内存做适当调整,512 M 内存的服务器推荐设置为 128,1G 内存的服务器推荐设置为 256,默认为 256。
  • -Xmx256m:为 JVM 运行过程中分配的最大内存,配置同上。
  • YOUR_JAR_PATH:Halo 安装包的绝对路径,例如 /root/app/halo.jar
  • USER:运行 Halo 的系统用户,如果有按照上方教程创建新的用户来运行 Halo,修改为你创建的用户名称即可。反之请删除 User=USER

提示:

  1. 如果你不是按照上面的方法安装的 JDK,请确保 /usr/bin/java 的路径是正确无误的,类似/usr/lib/jvm/jdk11/bin/java
  2. systemd 中的所有路径均要写为绝对路径,另外,~ 在 systemd 中也是无法被识别的,所以你不能写成类似 ~/halo.jar 这种路径。
  3. 如何检验是否修改正确:把 ExecStart 中的命令拿出来执行一遍。

修改 service 文件之后需要刷新 Systemd

systemctl daemon-reload

运行服务

systemctl start halo

在系统启动时启动服务

systemctl enable halo

查看 Halo 的运行状态

service halo status

完成以上操作即可通过 IP:端口 访问了。不过在此之前,最好先完成后续操作,我们还需要让域名也可以访问到 Halo,请继续看配置域名访问

3.5 更新 Halo

GitHub release

备份数据

cp -r ~/.halo ~/.halo.bak

备份旧的安装包

mv halo.jar halo.jar.bak

下载最新的 Halo 安装包

wget https://dl.halo.run/release/halo-版本号.jar -O halo.jar

测试是否能够正常启动

java -jar halo.jar

重启应用

service halo restart

二、配置域名访问

1.使用 Nginx 进行反向代理

1.1 安装 Nginx

添加 Nginx 源

sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

安装 Nginx

sudo yum install -y nginx

启动 Nginx

sudo systemctl start nginx.service

设置开机自启 Nginx

sudo systemctl enable nginx.service
  • 注:如果出现Nginx启动失败,并显示80端口占用,运行以下代码释放80端口
CMD=`lsof -i:"80" | awk '{print $1}' | grep -v "COMMAND" | sort -u` && systemctl disable ${CMD} && systemctl stop ${CMD} && killall -9 ${CMD}

1.2 配置 Nginx

下载 Halo 官方的 Nginx 配置模板

curl -o /etc/nginx/conf.d/halo.conf --create-dirs https://dl.halo.run/config/nginx.conf

下载完成之后,我们还需要对其进行修改

使用 vim 编辑 halo.conf

vim /etc/nginx/conf.d/halo.conf

打开之后我们可以看到

server {
    listen 80;
   
    #强制转发https
	rewrite ^(.*)$ https://${server_name}$1 permanent;
    server_name example.com;

    location / {
        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;

        proxy_pass http://127.0.0.1:8090/;
    }
}
#开启ssl
server {
  listen 443 ssl;
  server_name example.com;
  client_max_body_size 1024m;
    #添加证书
  ssl_certificate "/home/cert/www/cert.pem";
  ssl_certificate_key "/home/cert/www/cert.key";
  
  ssl_session_timeout 10m;
  
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  
  ssl_ciphers HIGH:!aNULL:!MD5;
  
  # charset utf-8;
  
  location / {
    proxy_pass http://127.0.0.1:8090/;
    
    proxy_redirect     off;

    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;
  }
}

注意:请把 example.com 改为自己的域名。

pemkey证书上传至/home/cert/www/目录下

修改完成之后

检查配置是否有误

sudo nginx -t

重载 Nginx 配置

sudo nginx -s reload

到这里,关于 Nginx 的配置也就完成了,现在你可以访问一下自己的域名,并进行 Halo 的初始化了。

在设置了反向代理之后,请一定记得去 Halo 的管理端设置一下正确的博客地址,否则可能会造成资源获取不成功。

三、其他事项

申请SSL证书

在宝塔面板添加域名,申请ssl证书,选择DNS验证(支持通配符)选择DNS接口,申请证书

在DNS解析添加记录

类型: TXT 
域名: _acme-challenge.me.sunshj.top 
记录值: ZLuAPKLq5_M7KLUFIzgdULtFpJKTTs3GQXonwSHwivY

Q.E.D.


狸猫控股集团大中华区秘书长