在银河麒麟高级服务器V11操作系统中安装部署国产开源博客系统Halo的体系化实操教程——可直接用于生产环境

一、安装部署mysql

在银河麒麟高级服务器系统中安装部署mysql数据库有如下两种方法:

《1》是直接手动配置银河麒麟官方安装源在线安装,虽然这种安装的方法较为便捷但是版本老旧;

《2》直接从mysql官网下载安装二进制包,这种方法较为灵活方便且可以安装使用最新稳定版本。

1.1、方法一:手动配置银河麒麟系统官方安装源方法

在我们没有配置指定安装源的时候,直接想要安装mysql【yum install mysql】时提示"

No match for argument: mysql

Error: Unable to find a match: mysql"表示没有在安装源中找到匹配的mysql,如下图所示:

此时就需要我们进行手动配置银河麒麟高级服务器系统的安装源【https://update.cs2c.com.cn/NS/HOST/2406/os/adv/lic/base/x86_64/Packages/】了,详细操作如下:

bash 复制代码
#手动配置银河麒麟高级服务器系统官方安装源方法

#1-进入安装源的目录下
cd /etc/yum.repos.d/

#2-编辑安装源文件【kylin_x86_64.repo 】
vi kylin_x86_64.repo 

#3-手动添加安装源内容(如:我这里添加银河麒麟的Host源内容如下)
[kylin-adv-host]
name= kylin-adv-host
baseurl = https://update.cs2c.com.cn/NS/HOST/2406/os/adv/lic/base/x86_64/
gpgcheck =1 
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-kylin
enabled = 1

#4-完整安装mysql内容
dnf install mysql-server mysql mysql-common mysql-libs

#5-mysql安装完成后启动(启动mysql服务完成后会自动初始化系统库以及启动相关服务且会生成root用户的默认密码,可从【/var/log/mysqld.log】日志文件中获取临时的密码,此密码可用于临时登录,登录后,需要马上修改为自己的新密码)
systemctl start mysqld
tail -f /var/log/mysqld.log

#6-获取到临时密码后登录mysql修改root用户密码(如修改root用户的密码为abc123456)
mysql -uroot -p'临时密码'
alter user 'root'@'localhost' identified by 'abc123456';
flush privileges;
quit;

1.2、方法二:直接从mysql官网下载安装二进制包

全网最全的关系型数据库MySQL解析及其安装部署的保姆级教程https://coffeemilk.blog.csdn.net/article/details/151891095?spm=1001.2014.3001.5502

进入Mysql的社区版(Community Server)下载界面选择对应的版本-->【Linux Generic】-->【选择CPU架构(如:x86)】后即可选择第一个Mysql压缩过的二进制包下载。

bash 复制代码
#安装部署Mysql官方的二进制包实操流程

#0-查看自己系统当前的glibc版本(然后根据自己系统当前的glibc版本去下载对应的mysql二进制包)
rpm -qa | grep glibc
 
#1-我这里的glibc版本是【glibc-2.38】则下载小于等于该版本的Mysql二进制压缩包到本地的/data目录中,且支持断点续传
wget https://dev.mysql.com/get/Downloads/MySQL-8.4/mysql-8.4.7-linux-glibc2.28-x86_64.tar.xz -c 0 -P /data
#1.1-若直接使用wget下载mysql到银河麒麟高级服务器操作系统上缓慢,则可以直接使用浏览器到官网先下载下来再上传到该服务器上
yum install lrzsz -y
cd /data
rz

#2-进入/data目录解压下载好的Mysql二进制压缩包到指定目录【/usr/local/mysql】(之所以要解压到/usr/local目录下是由于二进制版本的很多编译环境都在该目录下)
cd /data
mkdir -p /usr/local/mysql
tar -xvf mysql-8.4.7-linux-glibc2.28-x86_64.tar.xz -C /usr/local/mysql
 
#3-进入/usr/local/mysql目录中修改文件名称为【mysql-8.4.7】且进入该目录下创建data、etc、logs文件夹
cd /usr/local/mysql/
mv mysql-8.4.7-linux-glibc2.28-x86_64 mysql-8.4.7
cd mysql-8.4.7/
mkdir data
mkdir etc
mkdir logs
 
#4-创建Mysql的服务用户mysql
useradd mysql
id mysql
 
#5-进入mysql的etc目录下创建配置文件【my.cnf】
cd /usr/local/mysql/mysql-8.4.7/
vi my.cnf
 
