基于 Halo 搭建博客

本文记录在 CentOS 7.6 系统上基于 Halo 快速搭建博客,博客系统很多,暂不与其它系统做比较,喜欢折腾就折腾。

Halo 有三种部署方式,我这里选择直接在物理机上部署,其它两种是基于 Docker 和 Docker Compose。

安装

Halo 推荐创建一个 Halo 用户,我这里省略了这一步,麻烦。

更新系统软件包

yum update -y

安装 Java 运行环境

# 安装 OpenJRE
sudo yum install java-1.8.0-openjdk -y

# 检测是否安装成功
java -version

# 输出如下即为安装成功
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)

下载 Halo 配置文件

# 下载配置文件到 ~/.halo 目录
curl -o ~/.halo/application.yaml --create-dirs https://dl.halo.run/config/application-template.yaml

修改配置文件

# 使用 Vim 工具修改配置文件
vim ~/.halo/application.yaml

把配置文件里的 usernamepassword修改一下,这个是你登录管理后台的账号密码,其它基本不用动,具体可以看一下官网文档说明。

下载最新的安装包

# 下载最新的 Halo 安装包,{{version}} 为版本号,不带 v,更多下载地址请访问 https://halo.run/archives/download.html
wget https://dl.halo.run/release/halo-{{version}}.jar -O halo-latest.jar

写此文时,Halo 的最新版本是v1.3.2,所以我的下载命令为:

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

启动测试

java -jar halo-latest.jar

看到以下输出内容即为启动成功:

启动成功

配置开机后台自启动

# 下载 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

打开服务配置文件后可以看到内容如下参数:

  • -Xms256m:为 JVM 启动时分配的内存,请按照服务器的内存做适当调整,512 M 内存的服务器推荐设置为 128,1G 内存的服务器推荐设置为 256,默认为 256。
  • -Xmx256m:为 JVM 运行过程中分配的最大内存,配置同上。
  • YOUR_JAR_PATH:Halo 安装包的绝对路径,例如 /www/wwwroot/halo-latest.jar

我的服务器是 8 G 内存,并且安装包的绝对路径是 /root/halo-latest.jar,所以我最终的配置是如下:

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

[Service]
Type=simple
ExecStart=/usr/bin/java -server -Xms2048m -Xmx2048m -jar /root/halo-latest.jar
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=always
StandOutput=syslog

StandError=inherit

[Install]
WantedBy=multi-user.target

顺序执行以下命令,最后看到 Halo 的服务状态:

# 修改 service 文件之后需要刷新 Systemd
sudo systemctl daemon-reload

# 使 Halo 开机自启
sudo systemctl enable halo

# 启动 Halo
sudo service halo start

# 查看 Halo 的运行状态
sudo service halo status

Halo 服务的运行状态

到此,已经可以通过 IP:端口 访问了,接下来我们配置域名,使用 Nginx 作为反向代理并配置 SSL 强制 HTTPS 访问。

配置域名

因为我这台服务器以后还需要用到 PHP 项目,所以不会按照官网的方式去配置,而是使用 LNMP 一键安装脚本安装 Nginx、PHP、MySQL 等其它软件,并使用这个脚本结合阿里云 DNS 配置 Let’s Encrypt 的 SSL 证书,用这个脚本很方便。

准备工作

在开始之前,先在服务器上安装一个工具 screen,这个工具可以防止我们在安装 LNMP 的时候因为网络突然掉线或者不小心关掉了远程连接工具而导致安装中断。

# 安装 screen
yum install -y screen

# 启动一个 screen 现场
screen -S lnmp

# 如果真的掉线了,可以重新连接到服务器上,前使用以下命令恢复安装进程
screen -r lnmp

安装 LNMP

wget http://soft.vpser.net/lnmp/lnmp1.7.tar.gz -cO lnmp1.7.tar.gz && tar zxf lnmp1.7.tar.gz && cd lnmp1.7 && ./install.sh lnmp

安装过程稍微有些漫长,具体需要看机器配置,鉴于你可能不需要这个东西,所以不再描述。

