用VPS自建图床:从0到1搭建一个支持WebP转换、CDN加速、防盗链的私有图床系统


摘要: 微博图床挂了、SM.MS限速了、Imgur国内打不开——依赖第三方图床等于把命交给别人。本文教你用一台最基础的VPS,搭建一套完全掌控的图床系统:支持拖拽上传、自动WebP转换、CDN加速、防盗链,月成本不到一杯咖啡。


一、为什么自建图床

第三方图床的风险是真实的:服务突然关停、域名被墙、免费额度耗尽后涨价、图片被审核删除。对于博客作者、独立开发者、电商卖家,图片是核心资产,不能容忍不可控的丢失风险。

自建图床的核心优势:数据完全掌控,存在自己的服务器和备份策略里;无数量限制、无带宽焦虑(取决于你的VPS配置);支持自定义域名、自定义处理逻辑(水印、压缩、格式转换);配合CDN后,访问速度不输商业图床。

代价是运维责任自负——备份、安全、性能优化需要自己操心。

二、技术选型

后端:Chevereto-Free 或 Lsky Pro

Chevereto是老牌图床程序,功能成熟,界面美观,但免费版功能受限。Lsky Pro是国内开发者开源的图床系统,中文原生、支持多种存储策略、插件扩展灵活,个人使用推荐Lsky Pro。

存储:本地磁盘 或 对象存储

单台VPS磁盘有限(通常20-50GB SSD),图片量大时建议接入对象存储(腾讯云COS、阿里云OSS、AWS S3)。本文先讲本地存储方案,对象存储作为扩展提及。

图片处理:ImageMagick + WebP转换

上传后自动压缩、生成缩略图、转换为WebP格式,减少70%体积而不明显损失画质。

加速:CDN + Nginx缓存

静态资源走CDN边缘节点,源站只回源一次。Nginx本地缓存减少重复处理开销。

三、环境准备

一台1C1G以上VPS,Ubuntu 22.04,已安装Nginx、PHP 8.1+、MySQL/MariaDB、Redis。

安装依赖

sudo apt update
sudo apt install -y nginx php8.1-fpm php8.1-cli php8.1-gd php8.1-mbstring \
  php8.1-xml php8.1-curl php8.1-zip php8.1-bcmath php8.1-redis \
  php8.1-mysql mariadb-server redis-server imagemagick webp

# 启用PHP扩展
sudo phpenmod gd redis
sudo systemctl restart php8.1-fpm

创建数据库

sudo mysql -u root -p

CREATE DATABASE imgbed CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'imguser'@'localhost' IDENTIFIED BY '强密码';
GRANT ALL PRIVILEGES ON imgbed.* TO 'imguser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

四、安装Lsky Pro

cd /var/www
sudo wget https://github.com/lsky-org/lsky-pro/releases/latest/download/lsky-pro.zip
sudo unzip lsky-pro.zip -d imgbed
sudo chown -R www-data:www-data imgbed
sudo chmod -R 755 imgbed

配置Nginx:

sudo tee /etc/nginx/sites-available/imgbed <<'EOF'
server {
    listen 80;
    server_name img.yourdomain.com;
    root /var/www/imgbed/public;
    index index.php;

    client_max_body_size 50M;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
    }

    location ~* \.(jpg|jpeg|png|gif|webp)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    location ~ /\.ht {
        deny all;
    }
}
EOF

sudo ln -s /etc/nginx/sites-available/imgbed /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

申请SSL证书:

sudo certbot --nginx -d img.yourdomain.com

浏览器访问 https://img.yourdomain.com,按安装向导完成数据库连接和管理员账号设置。

五、核心功能配置

自动WebP转换

Lsky Pro后台 → 存储策略 → 编辑 → 图片处理 → 开启"上传后自动转换WebP"。

如需更精细控制,手动配置ImageMagick策略。编辑 /etc/ImageMagick-6/policy.xml,确保允许读取和写入WebP:

<policy domain="coder" rights="read|write" pattern="WEBP" />

缩略图与水印