[mysqld]
#指定mysql的数据存放路径
datadir=/usr/local/mysql/mysql-8.4.7/data
socket=/tmp/mysql.sock
#指定mysql的报错日志文件
log-error=/usr/local/mysql/mysql-8.4.7/logs/mysqld-error.log
pid-file=/usr/local/mysql/mysql-8.4.7/logs/mysqld.pid
port=13336
user=mysql
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
#默认时区(东八区)
default-time-zone='+8:00'
#数据库日志时间匹配系统时区
log_timestamps=system
#表名和字段名不区分大小写
lower_case_table_names=1
 
#6-将mysql文件夹及其内容都授权给mysql用户并初始化(注意:初始化后没有任何信息提示表示初始化成功,否则就是有问题的)
chown -R mysql:mysql /usr/local/mysql/mysql-8.4.7
/usr/local/mysql/mysql-8.4.7/bin/mysqld  --defaults-file=/usr/local/mysql/mysql-8.4.7/etc/my.cnf --initialize --user=mysql
 
#7-查看日志文件获取临时密码(复制一份临时密码用于登录和修改密码)
cd /usr/local/mysql/mysql-8.4.7/logs/
tail -f mysqld-error.log
 
#8-手动启用mysql服务测试(如可以指定默认的配置文件【 --defaults-file=/usr/local/mysql/mysql-8.4.7/etc/my.cnf】)
/usr/local/mysql/mysql-8.4.7/bin/mysqld_safe --defaults-file=/usr/local/mysql/mysql-8.4.7/etc/my.cnf
 
#9-查看mysql的进程、网络端口内容(查看到对应的mysql进程与网络端口与我们配置的一致表示正常;确认正常后即可杀死该进程)
ps -ef | grep mysql
netstat -antlp | grep mysql
 
#10-使用root账号临时密码登录mysql数据库后修改密码后退出(查看是否可以登录进去,可登录则表示成功)
/usr/local/mysql/mysql-8.4.7/bin/mysql -uroot -p'临时密码'
alter user 'root'@'localhost' identified by 'abc123456';
flush privileges;
quit;
 
#11-配置mysql的服务并启动和设置开机自启
vi /etc/systemd/system/mysqld.service
 
[Unit]
Description=MySQL Server 8.4.7
After=network.target
 
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/mysql-8.4.7/bin/mysqld_safe --defaults-file=/usr/local/mysql/mysql-8.4.7/etc/my.cnf
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -TERM $MAINPID
Restart=on-failure
 
[Install]
WantedBy=multi-user.target
 
 
#11.1-重载所有服务
systemctl daemon-reload
 
#11.2-启动mysql服务(注意:在启动前需要将临时启用的Mysql进程杀死)
systemctl start mysqld.service
 
#11.3-查看mysql服务状态
systemctl status mysqld.service
 
#11.4-设置mysql服务开机自启
systemctl enable mysqld.service 
 
#11.5-停止mysql服务
systemctl stop mysqld.service
 
#12-可以重启Linux后查看mysql服务状态看它是否开机重启
reboot now
systemctl status mysqld.service

到这里恭喜你,在银河麒麟高级服务器操作系统上安装mysql完成了。

二、安装部署国产开源博客Halo

2.1、国产开源博客Halo简介

Linux系统中安装部署开源的建站、博客工具------Halohttps://coffeemilk.blog.csdn.net/article/details/153977610?spm=1001.2014.3001.5502 Halo是一款基于Java,使用vue+spring boot框架开发的开源建站工具,可以配合上不同的模板、插件,帮助我们构建出自己想要的站点(可以是公司的官网、也可以是自己的个人博客、还可以作为团队的共享知识库、论坛,甚至可以构建为一个商城);拥有完整的后台管理与前台展示;属于动态框架。

由于halo是java语言编写的,因此在构建博客系统之前,需要配置java程序运行环境,也就是Jre,但为了方便,我们直接下载JDK软件包即可。JDK 是java development kit,是java的开发工具包,里面包含了各种类库和工具。当然也包括了另外一个Jre。JDK有oracle jdk和open jdk,建议使用openjdk。

2.2、安装java环境_openjdk、openjre

使用 JAR 文件部署 | Halo 文档https://docs.halo.run/getting-started/install/jar-file

|--------|-------------------------------------------------|
| 序号 | Halo所需环境说明 |
| 1 | 2.21及其以上版本的Halo使用JRE 21 2.20及其以下版本的Halo使用JRE 17 |
| 2 | 数据库支持:mysql5.7及其更高版本、MariaDB、PostgreSQL |
[国产开源博客Halo所需环境]

