静态文件上线:DEBUG=False 时 /static/ 是 404;collectstatic 复制 132 个文件(含 admin)但不提供服务;WhiteNoise 才提供(max-age=60, public);Manifest 存储忘了 collectstatic 会让页面 500,收集后文件名带哈希并长期缓存。
媒体文件上线:DEBUG=False 时 static() 返回空路由、/media/ 是 404;FileField 把 ../../evil.txt 保存成 docs/evil.txt、重名加随机后缀;2.5 MiB 以上用临时文件;DATA_UPLOAD_MAX_MEMORY_SIZE 不限文件,文件个数默认最多 100;上传的 .html 会以 text/html 返回。
连接池:默认 CONN_MAX_AGE=0 每个请求新建数据库连接(200/200 次,中位 2.60 ms),持久连接与连接池都不再新建(0.52 / 0.51 ms);max_connections=20 时 40 线程持久连接有 20 个请求被拒,连接池全部成功。
生产环境日志:没有 LOGGING 配置、DEBUG=False 时,gunicorn 日志里只有 1 行,500 的 traceback、404、DisallowedHost 都不见了;配置 LOGGING 后有 35 行、3 段 traceback;请求 ID 过滤器让一次请求的日志可以按 id 查;got_request_exception 信号是错误追踪的挂钩。
健康检查:探针用 Pod IP 当 Host 走 http 会被 ALLOWED_HOSTS 拒(400)或被 SSL 重定向(301);放在 MIDDLEWARE 最前面的存活中间件绕开这些、0 次数据库查询;就绪探针查数据库,数据库停掉后 503 而存活仍是 200;connect_timeout=2 使不可达的数据库约 2 s 后返回 503。
ZooKeeper 3.9.6 单机实测:单个 znode 上限约 1 MiB(1024 KiB 会 ConnectionLoss),同步写约 329 次/秒、同步读约 6361 次/秒,每个写都有全局递增的 zxid,整棵树常驻内存——小数据、强顺序、读多写少的协调服务。
单机、伪集群与集群的区别(ZooKeeper 3.9.6 实测):单机 Mode=standalone,写延迟 3.00 ms;3 节点伪集群 server.N + myid,写延迟 6.07 ms;只起 1/3 时进程在、ruok=imok 但不服务,起到 2/3 才能服务。
用 conf 命令看 zoo.cfg 的生效值:tickTime 默认 2000 ms,会话超时范围 [2×tick, 20×tick];客户端请求 60000 ms 被夹到 20000 ms;maxClientCnxns 连四字命令也算;拼错参数名(tickTim)静默忽略。
用启动日志还原 ZooKeeper 的启动流程:读配置 → 无 server.N 走单机分支 → 创建服务(带会话超时范围)→ 绑定端口 → 载入快照 → 启动请求处理链,整个日志内部约 90 ms;有数据重启多一步读快照;端口被占用时进程以退出码 1 退出。
ZooKeeper 数据目录实测:version-2 里是 log.<zxid> 事务日志(预分配 64 MiB,稀疏)和 snapshot.<zxid> 快照;每做一次快照事务日志就滚动;用 TxnLogToolkit 与 SnapshotFormatter 读出里面的内容;dataLogDir 可把事务日志放到另一块盘。
用官方 ZooKeeperMain 逐条执行 create / get -s / set / ls -R / delete / deleteall / set -v / create -e / -s 等命令,看真实输出和错误信息:非空节点不能 delete、版本不对拒绝更新、父节点不自动创建,CLI 退出后临时节点还在会话超时之前。
znode 的数据模型实测:stat 的 11 个字段,哪些操作改变哪些字段(set 改 mzxid/version,创建 / 删除子节点改 pzxid/cversion/numChildren,setACL 只改 aversion;改子节点数据不影响父节点);路径的合法与非法写法。