摘要: 微博图床挂了、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,减少首屏请求数量。
九、写在最后
自建图床的核心价值不是省钱——商业图床的免费额度对个人通常够用——而是可控。你的图片不会因为服务商政策变动而消失,不会因为域名被墙而无法加载,不会因为格式限制而被迫妥协。
但这份可控是有代价的:备份需要你手动配置,安全漏洞需要你及时修补,性能瓶颈需要你持续优化。如果你享受这种掌控感,自建图床是一个值得投入的项目。如果你只想上传后拿到链接,继续用可靠的第三方服务,把精力留给内容创作,同样是明智的选择。