这是红帽官网提供的OpenJDK下载网址,在这里可以查找到对应的java jdk包下载(注意:这些OpenJDK包的下载需要用账号登录红帽官网后才能下载):如下图所示:

bash 复制代码
#安装java的Jdk、jre环境有两种方法
 
#方法一:直接在线安装java的JDK包(如:我这里安装java-21-openjdk-devel)
#注意:可以先检查当前Linux是否支持指定版本的jdk环境(如没有jdk21则无法使用yum安装,需手动安装)
yum list | grep jdk
yum install java-21-openjdk-devel -y
 
 
 
#方法二:直接手动安装配置指定版本java的jdk和jre
#手动安装openjdk21实操流程(其余版本的Jdk安装方法也一样)
#1-检查Linux支持的jdk环境(若没有jdk21则无法使用yum安装,需手动安装)
yum list | grep jdk
 
#2-下载openjdk21的压缩包【注意:这个openjdk的下载链接需要自己到红帽官网获取,我这里提供的会失效】
wget https://access.cdn.redhat.com/content/origin/files/sha256/1a/1ae9385bde47c7928dc9b328eee8771e5f3ab94f425d19940fe7b105ac882bce/java-21-openjdk-21.0.9.0.10-1.portable.jdk.x86_64.tar.xz?_auth_=1761740868_99dc162417e4a3dd4e27ea8b7bc669e9 -c 0 -P /data
 
#3-解压openjdk21并修改名称
cd /data/
tar -xvf 'java-21-openjdk-21.0.9.0.10-1.portable.jdk.x86_64.tar.xz?_auth_=1761740868_99dc162417e4a3dd4e27ea8b7bc669e9'
mv java-21-openjdk-21.0.9.0.10-1.portable.jdk.x86_64 openjdk2109010
 
#4-编辑环境配置文件并添加openjdk21的环境变量
vi /etc/profile
#openjdk21 enviroment
export JAVA_HOME=/data/openjdk2109010
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
 
#5-让修改的环境变量生效
source /etc/profile
 
#6-查看java版本信息
echo $JAVA_HOME
echo $PATH
java -version
 
 
 
#7-安装openjdk21对应的jre
#7.1-下载openjdk21对应的jre二进制压缩包
wget https://access.cdn.redhat.com/content/origin/files/sha256/7e/7e3a9fccc57747b82be044096d7a10ebfd6ef6333e3fe351bcfb4dd8a44abbcc/java-21-openjdk-21.0.9.0.10-1.portable.jre.x86_64.tar.xz?_auth_=1761741095_3bd83086c5c03e98940d93d72265bed6 -c o -P /data
 
#7.2-进入/data目录并解压下载好的jre21包
cd /data
tar -xvf 'java-21-openjdk-21.0.9.0.10-1.portable.jre.x86_64.tar.xz?_auth_=1761741095_3bd83086c5c03e98940d93d72265bed6'
 
#7.3-将解压好的jre17复制一份到openjdk21目录中并修改名字为jre
cp -r java-21-openjdk-21.0.9.0.10-1.portable.jre.x86_64 openjdk2109010/
cd openjdk2109010/
mv java-21-openjdk-21.0.9.0.10-1.portable.jre.x86_64 jre
 
#7.4-查看jre的路径信息
echo $JRE_HOME

到这里恭喜你,在当前的银河麒麟高级服务器操作系统上安装openjdk21环境完成。

2.3、mysql中创建Halo所需的数据库

|--------|----------------------------|
| 序号 | Halo对mysql数据库的硬性要求 |
| 1 | mysql版本必须是5.7及其更高 |
| 2 | 字符集(Character Set):utf8mb4 |
| 3 | 排序规则(Collate):utf8mb4_bin |
| 4 | 存储引擎:InnoDB |
[Halo对mysql数据库的硬性要求]

关系数据库MySQL的常用基础命令详解实战https://coffeemilk.blog.csdn.net/article/details/151959864?spm=1001.2014.3001.5502MySQL :: MySQL 8.4 参考手册 :: 7.1.8 服务器系统变量 - MySQL 数据库https://dev.mysqlserver.cn/doc/refman/8.4/en/server-system-variables.html#sysvar_default_storage_engine

bash 复制代码
#先查看本机的IP(如:我这里获取到的系统ip是:192.168.1.25)
ip a

