两天从零到 SSO:站群基建踩坑复盘

两天时间,从一台裸的阿里云 ECS 到「五域名 HTTPS 在线 + 统一账号 SSO 打通」。技术方案没什么新鲜的,踩的坑倒是值得记下来。

架构一句话

单机 Docker Compose:Nginx 终结 TLS 按子域反代,PostgreSQL 单实例分库,认证中心独立容器,各站只认标准 JWT/JWKS——为将来换栈预留的后门。

坑一:国内镜像源的缓存是陈旧的

阿里云容器加速器对缓存未命中直接返回 not found 而不是回源:

  • nginx:1.27-alpine、postgres:16-alpine 全部 not found
  • 切到 nginx:stable-alpine 又拉到一个很旧的 stable——不认识 http2 on; 新指令,容器崩溃循环

教训:用活跃滚动 tag;镜像源配双路(阿里云 + 公共源回退);配置语法要兼容新旧版本。

坑二:CORS 白名单漏了 www

登录后跳回主页,死活显示未登录。浏览器 Console 一看:

Access to fetch at 'https://account.x2245.com/v1/me'
from origin 'https://www.x2245.com' has been blocked by CORS policy

白名单里有 x2245.com、tools、blog,唯独没有 www。而我的 curl 测试用的是裸域,所以一直测不出来。

教训:别维护白名单了,直接规则放行——任意 https://*.x2245.com 自动可信,以后新子域也免配置。测试要覆盖用户真实的访问入口。

坑三:node:20-slim 没有 OpenSSL

Prisma 检测不到 libssl 就默认拿 openssl-1.1.x 版引擎,migrate deploy 报 Schema engine error 静默崩溃重启:

prisma:warn Prisma failed to detect the libssl/openssl version to use...

教训:slim 镜像缺系统库很常见,构建期就装好(而且要装在 npm install 之前,引擎是安装时按检测结果下载的)。

坑四:nginx 拿着旧 IP 永久 502

Docker 容器重建后 IP 变了,nginx 在配置加载时解析的地址就过期了。修复:resolver 127.0.0.11 valid=10s + 变量 proxy_pass,每次请求重新解析。

坑五:try_files 回退到不存在的文件

博客 vhost 的 try_files 最后回退到 /404.html,而这文件不存在——找不到的资源全部变成 500。回退要写 =404,别指向不存在的路径。

复盘

这些坑有个共同点:自己的测试环境覆盖不到真实链路(国内镜像、www 入口、slim 镜像、容器重建)。 上线后多用浏览器点几下、看一眼 Console,比再多跑一遍本地测试都管用。

评论

评论区待接入 giscus(GitHub Discussions)。配置 src/consts.ts 后自动启用。