前情提要

我最近给我那1核2G的云服务器扩到了3M带宽。

但在此之前,它其实过得挺惨的。没过几天就在日志里发现一个海外IP扫了我几百次,查了一下威胁等级10/10。那一刻我突然意识到:我的服务器正在被全世界的扫描器当靶子打。

于是我开始给它加固:配置防火墙,配置黑名单,搞监控随时看资源——这些故事以后可以单独写一篇。总之,等它"强壮"起来后,我开始想:能不能用这台小服务器干点正事?

比如,存点照片之类的。

为什么不用某度网盘

理由很简单:

  • byd的不冲会员给我跑不到1mbps的下载速度
  • 还要提防我珍贵的照片哪一天被删掉了
  • 不想每次都登陆
  • 软件太臃肿
  • ………还有更多

怎么选 选什么自托管相册

网上搜了一圈自托管相册,选项还挺多:

软件资源要求
Immich内存建议4G+
PhotoPrism内存建议2G+
Piwigo最低1G内存
Kopia极低,无Web界面

考虑到我服务器只有2G内存,还要跑博客和监控,piwigo无疑是最好选择 什么? 你问我为什么不选Kopia?

我记不住命令

搭建过程(踩坑实录)

  1. 装环境

我服务器是debian系统,先装一个LNMP全家桶:

sudo apt update
sudo apt install nginx mariadb-server php-fpm php-mysql php-gd php-mbstring php-xml php-zip php-curl -y

MariaDB装好后,进去创建数据库和用户:

CREATE DATABASE piwigo_db;
CREATE USER 'piwigo_user'@'localhost' IDENTIFIED BY '你的密码';
GRANT ALL PRIVILEGES ON piwigo_db.* TO 'piwigo_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
  1. 下载Piwigo(第一个坑)

去官网下载最新版,结果用wget直接下载一直404。后来发现中文站的链接可能失效,老老实实去英文站下,然后英文站链接也失效,我只能自己下到本地再传回服务器

# 本地下载后上传
scp 你下载的文件名 user@你的服务器IP:/var/www/
cd /var/www
sudo unzip piwigo-14.5.0.zip
sudo mv piwigo photos
sudo chown -R www-data:www-data /var/www/photos
  1. 配置Nginx

创建站点配置文件/etc/nginx/sites-available/photos:

server {
    listen 80;
    server_name photos.your-domain.com;

    root /var/www/photos;
    index index.php index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; #看你自己php是第几个版本,这里我以8.2举例子
    }
}

然后启用配置:

sudo ln -s /etc/nginx/sites-available/photos /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
  1. 访问安装界面

浏览器打开 http://photos.your-domain.com,结果给我502 Bad Gateway(记得在域名dns解析里添加A记录photos)

先查Nginx错误日志:

sudo tail -f /var/log/nginx/error.log

发现是connect() to unix:/var/run/php/php-fpm.sock failed。检查PHP-FPM状态:

sudo systemctl status php8.2-fpm

居然没启动!赶紧sudo systemctl start php8.2-fpm。再试,还是502?

后来发现fastcgi_pass路径写错了,应该是/var/run/php/php8.2-fpm.sock(之前少写了版本号)。改完重启,终于不502了。

  1. CDN的SSL坑

本地访问没问题,但通过域名就是打不开。查了一圈,原来是CDN的SSL/TLS模式设成了"完全(严格)",但我的Nginx只监听80端口,没有配SSL。于是把模式改成灵活,让CDN到源站走HTTP,用户到CDN走HTTPS。瞬间好了。(CDN你肯定知道是谁家的)

  1. 最蠢的来了

访问我的域名,还是不行?排除了一小时,最后dig一下,发现子域名根本没解析——我在CDN控制台里把记录名写成了photo而不是photos。改回来,秒开。

配置

按你自己之前mysql的配置填进去

安全加固

这一段是机密 不给你看

上传图片

用rsync传服务器目录,再进后台同步:

rsync -avP -e "ssh -i 你的ssh私钥" ./ user@服务器IP:~/待上传/ #这年头真的还用密码登么....

同步直接进Piwigo后台 → 工具 → 同步 点快速同步就行。

总结

不要碰服务器 会让你变得不幸

最后建议

  1. 域名和SSL早配置
  2. 照片记得压缩
PS:文中所有域名、IP、密码均为示例,实际使用时请换成自己的,并务必使用强密码和私有配置。