#登录mysql数据库,并在mysql数据库中创建halo数据库和ck用户;并授予ck用户操作halo数据库的所有权限
#mysql -uroot -p
/usr/local/mysql/mysql-8.4.7/bin/mysql -uroot -p
show variables like '%storage_engine%';
show databases;
create database halo character set utf8mb4 collate utf8mb4_bin;
show databases;
create user ck@'192.168.1.25' identified by 'qwer1234';
grant all on halo.* to ck@'192.168.1.25';
select user,host from mysql.user;
show grants for ck@'192.168.1.25';
flush privileges;
exit

2.4、安装部署Halo流程

bash 复制代码
#使用jar包搭建halo实操流程(官网地址【https://docs.halo.run/getting-started/install/jar-file】)
 
#0-创建halo用户密码、然后切换到halo用户下创建halo的工作目录
useradd -m halo
passwd halo
su - halo
mkdir ~/app && cd ~/app
 
#1-下载halo的包(halo的java环境要求:2.20 及以下版本:JRE 17;2.21 以上版本:JRE 21)
wget https://dl.halo.run/release/halo-2.21.10.jar -O halo.jar
 
#2-创建halo的工作目录【/home/halo/.halo2】和配置文件【application.yaml】
mkdir ~/.halo2 && cd ~/.halo2
vim application.yaml
#halo的配置文件【application.yaml】内容如下:
server:
  # 运行端口
  port: 8092
spring:
  # 数据库配置,支持 MySQL、MariaDB、PostgreSQL、H2 Database,具体配置方式可以参考下面的数据库配置
  r2dbc:
    url: r2dbc:pool:mysql://192.168.1.25:13336/halo
    username: ck
    password: qwer1234
  sql:
    init:
      mode: always
      # 需要配合 r2dbc 的配置进行改动
      platform: mysql