后台 → 图片处理 → 配置缩略图尺寸(如800x600、400x300)。水印支持文字和图片两种,建议用PNG格式半透明水印,避免遮挡主体内容。

防盗链

Nginx层配置:

sudo tee /etc/nginx/imgbed-security.conf <<'EOF'
location ~* \.(jpg|jpeg|png|gif|webp)$ {
    valid_referers none blocked img.yourdomain.com yourblog.com;
    if ($invalid_referer) {
        return 403;
    }
}
EOF

在server块中引入:

include /etc/nginx/imgbed-security.conf;

更灵活的方案是在Lsky Pro后台配置"原图保护",只允许通过程序接口访问,直接URL返回缩略图或403。

六、接入CDN加速

以Cloudflare为例:

添加域名到Cloudflare,修改NS记录。SSL/TLS设置改为"完全(严格)",确保回源HTTPS。缓存规则:创建Page Rule,img.yourdomain.com/uploads/*,缓存级别"缓存所有内容",边缘TTL 30天。

图片是静态资源,缓存时间可以设很长。注意:如果开启了WebP自动转换,确保CDN支持Vary: Accept-Encoding头,或统一返回WebP(现代浏览器全部支持)。

国内CDN替代

Cloudflare国内节点有限,如果用户主要在国内,可考虑:

腾讯云CDN:支持未备案域名使用海外加速节点,按流量计费。又拍云:图片处理能力强,自带WebP自适应、缩略图裁剪。配置方式类似:添加加速域名,回源到你的VPS,设置缓存规则。

七、备份策略

图片一旦丢失无法挽回,必须多层备份:

本地定时打包

sudo tee /usr/local/bin/backup-img.sh <<'EOF'
#!/bin/bash
BACKUP_DIR="/backup/imgbed"
DATE=$(date +%Y%m%d)
mkdir -p $BACKUP_DIR
tar czf $BACKUP_DIR/imgbed-$DATE.tar.gz /var/www/imgbed/public/uploads
mysqldump -u imguser -p'强密码' imgbed > $BACKUP_DIR/imgbed-db-$DATE.sql
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
find $BACKUP_DIR -name "*.sql" -mtime +7 -delete
EOF

sudo chmod +x /usr/local/bin/backup-img.sh
sudo crontab -e
# 添加
0 3 * * * /usr/local/bin/backup-img.sh

异地同步

用rclone同步到对象存储或另一台VPS:

rclone sync /backup/imgbed remote:backup-bucket/imgbed

数据库与图片分离(进阶)

当图片量超过本地磁盘容量时,将上传目录迁移到对象存储。Lsky Pro后台支持直接配置S3/COS/OSS兼容接口,上传后图片直存云端,本地只保留数据库和程序文件。

八、性能优化

Nginx本地缓存

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=imgcache:100m max_size=5g;

location ~* \.(jpg|jpeg|png|gif|webp)$ {
    proxy_cache imgcache;
    proxy_cache_valid 200 30d;
    proxy_cache_use_stale error timeout invalid_header updating;
}

PHP-FPM调优

编辑 /etc/php/8.1/fpm/pool.d/www.conf

pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10

1C1G的VPS保守设置,避免内存耗尽。

图片懒加载

前端接入时,使用loading="lazy"属性或Intersection Observer API,减少首屏请求数量。

九、写在最后

自建图床的核心价值不是省钱——商业图床的免费额度对个人通常够用——而是可控。你的图片不会因为服务商政策变动而消失,不会因为域名被墙而无法加载,不会因为格式限制而被迫妥协。

但这份可控是有代价的:备份需要你手动配置,安全漏洞需要你及时修补,性能瓶颈需要你持续优化。如果你享受这种掌控感,自建图床是一个值得投入的项目。如果你只想上传后拿到链接,继续用可靠的第三方服务,把精力留给内容创作,同样是明智的选择。



从VPS到家庭服务器:一条内网穿透隧道让局域网设备全球可达

自建邮件服务器避坑实录:为什么我不推荐你用VPS发邮件,以及如果非要发该怎么做

评 论
更换验证码