博客搭建
现在的博客搭建方式有很多,本文使用的是 halo,它安装起来比较方便快捷,界面也非常清晰简洁。
- 安装方法使用的是 podman
- 代理服务使用的是 nginx
- 数据库使用的是 mysql
安装 podman
podman 是一个容器管理工具,可以很方便的管理容器。它与 docker 相比,更轻量级一些。比如,docker 需要 root权限,而 podman 不需要。
-
podman 安装配置
# 安装依赖 sudo apt-get install podman # 启动服务 sudo systemctl start podman.socket sudo systemctl enable podman.socket # 编辑配置文件 sudo vim /etc/containers/registries.conf # 添加以下内容 unqualified-search-registries = ["docker.io"] -
podman 基本命令
# 搜索镜像 podman search <image_name> # 拉取镜像 podman pull <image_name> # 列出所有镜像 podman images # 删除镜像 podman rmi <image_id> # 列出所有容器 podman ps -a # 启动容器 podman start <container_id> # 停止容器 podman stop <container_id> # 删除容器 podman rm <container_id> # 查看容器日志 podman logs <container_id> # 进入容器 podman exec -it <container_id> bash # 运行容器 podman run -itd --name <container_name> -p <host_port>:<container_port> -v <host_path>:<container_path> <image_name> # -i 表示交互模式 # -t 表示分配一个伪终端 # -d 表示后台运行 # --name <container_name> 表示给容器起一个名字 # -p <host_port>:<container_port> 表示将容器的 <container_port> 端口映射到宿主机的 <host_port> 端口 # -v <host_path>:<container_path> 表示将宿主机的 <host_path> 路径映射到容器的 <container_path> 路径 # 示例 podman run -d --name mysql -p 3306:3306 -v /home/<user>/mysql:/var/lib/mysql mysql:8.0.32 -
podman 扩展知识
- 配置文件路径
- root 用户的路径是 /etc/containers/containers.conf
- 普通 用户的路径是 ~/.config/containers/containers.conf
- 容器配置文件保存
- root 用户的路径是 /var/lib/containers/storage/overlay
- 普通用户的路径是 ~/.local/share/containers/storage/overlay
- 因为 podman 是无根的,所以用户退出后,启动的容器会自动停止。可以使用 sudo loginctl enable-linger 启用linger模式,使得在系统关闭时,当前用户的服务能够继续运行
- 容器内需要访问宿主机时,可以使用 host.containers.internal 替代宿主机 ip
- 配置文件路径
安装 mysql
-
mysql 安装配置
# 下载 MySQL 的官方仓库配置文件,并将其保存到 /tmp 目录中 wget https://repo.mysql.com/mysql-apt-config_0.8.32-1_all.deb -P /tmp # 安装 MySQL 的官方仓库配置文件 sudo dpkg -i /tmp/mysql-apt-config_0.8.32-1_all.deb #1. 选择 MySQL Server & Cluster #2. 选择 mysql-8.4-lts #3. 选择 OK 以应用配置 # 更新源 sudo apt update # 安装 mysql sudo apt install -y mysql-server # 启动 mysql sudo systemctl start mysql sudo systemctl enable mysql # 查看 mysql 状态 sudo systemctl status mysql # 获取 mysql 的初始临时密码,用于登录 sudo grep 'temporary password' /var/log/mysql/error.log # 登录 mysql, 并输入刚才的密码 mysql -u root -p # 修改密码 ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'; -
创建 halo 数据库和用户
# 登录数据库 mysql -u root -p # 创建用户 create user 'halo'@'%' identified by 'halopwd'; # 创建了一个用户名为halo,密码为halopwd的用户 # % 表示允许从任意主机访问 # 创建数据库 create database halo_db charset utf8mb4 collate utf8mb4_bin; # 创建了一个名为halo_db的数据库,字符集为utf8mb4,排序规则为utf8mb4_bin # 授权 grant all privileges on halo_db.* to 'halo'@'%'; # 授权halo用户对halo_db数据库的所有权限 # 刷新权限 flush privileges; # 退出数据库 exit # 退出容器 exit
安装 halo
-
halo 安装配置
# 拉取镜像 podman pull registry.fit2cloud.com/halo/halo:2.20 # 创建本地映射目录 mkdir -p /home/<user>/halo -
启动 halo 容器
podman run -itd \ --name halo \ -p 8090:8090 \ -v ~/halo:/root/.halo2 \ halo:2.20 \ --spring.r2dbc.url=r2dbc:pool:mysql://host.containers.internal:3306/halo_db \ --spring.r2dbc.username=halo \ --spring.r2dbc.password=halopwd \ --spring.sql.init.platform=mysql # 说明 # --spring.r2dbc.url 指定使用的数据库连接地址 # host.containers.internal 是一个特殊的域名,表示是宿主机,相当于127.0.0.1 # --spring.r2dbc.username 指定数据库用户名 # --spring.r2dbc.password 指定数据库密码 # --spring.sql.init.platform 指定数据库类型 -
访问 halo
- 访问 http://localhost:8090 按照提示填写注册信息
- 登录刚才注册的用户,完成初始化 halo
- 访问 http://localhost:8090/console 进入后台管理界面
- 访问 http://localhost:8090 进入主站
安装 nginx
-
准备 nginx 环境
# 拉取镜像 podman pull nginx:1.26.2 # 创建本地映射目录 cd ~ mkdir -p nginx/{conf.d,logs,data/html} # 生成缺省配置文件容器 podman run -itd --name nginxdef nginx:1.26.2 # 拷贝配置文件到本地映射路径 <user>为用户目录 podman cp nginxdef:/etc/nginx/nginx.conf nginx/nginx.conf podman cp nginxdef:/etc/nginx/conf.d/default.conf nginx/conf.d/default.conf podman cp nginxdef:/usr/share/nginx/html/index.html nginx/data/html/index.html # 暂停容器 podman stop nginxdef # 删除容器 podman rm nginxdef -
启动 nginx 容器
podman run -itd \ --name nginx \ -p 80:80 \ -p 443:443 \ -v ~/nginx/nginx.conf:/etc/nginx/nginx.conf \ -v ~/nginx/conf.d:/etc/nginx/conf.d \ -v ~/nginx/logs:/var/log/nginx \ -v ~/nginx/data:/usr/share/nginx \ nginx:1.26.2 # 说明 # 普通用户不能使用1024以下端口,需要使用root用户启动容器,或者使用 sysctl 命令修改端口范围 # 注意,该操作有泄露端口的风险,请谨慎使用。 sudo sysctl net.ipv4.ip_unprivileged_port_start=80 # 1024为默认值,修改为80,这时再重新启动容器即可 # 启动容器后,及时恢复默认值 sudo sysctl net.ipv4.ip_unprivileged_port_start=1024 -
配置 nginx 解析
# 添加 halo 配置 vim ~/nginx/conf.d/halosite.conf # 写入配置信息 upstream halo2 { server host.containers.internal:8090; } server { listen 80; server_name halosite.com; location / { proxy_pass http://halo2; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-Path $request_uri; } } # 保存退出 :wq # 重载nginx配置 podman exec -it nginx nginx -s reload -
验证 nginx 解析
使用 http://halosite.com 访问 halosite,验证配置是否生效
-
修复上传文件报 413 Request Entity Too Large 错误
修改 nginx.conf 配置,添加
client_max_body_size 20M;即可。- 在
http{}中设置,控制全局nginx所有请求报文大小 - 在
server{}中设置,控制该server的所有请求报文大小 - 在
location{}中设置,控制满足该路由规则的请求报文大小
- 在