前言:我是不爱写东西的,但是从上次面试过之后,才知道个人博客也是能拿来说道的。正好白嫖到了华为的服务器,那就买个域名,尝试做一下吧。

本篇文章将从服务器用户创建开始,安装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 用户,请跳过这一步”。

  1. 创建新用户:
sudo adduser newuser
  1. 将新用户添加到sudo组,以授予su权限:
sudo usermod -aG sudo newuser
  1. 验证用户权限: 使用新用户登录,并运行以下命令检查是否有sudo权限:
sudo whoami

2. 在服务器控制台开启端口

为了稍后能在浏览器访问到页面,我们需要开启:

  • 80端口 http服务
  • 443端口 https服务
  • 8090端口 halo(部署成功后关闭)

每家服务器的开启方式略有不同,下面是我使用的华为云的开启方式:

在控制台找到你的应用服务器,选择更改安全组,添加入方向规则,443和8090端口同理。

Pasted image 20241123130509

{708441E4 B499 4A7C BD83 293795BA298F}

{6AA33FA2 DF61 4042 BA2E AFBA1D0C4D99}

开始部署

1. 安装jre17

  1. 更新系统软件包列表
sudo apt update
  1. 安装openJRE17
sudo apt install openjdk-17-jre
  1. 验证安装
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数据

  1. 安装postgresql
sudo apt install postgresql
  1. 验证postgresql是否运行

postgresql安装完成后默认是运行的,如果没有运行使用下面的命令运行。

// 查看运行状态
sudo systemctl status postgresql
// 启动postgresql
sudo systemctl start postgresql
  1. 切换到postgres用户

在安装完postgresql后,会自动创建postgres用户,该用户是数据库的超级管理员,拥有所有权限。

sudo -u postgres -i
  1. 进入postgresql
psql
  1. 修改postgres用户的登录密码

postgresql在本地使用peer进行身份验证,这也是为什么刚才postgres用户使用psql命令就可以直接进入控制台的原因。但是在halo项目中,使用通过本地网络连接到数据库的,因此我们需要设置连接时的密码。

\password postgres
  1. 创建halo数据库
create database halo with owner=postgres encoding='UTF-8';
  1. 验证能否通过网络连接
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

从这里开始官网就开始有非常详细的讲解了。下面的内容来自官网,有部分修改。

  1. 登录到在前置步骤中创建的用户】
su - halo
  1. 创建存放运行包的目录,这里以 ~/app 为例
mkdir ~/app && cd ~/app
  1. 下载运行包
wget https://dl.halo.run/release/halo-2.20.9.jar
  1. 创建工作目录
mkdir ~/.halo2 && cd ~/.halo2
  1. 创建 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
  1. 测试运行 Halo
cd ~/app && java -Dfile.encoding=UTF-8 -jar halo.jar --spring.config.additional-location=optional:file:$HOME/.halo2/
  1. 如果没有观察到异常日志,即可尝试访问 Halo

此时可以打开浏览器,在地址栏中输入:http://iP:8090,即可打开Halo的配置页面。但是此时的Halo只能算是测试运行,你可以通过重新连接ssh或Ctrl + C键强制退出程序。

  1. 将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. 域名解析

首先你需要购买一个域名,我是在阿里云购买的。进入控制台找到域名列表中你的域名,选择解析,添加记录:

{BBFF697D 2F89 4081 B4AB FF53B01DA2F6}

添加完成,稍后在浏览器访问http://域名:8090,查看是否解析成功。

5. 实现反向代理

  1. 下载nginx
sudo apt install nginx
  1. 打开nginx配置文件
sudo vim /etc/nginx/nginx.conf
  1. 将下面的内容添加到配置文件的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;
	  }
	}
}
  1. 重启nginx
sudo systemctl restart nginx

现在你不需要在域名后面添加端口号也能访问到网站了,但是使用http是不安全的,至少别人访问网站的时候会提示连接不安全。我们可以使用https来解决这个问题。

6. 申请ssl证书

在阿里云中搜索数字证书管理服,找到ssl证书管理,选择“个人测试证书”

Pasted image 20241123142708

选择购买证书,个人测试证书,支付0元后返回

Pasted image 20241123142714

点击创建证书,按照提示创建即可。

Pasted image 20241123143000

提交申请后,大约10分钟,会收到邮件,在证书页面也能看到提示“已签发”

Pasted image 20241123142728

进入证书的详情页面,下载服务器为类型为nginx的证书

Pasted image 20241123143216

创建/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协议访问网站了,安全可靠!

鸣谢

Halo
ChatGPT
ubuntu安装postgreSQL