halo:
  # 工作目录位置
  work-dir: /home/halo/.halo2
  # 外部访问地址
  external-url: http://localhost:8092
  # 附件映射配置,通常用于迁移场景
  attachment:
    resource-mappings:
      - pathPattern: /upload/**
        locations:
          - migrate-from-1.x
 
#3-注意:如果当前服务器开启了防火墙则需要放开8092端口
systemctl status firewalld
firewall-cmd --list-port
firewall-cmd --zone=public --add-port=8092/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-port
 
#4-测试系统的java环境(若未安装java或者安装的版本不对可参照如上【2.2、安装java环境_openjdk、openjre】操作)
java -version
 
#5-安装mysql数据库,并在mysql数据库中创建halo数据库和ck用户;并授予ck用户操作halo数据库的所有权限【2.3、mysql中创建Halo所需的数据库】操作即可

#6-测试运行Halo(若没有观察到异常日志,即可在浏览器输入当前Halo所在服务器的ip:8092 访问halo的初始界面(如:192.168.1.25:8092)【ip a】命令可查看当前服务器IP信息)
cd ~/app && java -Dfile.encoding=UTF-8 -jar halo.jar --spring.config.additional-location=optional:file:$HOME/.halo2/
 


#7-将halo作为一个服务
#7.1-登录到root用户(或从当前halo用户退出到root)
exit
#7.2-创建halo的服务文件
vim /etc/systemd/system/halo.service
#halo的服务文件【/etc/systemd/system/halo.service】内容
[Unit]
Description=Halo Service
Documentation=https://docs.halo.run
After=network-online.target
Wants=network-online.target
 
[Service]
Type=simple
User=halo
ExecStart=/usr/bin/java -Dfile.encoding=UTF-8 -server -Xms256m -Xmx256m -jar /home/halo/app/halo.jar --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
 
 
#8-重新加载systemd
systemctl daemon-reload
 
#9-启动halo服务
systemctl start halo
 
#10-设置halo服务开机自启
systemctl enable halo
 
#11-查看halo服务状态
systemctl status halo
 
#12-查看halo服务日志
journalctl -n 20 -u halo

如上图所示的测试运行Halo时输出的控制台内容也没有报错信息,然后我们访问该Halo所在服务器的IP:8092(如:192.168.1.25:8092)后即可看到这个Halo的初始界面则表示安装的Halo成功了(注意:若我们访问【192.168.1.25:8092】没有显示这个界面,则需要检查Halo所在的服务器的防火墙是否放开了8092这个端口,没有则需要放开)。

2.5、Halo博客的美化

在Halo博客的管理后台点击左侧导航栏最底部的【应用市场】-->【主题】-->【免费】即可看到很多的主题内容,点击任意一个主题即可查看到该主题的风格内容,并且还提供了主题的演示网址可以查看效果,自己可以查看演示主题的效果后选择符合自己需求的主题安装即可,如下图所示:

对于文章来说,除了可以直接在线编辑之外,还可以通过安装插件实现本地文章内容的导入导出:即在Halo博客的管理后台点击左侧导航栏最底部的【应用市场】-->【插件】-->【免费】-->输入【导入】即可过滤出所有相关插件内容,然后点击主题右下角的【安装】按钮即可,如下图所示:

三、安装部署Nginx实现Halo博客的反向代理

使用源码安装配置Linux上的Web服务器------Nginxhttps://coffeemilk.blog.csdn.net/article/details/150780215 由于我们配置的Halo博客访问地址是8092,直接将halo服务暴露在外网直接访问是十分不安全的; 因此一个安全的博客系统,需要在halo的前端部署一个代理服务器,让用户的所有访问请求都转向代理服务器。

bash 复制代码
#1-直接使用银河麒麟官方的源在线安装Nginx
yum install nginx -y

#2-使用在线安装方式安装的nginx的配置文件内容一般都是放置在【/etc/nginx/】目录下
cd /etc/nginx/
ll

#3-编辑nginx的配置文件添加Halo博客的反向代理(Nginx配置反向代理,需要进入【/etc/nginx/default.d】目录中新增一个名为【halo.conf】文件)文件中添加的反向代理内容如下:
location / {
                proxy_pass http://192.168.1.25:8092;
                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;
        }


#4-验证nginx配置是否有语法错误并启动、设置nginx开机自启
nginx -t
systemctl start nginx
systemctl  enable nginx
ps -ef | grep nginx
netstat -antlp | grep nginx

#5-放开防火墙的80端口
systemctl status firewalld
firewall-cmd --list-port
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-port

#6-【确认直接使用IP即可访问Halo博客后】就可以将防火墙放开的8092端口关闭
firewall-cmd --zone=public --remove-port=8092/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-port

#7-查看nginx的访问日志
tail -f /var/log/nginx/access.log

#8-当我们在Halo的后台上传附件时,提示"413 Request Entity Too Large"时是因为nginx默认客户端可以上传的内容最大为1M,超过1M的就会报这个错误了,因此我们需要在nginx的主配置文件【/etc/nginx/nginx.conf】的http端下添加【client_max_body_size 600M】
tail -f /var/log/nginx/error.log
vi /etc/nginx/nginx.conf
client_max_body_size 600M;


#9-不间断nginx业务实现重启nginx服务,让配置生效
#9.1-查看系统当前运行的nginx服务,且获取到当前运行的nginx父进程PID编号命令
ps -ef | grep nginx
 
#9.2-不间断nginx业务重启nginx服务,让配置生效命令(若:当前运行的nginx父进程的PID是25591)
kill -HUP 25591

#10-再次在Halo的后台上传附件时在600M以内的文件即可上传成功

四、对Halo博客通过nginx绑定SSL证书实现https加密传输

4.1、http与https

|---|------------------------------------------------|
| HTTP是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP); HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全。 ||
| HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版本; HTTPS协议是利用SSL+HTTP协议建立安全信道,加密数据包,提供身份认证的网络协议,要比http协议安全。 ||
| HTTPS和HTTP的区别: ||
| 1 | http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。 |
| 2 | http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。 |
| 3 | 使用https协议需要申请SSL证书,证书有收费和免费的。 |
[http与https]

4.2、SSL证书的获取

注意:商业CA机构颁发证书时,需要绑定公网域名(也就是说申请SSL证书之前,你的域名已经申请好了,并且也做了域名备案和解析,否则无法申请SSL证书)。

有很多网站都提供免费的SSL证书(如:阿里云,可以申请一年免费的SSL证书,申请方式如下:

bash 复制代码
#1-查看当前的nginx是否配置了ssl模块(查看到编译参数后看是否存在【--with-http_ssl_module】内容有则表示该nginx编译了ssl模块可以使用SSL证书内容)
nginx -V

#2-验证nginx已经包含SSL模块后(将证书绑定到服务器的nginx配置上即可,在nginx上配置ssl证书【需要在nginx.conf中添加一个server段,配置内容如下)
server
  {
    listen       443 ssl;
    server_name  www.ck.com;
    ssl_certificate     ck/376621_www.ck.com.pem;
    ssl_certificate_key ck/376621_www.ck.com.key;
    ssl_prefer_server_ciphers on;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         "HIGH:!aNULL:!MD5";
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-Xss-Protection 1;

    location / {
            proxy_pass http://192.168.1.25:8092;
            proxy_set_header Host $proxy_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
  }