用 Nginx 反代家里那台吃灰的笔记本

家里那台笔记本买了九年,电池鼓包,屏幕有一道亮线,但 CPU 还能跑。扔了可惜,于是装了 Debian 12,拔掉屏幕当主机用。
它现在在做什么
- 内网 SMB 文件共享(挂了两块移动硬盘)
- qBittorrent 下载机,白天在公司也能加任务
- 一个只给自己用的 Gitea,存私有仓库
- 定时备份:每天凌晨把重要目录 rsync 到 NAS
功耗实测待机 9W,满载 28W,一个月电费不到六块钱。
外网访问的三层结构
直接暴露家里 IP 是不理智的。我的做法是:
- 家里路由器拨号拿到动态公网 IP,用 DDNS 绑定域名
- 只开放一个高位端口,其余全部关闭
- 云服务器做反代,把
home.example.com转发到家里
server {
listen 443 ssl http2;
server_name home.example.com;
location / {
proxy_pass http://home-ddns:8443;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 300s;
client_max_body_size 0;
}
}
client_max_body_size 0 是必须的,不然上传大文件会 413。proxy_read_timeout 也得调大,否则下载慢一点就被切断。
踩过的坑
一、动态 IP 变了但没生效
DDNS 客户端默认 5 分钟同步一次,而运营商有时候半夜重播。解决办法是在路由器上写脚本,检测到 IP 变化立刻重新拨 DDNS 接口,同时 Nginx 那边把 upstream 换成域名而不是 IP,让它每次重新解析。
二、上传速度被限制
一开始只有 300 KB/s,查了半天发现是运营商上行限速。家宽 1000M 下行通常只配 30–50M 上行,这是硬约束,没法绕。
三、HTTPS 证书续期失败
Let's Encrypt 需要 80 端口验证,但我把 80 全关了。改成 DNS-01 验证之后就好了:
certbot certonly --manual --preferred-challenges dns \
-d '*.example.com' -d example.com
现在证书自动续期靠 cron + 阿里云 DNS 插件,两年没管过。
值不值得
从成本看,一台云服务器一年几百块,性能比这台笔记本好得多。但自己机器的好处是完全可控:想装什么装什么,硬盘想加就加,数据在自己手里。
自建的乐趣不在于省钱,而在于每一个环节你都知道它是怎么跑起来的。
如果你也有一台吃灰的设备,别急着卖二手,插上网线试试。