搭建小窝

博客搭建 现在的博客搭建方式有很多,本文使用的是 halo,它安装起来比较方便快捷,界面也非常清晰简洁。 安装方法使用的是 podman 代理服务使用的是 nginx 数据库使用的是 mysql 安装 podman podman 是一个容器管理工具,可以很方便的管理容器。它与 docker 相比,更

博客搭建

现在的博客搭建方式有很多,本文使用的是 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 扩展知识

    • 配置文件路径
      1. root 用户的路径是 /etc/containers/containers.conf
      2. 普通 用户的路径是 ~/.config/containers/containers.conf
    • 容器配置文件保存
      1. root 用户的路径是 /var/lib/containers/storage/overlay
      2. 普通用户的路径是 ~/.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

    1. 访问 http://localhost:8090 按照提示填写注册信息
    2. 登录刚才注册的用户,完成初始化 halo
    3. 访问 http://localhost:8090/console 进入后台管理界面
    4. 访问 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; 即可。

    1. http{} 中设置,控制全局nginx所有请求报文大小
    2. server{} 中设置,控制该server的所有请求报文大小
    3. location{} 中设置,控制满足该路由规则的请求报文大小
评论