一个基于Rust为兰空图床提供的高性能、安全的随机图片API服务,通过直接查询数据库来获取图片链接,支持多CDN、缓存机制和Unix Socket连接。
✅ 凭据安全: 使用环境变量,不硬编码密码
✅ 错误脱敏: 对外统一错误信息,详细错误仅记日志
✅ Unix Socket: 优先使用Unix Socket连接,避免网络暴露
✅ 缓存机制: 可配置内存缓存,减少数据库压力
✅ 最小权限: 建议使用只读数据库账户
✅ 参数化查询: 防止SQL注入
✅ CORS配置: 支持跨域但需配合限流使用
✅ 灵活配置: 所有关键参数均可通过环境变量配置
# 复制配置文件
cp .env.example .env
# 编辑配置文件,设置数据库密码和CDN域名
# 优先配置Unix Socket路径:DB_SOCKET=/tmp/mysql.sock| 环境变量 | 描述 | 默认值 |
|---|---|---|
ALBUM_ID |
相册ID | 3 |
CACHE_DURATION_SECS |
缓存时间(秒) | 300 |
CDN_CF |
CloudFlare CDN域名 | https://cf.example.com/i |
CDN_EO |
EdgeOne CDN域名 | https://eo.example.com/i |
CDN_DEFAULT |
默认CDN域名 | https://example.com/i |
CDN_RANDOM_URL |
/random_url接口CDN域名 | https://xxx.example.com/i |
确保数据库账户具有最小权限:
-- 创建只读用户(推荐)
CREATE USER 'img_readonly'@'localhost' IDENTIFIED BY 'secure_password';
GRANT SELECT ON img.albums TO 'img_readonly'@'localhost';
GRANT SELECT ON img.images TO 'img_readonly'@'localhost';
FLUSH PRIVILEGES;# 开发模式
cargo run
# 构建生产版本
cargo build --releaseGET /random- 默认随机图片重定向GET /random_cf- CloudFlare CDN随机图片重定向GET /random_eo- EdgeOne CDN随机图片重定向GET /random_url- 返回随机图片URL (JSON)GET /num- 返回图片总数
需要开放端口3030,推荐反代
- 相册ID: 可以轻松切换不同相册,无需重新编译
- 缓存时间: 根据业务需求调整缓存策略
- 多CDN支持: 灵活配置不同CDN域名,支持故障切换
- 统一管理: 所有配置集中在.env文件中
Linux/MySQL:
# 查找MySQL socket路径
mysql_config --socket
# 常见路径:
# /var/run/mysqld/mysqld.sock
# /tmp/mysql.sock
# /var/lib/mysql/mysql.sockWindows不支持Unix Socket,自动使用TCP连接。
- 可配置缓存: 图片URL缓存可调整时间,显著减少数据库查询
- Unix Socket: 比TCP回环性能更好,减少网络开销
- 连接池: sqlx自动管理数据库连接池
- 随机优化: 从缓存中直接随机选择,避免OFFSET查询开销
-
"DB_PASSWORD environment variable must be set"
- 确保.env文件存在且配置正确
- 检查环境变量是否正确设置
-
Unix Socket连接失败
- 检查socket文件路径是否正确
- 确保应用有读写socket文件的权限
- 回退使用TCP连接(注释掉DB_SOCKET)
-
"服务暂时不可用"
- 检查数据库连接是否正常
- 确认数据库账户权限足够
- 查看日志获取详细错误信息
开发环境:
ALBUM_ID=3
CACHE_DURATION_SECS=60
CDN_DEFAULT=http://localhost:8080/images生产环境:
ALBUM_ID=1
CACHE_DURATION_SECS=600
CDN_CF=https://cdn.example.com/images
CDN_EO=https://backup-cdn.example.com/images