主题
第十四章:云服务器运维与项目部署

序言
小明的网站跑在 Serverless 平台上,域名绑好了,HTTPS 也亮着绿锁,一切顺利。
但他心里一直有个念头——如果平台倒了怎么办?如果想装点平台不支持的东西呢?
老师傅看出了他的心思:"想要完全的控制权,就得有自己的服务器。"
SSH
小明在云厂商的新用户活动页面挑了一台香港轻量服务器——免备案、即买即用。下单后,他拿到了三样东西:公网 IP、用户名(root)和密码。
他打开终端,输入 ssh root@1.2.3.4——屏幕上弹出指纹确认,他紧张地输入 yes,然后输入密码。黑底白字的命令提示符出现了:root@xxx:~#。
"我进来了!"小明有点兴奋。这台机器没有桌面、没有图标,只有一个闪烁的光标。在第 10 章他已经了解过 SSH 的原理,但真正连上一台远在千里之外的服务器,感觉还是不一样——像是拿到了一间空房子的钥匙,接下来要自己装修。
锁好门窗
老师傅拦住了他:"先别急着装东西,先锁好门窗。裸奔的服务器在互联网上,平均几分钟就会被扫描到。"就像新手机号刚开通就收到骚扰电话——号段是公开的,有人在批量拨打试探。服务器的公网 IP 也一样,上线几分钟就有自动化脚本在挨个试密码。
于是小明跟着老师傅更新了系统、配置了安全组、改了 SSH 端口、装了 Fail2Ban。这些步骤不复杂,但每一步都是必做项。
1Panel 面板
安全加固完成后,老师傅让小明装了 1Panel——一个现代化的 Linux 服务器管理面板。小明在浏览器里打开面板地址,看到了一个网页版的控制台:"这比命令行友好多了。"
1Panel 的核心是 Docker。小明一键安装了 Docker,顺手配置了镜像加速——不配加速的话,国内拉镜像能等到天荒地老。
Docker 容器
"Docker 是什么?"小明问。
老师傅打了个比方:"集装箱。每个应用——你的网站、数据库、监控工具——都被打包在独立的集装箱里运行,互不干扰,也不会弄脏你的服务器系统。装错了?直接删掉重来。"
小明打开 1Panel 的应用商店,发现里面有数据库、Web 服务器、监控工具……点一下就能安装。"这不就是手机应用商店吗?"
"差不多。你在面板里点的每一次'安装',本质上就是在拉取和运行一个 Docker 集装箱。"
这种隔离机制让小明明白了一条铁律:永远不要直接在服务器上写代码。服务器是跑代码的生产环境,写代码和调试应该在本地的开发环境完成,通过 Git 同步上去。
安全组
小明兴奋地输入 1Panel 给出的 http://IP:端口 访问面板——浏览器转圈圈,直到超时。他以为是面板没装好,但老师傅告诉他:云服务器有第一道安全门——安全组。
安全组是云厂商在机房门口设的防火墙。默认只放行 SSH(22 端口),其他端口全锁着。你装了新应用要用新端口,得先去控制台跟"保安"说一声。就像小区门禁——默认不让陌生人进,你搬了新家具,得先跟物业报备让货车通过大门。小明去云厂商控制台手动开放了面板端口,刷新页面——面板出来了。
自建数据库
小明打开 1Panel 的应用商店,一键安装了 PostgreSQL。安装时设置了端口、管理员账户和密码。
装完后,他在面板的"数据库"页面新建了一个具体的数据库 my_app_db。老师傅趁机科普了一个常识:数据库软件(DBMS)和数据库(Database)是两回事。
- DBMS(PostgreSQL):就像 Excel 软件本身。
- Database:就像 Excel 里打开的一个个
.xlsx文件。安装一次 PostgreSQL,可以创建无数个独立的数据库供不同项目使用。
容器网络
小明配 .env 里的 DATABASE_URL 时,习惯性地填了 localhost——连接失败。报错信息是 Connection refused,看起来像是数据库没启动,但数据库明明在跑。
老师傅解释:"你在家喊'妈',你妈会应。你在朋友家喊'妈',应的是朋友的妈。容器里的 localhost 也一样——每个容器的 localhost 都是它自己,不是服务器主机。容器之间要用名字喊。"
三句话总结:
- 容器找邻居:用容器名(如
postgresql) - 主机找容器:用
localhost或127.0.0.1 - 外部访问:用服务器公网 IP + 映射端口
端口映射
小明很疑惑:服务器只有一个公网 IP,怎么同时跑好几个应用?
原来,Docker 为每个容器提供了隔离的网络环境。应用 A 在容器里监听 3000,应用 B 也在容器里监听 3000——互不冲突。通过端口映射,把服务器的 3001 端口转发给应用 A,3002 端口转发给应用 B。外部用户访问 IP:3001 和 IP:3002,流量就被准确地送到对应的容器。
一栋楼只有一个地址,但有很多房间。服务器只有一个 IP,端口号就是房间号。
SSL 证书
小明通过 http://IP:端口 成功访问到了应用,但在面板绑定域名后,浏览器显示一个巨大的"不安全"红色标志。你在网上填银行卡号时,会下意识看一眼地址栏有没有小锁——没有锁的网站,用户也会本能地不信任。
老师傅告诉他需要 SSL 证书。小明在面板的证书设置里,一键申请了 Let's Encrypt 免费证书,开启 HTTPS。看着地址栏的小绿锁,他终于完成了一次真正的全栈独立部署。
SRE 入门意识
看着服务器上稳定运行的应用,老师傅说:"部署上线只是开始。现在你已经是半个运维工程师了。"
他向小明介绍了 SRE(Site Reliability Engineering,站点可靠性工程) 的理念:用软件工程的思维解决运维问题。传统运维靠人手熬夜修故障,SRE 靠自动化系统保持稳定。就像你家从手动浇花升级成自动灌溉系统——不用每天惦记,但要定期检查系统本身有没有问题。小明现在已经掌握了基础:
- 监控:通过日志和统计工具了解系统状态
- 自动化:通过 Docker 一键部署、通过 Git 一键回滚
- 容灾:通过备份和恢复策略保护数据
"SRE 不是大厂的专利,而是每个产品都应该有的意识。你的产品哪怕只有一个用户,也应该可靠。"
小明听完,觉得自己不只是在学技术,更是在学一种责任感。以前写完代码扔上去就不管了,现在他开始关心"它还在跑吗?""用户体验怎么样?""数据安全吗?"
日志
部署完成几天后,有朋友告诉小明页面打不开了。小明自己访问,一切正常。他开始怀疑是朋友的网络问题。
老师傅说:"不要猜,要看日志。"
日志是程序运行时自动记录的流水账——什么时间发生了什么,有没有报错。就像飞机的黑匣子,出了事故可以调出来看。在 1Panel 里点击容器的"日志"按钮就能看到实时输出;如果用的是 Serverless 平台,平台也有网页版的日志查看界面。
看什么? 新手只需要关注三个关键词:
- Error:错误,后面跟着具体报错信息,告诉你哪里出了问题
- Warning:警告,不是错误但值得检查
- 你自己写的日志:比如"用户开始注册""数据库连接成功",帮你定位程序执行到了哪一步
常见模式:看到"找不到模块"——依赖没装好;看到"连接被拒绝"——数据库地址错了或没启动;看到"超时"——网络问题或代码逻辑有问题。遇到这些,把日志关键信息复制下来,让 AI 帮你诊断。日志里可能包含敏感信息(如数据库连接字符串),分析时注意不要把这些内容截屏发到公开的地方。
小明照做了——在日志里搜到一条 Error: connect ECONNREFUSED 127.0.0.1:5432,复制给 Claude Code,几秒钟就定位到问题:DATABASE_URL 里的主机名应该填容器名,不是 localhost。改完,页面恢复了。
技术不仅是创造,更是守护。部署上线不是结束,而是长期责任的开始。
本章小节
- 14.1 VPS 选购指南 — 主流云厂商对比、配置选择、机房位置、操作系统选择
- 14.2 VPS 初始化与安全配置 — SSH 连接、安全组设置、1Panel 安装、安全加固
- 14.3.1 应用商店与 Docker 基础 — Docker 核心概念、应用商店、容器管理、数据持久化、容器网络
- 14.3.2 部署 Next.js 应用 — 运行环境配置、环境变量、构建启动、端口映射
- 14.3.3 部署静态网站 — OpenResty 静态站点、文件上传、SPA 路由、缓存策略
- 14.3.4 部署前后端分离应用 — 多容器编排、反向代理、环境变量管理、数据备份
- 14.4 配置域名与证书 — DNS 解析、SSL 证书申请、HTTPS 跳转、证书续期
- 14.5 其他好玩的应用 — Umami 统计、n8n 自动化、Uptime Kuma 监控
下一章:第十五章:SEO、分享与数据统计
