我的第N台服务器
标题:生命不息,折腾不止:一个大四软工狗的服务器血泪史与进化论
哈喽,大家好,我是苏增烨。
如果你现在正看着这篇文章,那你大概率是在我的个人博客 blog.caiths.com 上。看着这个加载飞快、带着绿色安全锁(HTTPS)的精美页面,你可能觉得“哇,这哥们技术不错,弄得挺像模像样的”。
但作为广州商学院一名即将毕业的大四软件工程学生,我必须得跟你交个底:在这个光鲜亮丽的博客背后,是一段长达三年的、充满了熬夜、脱发、崩溃、甚至差点被气笑的“折腾”血泪史。
今天没啥特别的技术干货要教给大家,就是单纯想以一个过来人(或者说踩坑人)的身份,跟你们聊聊我是怎么从一个连 SSH 是啥都不知道的小白,一步步把个人服务器折腾成现在这个五脏俱全的数字后花园的。
梦开始的地方:那台被我玩坏的“学生机”
故事得从大二那年说起。那时候刚学了点计算机网络和操作系统的皮毛,在宿舍看着室友们打游戏,我总觉得作为软工专业的学生,手里没台服务器,就好像剑客没有剑一样,出去都不好意思跟人打招呼。
趁着某云厂商搞开学季活动,我咬咬牙,花了一百来块钱买下了人生的第一台 VPS。配置相当感人:1核 CPU、2G 内存、1M 带宽。系统我毫不犹豫地选了 CentOS 7,因为那时候网上的教程清一色都是它。
拿到公网 IP 和 root 密码的那一刻,我激动得手都在抖。打开 Xshell,输入密码,看着那个黑乎乎的终端和闪烁的光标,我感觉自己就像黑客帝国里的尼奥,整个网络世界都在我脚下。
然而,现实很快就扇了我一巴掌。
我想在服务器上搭个 WordPress 博客,当时不懂什么是一键脚本,更不懂 Docker,硬生生地照着网上的老旧教程,打算手动编译安装 LNMP(Linux + Nginx + MySQL + PHP)环境。
前面的 Nginx 和 PHP 还算顺利,到了编译 MySQL 的时候,噩梦开始了。我敲下 make && make install,然后去吃了个外卖。回来一看,终端断开了。重新连上去,发现 MySQL 没装上。再试一次,盯着屏幕看,发现编译到大概 70% 的时候,服务器直接卡死,然后 SSH 强行断开。
后来查了半天资料才懂,这是因为 2G 内存太小了,编译 MySQL 极其吃内存,系统触发了 OOM(Out Of Memory)机制,直接把进程给杀后台了。那是我第一次学会在 Linux 里挂载 Swap(交换分区),用硬盘空间来凑内存。虽然速度慢得令人发指,但看着 MySQL 历经两个多小时终于编译成功,那种成就感,比期末考试拿了满绩点还要爽。
黑暗时代:被挖矿木马支配的恐惧
随着时间的推移,我逐渐不满足于只跑一个博客了。大三的时候,我接触到了 Docker。
这玩意儿简直是神器!以前装个环境要死要活,现在只要一句 docker run,几秒钟就能跑起来一个服务。我像个刚进大观园的土包子,疯狂地往服务器上塞东西:Redis、MySQL、Gitea、Nextcloud……只要是 GitHub 上看着好玩的开源项目,我全给它部署上。
可是,出来混,迟早是要还的。
有一天早上,我准备打开博客写点东西,发现网页转了半天圈圈,最后报了个 502 Bad Gateway。我心里一惊,赶紧连上 SSH,结果连 SSH 都卡得要命,敲个 ls 都要等三秒钟才有反应。
好不容易登进去,敲下 top 命令一看,好家伙,CPU 占用率 100%!排在第一位的是一个叫 kdevtmpfsi 的进程。
我当时就懵了,这是啥玩意儿?去 Google 一搜,心凉了半截——这是大名鼎鼎的挖矿木马。
原因很简单:为了图方便,我在 Docker 里跑 Redis 的时候,没有设置密码,而且把端口直接映射到了 0.0.0.0:6379。这就相当于我家大门敞开,还挂了个牌子写着“欢迎光临”。黑客利用 Redis 的未授权访问漏洞,直接把挖矿脚本写进了我的定时任务(crontab)里。
我试着 kill -9 杀掉进程,没过一分钟,它又像幽灵一样复活了。删文件、清定时任务,各种招数都用尽了,这木马就像附骨之疽,怎么都清理不干净。
最后,我只能含泪选择了“重置系统”。
那一刻,我是真的感受到了什么叫“血泪史”。因为我没有做备份。我辛辛苦苦写了半年的博客文章,还有乱七八糟的配置文件,随着那一次重置,全部灰飞烟灭。
从那以后,我变成了安全偏执狂和备份狂魔。现在的我,SSH 默认端口绝对不填 22,全部改用密钥登录,禁用密码验证;防火墙(ufw)严格白名单放行;所有数据库服务绝对不暴露在公网,只在 Docker 的内部网络里通信。最重要的是,我写了个 Shell 脚本,每天凌晨 3 点把重要数据打包,通过 rclone 自动同步到我的云盘里。
数据无价,这四个字真的是用血换来的教训。
进化与重构:打造完美数字后花园
经过大三那一波折腾,我的技术也算是有了一点点长进,不再是那个只会复制粘贴报错信息的无头苍蝇了。
那台 1M 带宽的国内机器实在是不够看,博客稍微放几张高清图片,加载速度就堪比上个世纪的拨号上网。再加上域名备案的流程繁琐,我果断把阵地转移到了海外的 VPS 上。换过 RackNerd,用过 CloudCone,虽然线路不如国内机器稳定,但胜在便宜大碗,带宽充足,折腾起来不心疼。
现在,你们看到的 blog.caiths.com,已经是一套相对成熟的架构了。
我放弃了臃肿的 WordPress,改用了轻量级的静态博客框架 Hexo(后来又折腾过 Halo,目前在两者之间反复横跳,谁让我爱折腾呢)。前端通过 Nginx 做反向代理,配合 acme.sh 自动签发和续期 Let's Encrypt 的 SSL 证书。
我不再手动敲命令部署服务了,而是全面拥抱了 Docker Compose。我把所有的服务配置都写在 docker-compose.yml 文件里,这简直是强迫症的福音。如果要迁移服务器,只需要把这个文件和挂载的数据目录拷过去,一句 docker-compose up -d,所有的服务就能在几分钟内原样满血复活。
除了博客,我的服务器现在简直就是一个百宝箱,跑着各种提升幸福感的自建服务:
- Vaultwarden:这是一个轻量级的密码管理器。经历了各种密码泄露事件后,我不再信任第三方的密码管理软件。现在我所有的账号密码都加密存在自己的服务器上,手机端和电脑端实时同步,安全感爆棚。
- AList:聚合网盘神器。我把阿里云盘、夸克网盘、OneDrive 全挂载上去,统一管理,配合 WebDAV,随时随地看电影、下资料,