这篇文章本来想叫《一次 Linux 服务器部署,从入门到精通》,但后来发现「精通」暂时没做到,「放弃」倒是近在眼前。记录一下一个普通开发者把全栈项目搬上 Linux 服务器的心路历程,如果你也正在经历,希望你看完能少踩几个坑。
一、入门:Docker 真香
项目是用 FastAPI + Next.js + PostgreSQL 写的。本地跑得好好的,到了服务器上第一反应就是 Docker Compose。照着文档一顿操作:
apt install -y docker-ce docker-ce-cli docker-compose-plugin
docker compose -f docker-compose.prod.yml up -d --build
看到 5 个服务全部 Up,curl http://127.0.0.1:8000/health 返回 {"status":"ok"},那一刻心情非常舒畅。Linux 服务器部署好像也没那么难嘛。
二、进阶:nginx 反向代理
光有容器不够,得让域名能访问。于是上了 nginx:
server {
listen 80;
server_name ait.hwtx.top;
location /health { proxy_pass http://127.0.0.1:8000; }
location /api/ { proxy_pass http://127.0.0.1:8000; }
location / { proxy_pass http://127.0.0.1:3000; }
}
配置完 nginx -t && systemctl reload nginx,浏览器访问 http://ait.hwtx.top/health,200 OK。入门阶段顺利通关。
三、挑战:HTTPS 证书
接下来自然想到 HTTPS。Let's Encrypt + certbot,标准流程:
certbot --nginx -d ait.hwtx.top
结果报 404。我反复检查 nginx 配置、server_name、.well-known/acme-challenge 目录,本机测试三种方式(127.0.0.1、公网 IP、域名)都能正常返回 ok。一度以为是 certbot 残留配置作祟,清理后换 webroot 模式:
certbot certonly --webroot -w /var/www/html -d ait.hwtx.top
还是失败。错误从 HTTP 404 变成 DNS 层面的 networking error looking up A,再变成 networking error looking up TXT。我意识到问题不在本机配置,而在网络链路:

从外部网络探测我的公网 80 端口,返回的是 404 NOTOK / Date: 2005 / Content-Type: GB2312,这不是 nginx 的响应,而是运营商/云厂商的拦截页特征。这里要特别澄清一点:这个域名其实早已在阿里云完成了 ICP 备案并通过审核,所以问题不是"域名没备案",而是"备案接入商和实际服务器所在网络对不上"。
四、转折:备案接入商与免备案
我尝试去控制台提交「免备案域名」服务,结果弹窗提示:

系统提示「域名已备案,无需使用免备案服务」。这反而印证了关键事实:ait.hwtx.top 在阿里云已完成 ICP 备案并通过审核。
但浏览器访问仍然被拦截,原因就出在"备案接入商"上:
- ICP 备案是和"接入商"(服务器实际所在网络)绑定的。我的域名备案接入商是阿里云,实际服务器却是阿贝云免费云服务器;
- 运营商在公网层面校验"备案接入商(阿里云) ≠ 实际服务器接入商(阿贝云)",于是按"接入商不符"对 80/443 做了拦截;
- 阿贝云的"免备案服务"本质是用其中转/代理来绕过这个校验,但因为域名已在阿里云备案、系统判定"无需免备案",且该中转服务对 Let's Encrypt 这类境外 CA 的验证流量并不友好,所以访问和证书验证仍然走不通。
到这一步,HTTPS 证书这条路基本宣告「本地配置全对,但 CA 在境外根本拿不到验证响应」。
五、放弃(暂时的)
经过 HTTP-01、DNS-01 多轮尝试,我把问题收敛到两个无法短期解决的点:
- 阿里云 DNS(hichina)对 Let's Encrypt 境外验证节点响应不稳定,A 记录和 TXT 记录都出现过
networking error; - 公网 80/443 访问存在接入商校验拦截:域名虽已在阿里云备案,但备案接入商(阿里云) ≠ 实际服务器接入商(阿贝云),导致境外 CA 无法稳定访问 80 端口完成验证。
这两个问题都不是改 nginx 配置或换 certbot 模式能解决的。最快的路径是把 DNS 托管换到 Cloudflare(对 LE 全球节点极友好、可绕过公共 DNS 抖动),或把服务器迁到与该域名备案接入商一致的主机(即阿里云),否则 HTTPS 在大陆公网环境下很难跑通。
所以我决定暂时「放弃」——先回退到 HTTP 80 端口跑 demo,内部测试和本机访问完全够用;等备案或 DNS 环境理顺后再上 HTTPS。
六、从这次经历里学到的东西
虽然 HTTPS 没跑通,但整个 Linux 服务器部署流程我算是走了一遍:
- ✅ Ubuntu 22.04 安装 Docker / Docker Compose
- ✅ 配置国内镜像加速器(DaoCloud)、pip 清华源、npm 淘宝源
- ✅ 用 Docker Compose 跑通 FastAPI + Next.js + PostgreSQL
- ✅ nginx 反向代理、安全响应头、限流中间件
- ✅ 时区 aware/naive 问题排查与修复
- ✅ 理解 HTTP-01 / DNS-01 验证原理,以及国内网络环境对 CA 验证的影响
七、给其他新手的建议
如果你也想用 阿贝云免费云服务器 或类似免费主机部署项目:
- 备案接入商要与服务器一致:我的域名已在阿里云完成 ICP 备案,但实际搭在阿贝云免费云服务器上,备案接入商和实际网络不匹配,公网 80/443 就会被按「接入商不符」拦截。部署前一定确认"在哪台机器上跑、就由哪家的接入商备案";
- DNS 托管选好服务商:如果要用 Let's Encrypt,Cloudflare 是最稳的选择;
- HTTP 也能跑 demo:不要一开始就把 HTTPS 当成必选项,先把 HTTP 跑通,验证业务逻辑更重要;
- 养成看日志的习惯:
/var/log/letsencrypt/letsencrypt.log、nginx -T、docker compose logs都是排障神器。
八、写在最后
从入门到放弃,其实并不可怕。放弃的是「在当前网络条件下硬上 HTTPS」这条路径,而不是放弃整个项目。服务器已经跑起来了,API 和前端都能访问,后面只需要把域名合规性解决,HTTPS 就是水到渠成的事。
如果你也在部署 Linux 服务器时卡住了,欢迎交流。大家一起踩坑、一起填坑。
关于作者
码农刚子,六年 ERP / 制造业系统开发,专注 C# / .NET / Blazor。 写 PCB 行业 ERP 与多租户 SaaS 的实战与踩坑,不写面试八股。
博客:https://www.coderlog.net/ | 公众号:CSharp精选营
暂无评论,来抢沙发吧~