添加虚拟主机

# 添加虚拟主机,根据你自己的域名做相应调整
lnmp vhost add

添加虚拟主机

配置 SSL 证书和反向代理

申请证书

Let’sEncrypt 免费通配符/泛域名SSL证书添加使用教程 - LNMP一键安装包

我们使用 Let’s Encrypt 结合域名服务商 API 的方式来配置 SSL 证书 。

因为我的域名是在阿里,所以去这里获取到 AccessKey IDAccessKey Secret,并在服务器执行以下命令:

export Ali_Key="你的 AccessKey ID"
export Ali_Secret="你的 AccessKey Secret"

导入这两个环境变量以后,就可以使用以下命令来自动配置 SSL 证书了,Let’s Encrypt 的 SSL 证书有效期只有三个月,但 LNMP 一键安装脚本已经为我们配置好了,过期之前会自动续期。

# 要把这个 ali 替换成你域名所在的服务商名称
lnmp onlyssl ali

配置 SSL 证书

如此,Let’s Encrypt 的免费 SSL 证书就申请好了,接下来配置 SSL 证书和反向代理。

配置 SSL 证书和反向代理

# 把 Nginx 反向代理的示例配置直接覆盖到博客的虚拟主机配置上
cat /usr/local/nginx/conf/example/nginx-reverse-proxy-example.conf > /usr/local/nginx/conf/vhost/coderlxc.com.conf

修改其内容为以下:

  1 server {
  2         listen 80;
  3         #listen [::]:80;
  4         server_name coderlxc.com www.coderlxc.com;
  5 
  6         #如果需要http 301跳转到 https 需要将下面行前面的 # 注释去掉,并重载nginx
  7         return 301 https://$host$request_uri; 
  8 
  9         access_log off;
 10 }
 11 
 12 server {
 13         listen 443 ssl http2;
 14         #listen [::]:443 ssl http2;
 15         server_name coderlxc.com www.coderlxc.com;
 16         
 17         ssl_certificate /usr/local/nginx/conf/ssl/coderlxc.com/fullchain.cer;
 18         ssl_certificate_key /usr/local/nginx/conf/ssl/coderlxc.com/coderlxc.com.key;
 19         ssl_session_timeout 5m;
 20         ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
 21         ssl_prefer_server_ciphers on;
 22         ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES    -128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AE    S256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
 23         ssl_session_cache builtin:1000 shared:SSL:10m;
 24         # openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
 25         # ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
 26         
 27         location / {
 28             proxy_pass http://127.0.0.1:8090;
 29             proxy_http_version    1.1;
 30             proxy_cache_bypass    $http_upgrade;
 31             proxy_set_header Upgrade            $http_upgrade;
 32             proxy_set_header Connection         "upgrade";
 33             proxy_set_header Host               $host;
 34             proxy_set_header X-Real-IP          $remote_addr;
 35             proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
 36             proxy_set_header X-Forwarded-Proto  $scheme;
 37             proxy_set_header X-Forwarded-Host   $host;
 38             proxy_set_header X-Forwarded-Port   $server_port;
 39         }   
 40 
 41         access_log off;
 42 }
  • 打开第 7 行的注释,以强制跳转到 HTTPS,并删除下面没用的内容。
  • 修改第 17、18 行内容,调整为你自己证书的路径,路径在 LNMP 脚本安装完以后已经显示在终端中。
  • 注释掉第 25 行,因为我们没有这个玩意儿,会导致报错。
  • 将第 28 行的 3000 端口调整为Halo 监听的 8090端口。

至此,SSL 证书和和反向代理都已经配置好了,并强制 HTTP 跳转到 HTTPS。

保存修改并退出后,检查一下 Nginx 的配置文件是否有问题,重新加载 Nginx 配置文件:

# 检查 Nginx 配置是否有误
nginx -t

# 重新加载 Nginx 配置文件
lnmp nginx reload

访问博客域名,即可以看到 Halo 的安装向导。

阅读 320

推荐阅读