记录第一次搭图床

5 min

准备工作

由于服务器上可能运行着其他服务(如 80、443、8080 端口已被占用),我们需要为图床选一个空闲端口

在终端执行以下命令,检查 8090 是否被占用:

sudo ss -tunlp | grep 8090
# 如果没有任何输出,说明端口空闲,可以使用

接着登录你的域名注册商,进入 DNS 解析管理,添加一条 A 记录

  • 主机记录: 例如 image
  • 记录值: [你的服务器 IP 地址]

保存后,等待一小会儿生效。现在 image.aununo.xyz(以此为例)就会指向你的服务器了。

Docker 部署 Lsky Pro

我们将使用 Docker Compose 来启动 Lsky Pro 服务。为了安全起见,我们不在 root 用户下运行,而是使用当前用户(如 aununo)。

首先创建必要的目录:

# 1. 创建 lsky-pro 应用数据目录
mkdir -p ~/data/docker_data/lsky-pro/lsky-pro-data

# 2. 创建 MySQL 数据库数据目录
mkdir -p ~/data/docker_data/lsky-pro/db

在同级目录下创建 docker-compose.yml:

services:
  lsky-pro:
    container_name: lsky-pro
    image: dko0/lsky-pro
    restart: always
    volumes:
      - ~/data/docker_data/lsky-pro/lsky-pro-data:/var/www/html
    ports:
      - 127.0.0.1:8090:80 # 仅监听本地 8090,避免对外暴露,配合 Nginx 反代
    environment:
      - MYSQL_HOST=mysql
      - MYSQL_DATABASE=lsky-pro
      - MYSQL_USER=lsky-pro
      - MYSQL_PASSWORD=lsky-pro

  mysql:
    image: mysql:8.0
    container_name: lsky-pro-db
    restart: always
    environment:
      - MYSQL_DATABASE=lsky-pro
      - MYSQL_USER=lsky-pro
      - MYSQL_PASSWORD=lsky-pro
      - MYSQL_ROOT_PASSWORD=lsky-pro # 注意:生产环境建议设置复杂的密码
    volumes:
      - ~/data/docker_data/lsky-pro/db:/var/lib/mysql

设置目录权限,确保容器内的服务可以读写挂载的卷:

# 1. Lsky Pro (PHP) 权限 (www-data 用户 ID 通常为 33)
sudo chown -R 33:33 ~/data/docker_data/lsky-pro/lsky-pro-data

# 2. MySQL 数据库权限 (mysql 用户 ID 通常为 999)
sudo chown -R 999:999 ~/data/docker_data/lsky-pro/db

启动服务:docker compose up -d

安装和配置 Nginx(反向代理)

我们需要宿主机的 Nginx 来接收来自 image.aununo.xyz 的 80/443 请求,并将其转发到 Docker 容器正在运行的 8080 端口。

首先安装 Nginx (如果尚未安装),sudo apt install -y nginx.

创建一个新的 Nginx 配置文件 sudo nano /etc/nginx/sites-available/image.aununo.xyz

配置文件内容如下:

server {
    listen 80;
    server_name image.aununo.xyz; # 换成你的图床域名

    location / {
        proxy_pass http://127.0.0.1:8090;
        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;

        client_max_body_size 100m;
    }
}

启用这个配置:

# 1. 启用你的新配置(创建软链接)
sudo ln -s /etc/nginx/sites-available/image.aununo.xyz /etc/nginx/sites-enabled/

# 2. 测试 Nginx 配置是否有语法错误
sudo nginx -t
# (如果显示 ...syntax is ok, ...test is successful 就说明没问题)

# 3. 重启 Nginx 使配置生效
sudo systemctl reload nginx

配置 HTTPS(SSL 证书)

我们将使用 Certbot 自动为你的域名配置免费的 Let’s Encrypt 证书。

# 1. 安装 Certbot 及其 Nginx 插件
sudo apt install -y certbot python3-certbot-nginx

# 2. 自动配置 HTTPS
sudo certbot --nginx -d image.aununo.xyz
完成后,Certbot 会自动修改 Nginx 配置文件,开启 HTTPS 强制跳转,并设置证书自动续期。

访问与原理分析

现在,访问 https://image.aununo.xyz,你应该能看到 Lsky Pro 的安装向导了。

发生了什么?

  • DNS 解析: 当你在浏览器访问 image.aununo.xyz 时,浏览器向 DNS 服务器查询,得到了一条 A 记录,指向你的服务器 IP。

  • 建立连接: 浏览器向服务器的 443 端口发起连接请求。

[!IMPORTANT] 确保你的云服务器安全组(防火墙)已经放行了 80 和 443 端口。

  • Nginx 握手: 宿主机的 Nginx 监听到 443 端口的请求,利用 Certbot 申请的 SSL 证书与浏览器完成加密握手。它根据 server_name 匹配到 image.aununo.xyz 的配置文件。

  • 反向代理: Nginx 读取配置 proxy_pass http://127.0.0.1:8080;,将请求解密后,转发给本地的 8080 端口。

  • Docker 内部处理: Docker 监听宿主机的 8080 端口,将请求转交给 lsky-pro 容器内部的 80 端口。 PHP 程序开始执行,通过 Docker 内部网络连接到 mysql 数据库容器,查询数据。

  • 响应返回: 最终,数据沿着原路层层返回:数据库 -> PHP 容器 -> 宿主机 Nginx -> 加密 -> 你的浏览器。