Halo构建个人博客-Lazyking建站记录
前言:我是不爱写东西的,但是从上次面试过之后,才知道个人博客也是能拿来说道的。正好白嫖到了华为的服务器,那就买个域名,尝试做一下吧。
本篇文章将从服务器用户创建开始,安装jre、postgresql,运行halo.jar,配置nginx实现反向代理,到申请ssl证书实现Https访问结束,绝对的保姆级教程。
部署环境:
- 服务器:华为云Fleuxs 2核1G
- 系统: Ubuntu 22.04
在部署的时候,1G的内存给我带来了很多的烦恼。因为最开始打算使用mysql数据库,我是真没想到它能这么占内存。当Halo运行之后,机器的剩余内存之后几十M了,ssh连机器都困难😓。最后看了论坛的讨论,最后选用postgresql提供数据库服务。
前置准备
1. 给ubuntu新建一个sudo权限用户
为了避免使用root用户出现“致命”操作,推荐新建一个拥有sudo权限的新用户。同时Halo官方文档也提示:“我们不推荐直接使用系统 root 用户来运行 Halo。如果你需要直接使用 root 用户,请跳过这一步”。
- 创建新用户:
sudo adduser newuser
- 将新用户添加到sudo组,以授予su权限:
sudo usermod -aG sudo newuser
- 验证用户权限: 使用新用户登录,并运行以下命令检查是否有sudo权限:
sudo whoami
2. 在服务器控制台开启端口
为了稍后能在浏览器访问到页面,我们需要开启:
- 80端口 http服务
- 443端口 https服务
- 8090端口 halo(部署成功后关闭)
每家服务器的开启方式略有不同,下面是我使用的华为云的开启方式:
在控制台找到你的应用服务器,选择更改安全组,添加入方向规则,443和8090端口同理。
开始部署
1. 安装jre17
- 更新系统软件包列表
sudo apt update
- 安装openJRE17
sudo apt install openjdk-17-jre
- 验证安装
java -version
// 应出现下面的内容
openjdk version "17.0.13" 2024-10-15
OpenJDK Runtime Environment (build 17.0.13+11-Ubuntu-2ubuntu122.04)
OpenJDK 64-Bit Server VM (build 17.0.13+11-Ubuntu-2ubuntu122.04, mixed mode, sharing)
2. 安装postgresql数据
- 安装postgresql
sudo apt install postgresql
- 验证postgresql是否运行
postgresql安装完成后默认是运行的,如果没有运行使用下面的命令运行。
// 查看运行状态
sudo systemctl status postgresql
// 启动postgresql
sudo systemctl start postgresql
- 切换到postgres用户
在安装完postgresql后,会自动创建postgres用户,该用户是数据库的超级管理员,拥有所有权限。
sudo -u postgres -i
- 进入postgresql
psql
- 修改postgres用户的登录密码
postgresql在本地使用peer进行身份验证,这也是为什么刚才postgres用户使用psql命令就可以直接进入控制台的原因。但是在halo项目中,使用通过本地网络连接到数据库的,因此我们需要设置连接时的密码。
\password postgres
- 创建halo数据库
create database halo with owner=postgres encoding='UTF-8';
- 验证能否通过网络连接
psql -U postgres -h 127.0.0.1 -W
root@host-a72a:# psql -U postgres -h 127.0.0.1 -W
Password:
psql (14.13 (Ubuntu 14.13-0ubuntu0.22.04.1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
postgres=#
3. 安装Halo
从这里开始官网就开始有非常详细的讲解了。下面的内容来自官网,有部分修改。
- 登录到在前置步骤中创建的用户】
su - halo
- 创建存放运行包的目录,这里以
~/app
为例
mkdir ~/app && cd ~/app
- 下载运行包
wget https://dl.halo.run/release/halo-2.20.9.jar
- 创建工作目录
mkdir ~/.halo2 && cd ~/.halo2
- 创建 Halo 配置文件
vim application.yaml
将以下内容复制到 application.yaml
中,如果你跟着上面我的操作,可以只修改username和password
server:
# 运行端口
port: 8090
spring:
# 数据库配置,支持 MySQL、MariaDB、PostgreSQL、H2 Database,具体配置方式可以参考下面的数据库配置
r2dbc:
url: r2dbc:pool:postgresql://127.0.0.1:5432/halo
username: halo
password: your_password
sql:
init:
mode: always
# 需要配合 r2dbc 的配置进行改动
platform: postgresql
halo:
caches:
page:
# 是否禁用页面缓存
disabled: true
# 工作目录位置
work-dir: ${user.home}/.halo2
# 外部访问地址
external-url: http://localhost:8090
# 附件映射配置,通常用于迁移场景
attachment:
resource-mappings:
- pathPattern: /upload/**
locations:
- migrate-from-1.x
- 测试运行 Halo
cd ~/app && java -Dfile.encoding=UTF-8 -jar halo.jar --spring.config.additional-location=optional:file:$HOME/.halo2/
- 如果没有观察到异常日志,即可尝试访问 Halo
此时可以打开浏览器,在地址栏中输入:http://iP:8090,即可打开Halo的配置页面。但是此时的Halo只能算是测试运行,你可以通过重新连接ssh或Ctrl + C键强制退出程序。
- 将Halo作为服务运行
创建halo.service
sudo vim /etc/systemd/system/halo.service
将以下内容复制到 halo.service
中,如果时按照上面的介绍进行的配置,则不需要修改。如果你将halo.jar文件放在了指定位置,请求改ExecStart中的内容。
[Unit]
Description=Halo Service
Documentation=https://docs.halo.run
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=USER
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
重新加载 systemd
systemctl daemon-reload
运行服务
systemctl start halo
在系统启动时启动服务
systemctl enable halo
最后,你可以通过下面的命令查看服务日志:
journalctl -n 20 -u halo
4. 域名解析
首先你需要购买一个域名,我是在阿里云购买的。进入控制台找到域名列表中你的域名,选择解析,添加记录:
添加完成,稍后在浏览器访问http://域名:8090,查看是否解析成功。
5. 实现反向代理
- 下载nginx
sudo apt install nginx
- 打开nginx配置文件
sudo vim /etc/nginx/nginx.conf
- 将下面的内容添加到配置文件的http块中,需要修改server_name为你解析的域名
server {
listen 80;
listen [::]:80;
server_name yourdomain.com;
client_max_body_size 1024m;
location / {
proxy_pass http://127.0.0.1:8090;
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;
}
}
下面是我的nginx配置,如果你不太理解http块什么意思可以参考:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
server {
listen 80;
listen [::]:80;
server_name yourdomain.com;
client_max_body_size 1024m;
location / {
proxy_pass http://127.0.0.1:8090;
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;
}
}
}
- 重启nginx
sudo systemctl restart nginx
现在你不需要在域名后面添加端口号也能访问到网站了,但是使用http是不安全的,至少别人访问网站的时候会提示连接不安全。我们可以使用https来解决这个问题。
6. 申请ssl证书
在阿里云中搜索数字证书管理服,找到ssl证书管理,选择“个人测试证书”
选择购买证书,个人测试证书,支付0元后返回
点击创建证书,按照提示创建即可。
提交申请后,大约10分钟,会收到邮件,在证书页面也能看到提示“已签发”
进入证书的详情页面,下载服务器为类型为nginx的证书
创建/etc/nginx/ssl目录
sudo mkdir /etc/nginx/ssl
将下载下来的zip文件,通过sftp上传到服务器,放到/etc/nginx/ssl目录下,在目录下解压:
unzip lazyking.site_nginx
修改nginx.conf, 可以把做反向代理时添加的配置给删了,换成下面的。
你需要修改server_name、ssl_certificate、ssl_certificate_key
server {
listen 80; # HTTP 监听端口
listen [::]:80;
server_name lazyking.site; # 你的域名
# 强制重定向到 HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl; # SSL 监听端口
listen [::]:443 ssl;
server_name yourdomain.site; # 你的域名
ssl_certificate /etc/nginx/ssl/yourdomain.site.pem; # SSL 证书文件路径
ssl_certificate_key /etc/nginx/ssl/yourdomain.site.key; # 私钥文件路径
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # 启用的 SSL/TLS 协议
ssl_prefer_server_ciphers on;
client_max_body_size 1024m;
location / {
proxy_pass http://localhost:8090; # 后端服务器地址
proxy_set_header Host $host; # 转发主机头
proxy_set_header X-Real-IP $remote_addr; # 转发真实 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 转发 X-Forwarded-For
proxy_set_header X-Forwarded-Proto $scheme; # 转发协议
}
}
重启nginx
sudo systemctl restart nginx
好了,现在你在浏览器通过https协议访问网站了,安全可靠!