1.
概述:目标与准备
- 目标:确保位于香港机房的 iOS 后端(包括 APNs、API、静态资源)全年高可用、低延迟且可快速恢复。
- 前提准备:获取机房公网 IP、交换机/路由图、机柜位置、负责厂商联系人、访问凭证(SSH、控制台)。准备好 CI/CD 凭证、监控账号与证书管理权限。
2.
上线前的变更与验证清单
- 环境对齐:在测试环境按生产镜像做一次完整回放(数据库快照、文件存储、缓存)。
- 健康接口:实现 /healthz 返回 200 且包含依赖检查(DB、Redis、外部 API)。用 curl -v http://localhost/healthz 验证。
- 自动化测试:执行接口级、并发与压力测试(ab、wrk),并记录 RPS、p95、错误率基线。
3.
网络与 DNS 操作步骤
- DNS:在香港机房使用本地 DNS 池。为 api.example.com 配置至少两个 A 记录到不同交换节点,TTL 60。
- 路由与白名单:确保防火墙允许 443/80 出入,APNs 使用 api.push.apple.com:443(推荐)并开放向 17.0.0.0/8 的出站 TLS。
- 链路检测:配置外联探针,脚本示例:curl -sS --connect-timeout 5 https://api.push.apple.com/3/device/xxx || echo failure。把结果上报到监控。
4.
TLS 与 APNs 证书管理
- 证书清单:列出所有域名证书与 APNs key(.p8)与到期日。建立到期前 30/14/7 天提醒。
- 自动部署:使用 acme 客户端(certbot/lego)自动申请/续签,对私钥权限 chown root:root && chmod 600。示例 crontab:0 3 * * * /usr/bin/certbot renew --post-hook "systemctl reload nginx".
- APNs 连接:使用 HTTP/2 客户端向 api.push.apple.com:443,确保使用 .p8 token 签名并缓存 token,避免每次建立连接重新认证。
5.
负载均衡与流量控制
- 算法与健康检查:在负载均衡器(Nginx/HAProxy/云 BAL)配置主动健康检查到 /healthz,若返回非 200,自动移出上游。
- 会话与连接:为长连接(WebSocket、推送)使用 sticky 或 session affinity,并设置合理超时(keepalive 65s)。
- 限速与熔断:在网关层实现每 IP/每 API 的速率限制,针对下游错误实现熔断(5xx 超过阈值则短暂拒绝新请求)。
6.
操作系统与服务调优(具体命令示例)
- 文件描述符:编辑 /etc/security/limits.conf 增加 * soft nofile 65536 与 * hard nofile 131072,并在 systemd 服务文件中设置 LimitNOFILE=65536。
- 内核参数:编辑 /etc/sysctl.conf 添加:net.core.somaxconn=10240, net.ipv4.tcp_tw_reuse=1, net.ipv4.ip_local_port_range=1024 65535;执行 sysctl -p。
- Nginx 建议:worker_processes auto;worker_connections 40960;keepalive_timeout 65;sendfile on;tcp_nopush on;proxy_buffering off(针对实时接口)。
7.
日志、监控与告警具体搭建
- 指标采集:部署 node_exporter/metrics exporter、应用端收集 prometheus 格式指标并暴露 /metrics。
- 可视化与告警:Prometheus + Grafana,关键告警:APIs 5xx > 1% 且 RPS 下跌、APNs failed rate > 0.1%、主机 CPU > 80% 持续 5min。
- 日志与追踪:集中式 ELK/EFK,关键日志字段:request_id、user_id、device_id、env。为慢请求配置 APM(如 Jaeger)并将 trace_id 回写到日志。
8.
发布、回滚与灰度步骤
- 发布流程:CI 构建镜像 -> 在香港机房 Canary 节点部署 5% 流量 -> 监控 15-30min 指标 -> 放量到 100%。
- 回滚操作:若 Canary 指标异常,立即将流量回拨到旧版本(LB 回滚),并触发回滚脚本:kubectl rollout undo deployment/api --to-revision=x 或 docker-compose down && docker run
。
- 回归验证:回滚后执行 smoke test(业务关键路径)并确认 /healthz 与外联探针状态正常。
9.
备份与容灾(DR)可执行步骤
- 数据备份:数据库每日全量快照 + 每小时增量,快照存到异地(例如香港机房外的公有云 S3),并定期做恢复演练。
- 冗余部署:关键服务在不同机柜或可用域部署至少 N+1,DNS 使用健康检测的多地回退策略。
- 演练:每季度做一次灾难切换演练,记录 RTO 与 RPO,更新 runbook。
10.
安全与合规操作步骤
- 外网访问控制:只开放必要端口,管理端使用跳板机并开启 MFA,跳板机日志集中化。
- WAF 与入侵防护:启用 WAF 规则针对常见攻击(OWASP TOP10),并使用 fail2ban 阻断暴力登录。
- 审计与权限:最小权限原则,定期审计 SSH Key、API Key,并对关键变更做审计流水线记录。
11.
日常运维例行任务清单(每周/每月)
- 每日:检查 /healthz 与告警队列、APNs 推送成功率、证书到期提醒。
- 每周:清理日志、检查磁盘空间、执行备份完整性验证。
- 每月:恢复演练、证书与库依赖升级、流量峰值容量评估并按需扩容。
12.
应急 Runbook(简化版步骤)
- 步骤一(发现与分类):记录影响范围、是否业务中断、影响用户数。
- 步骤二(快速缓解):临时扩容实例、回滚到稳定版本、流量切换到备用机房。
- 步骤三(根因与修复):在恢复后 24 小时内完成根因分析并实施永久修复,提交变更审计。
13.
问:在香港机房部署 iOS 服务最常见的三大稳定性风险是什么?
- 答:分别是(1)APNs 连接失败或证书过期导致推送中断;(2)网络链路/带宽瓶颈导致请求超时;(3)部署回滚不及时或无灰度导致大面积故障。
14.
问:如何快速验证 APNs 是否能从机房正常访问?
- 答:在机房一台机器上用 openssl 或 curl 建立到 api.push.apple.com:443 的 TLS 连接并发送 test request,或运行脚本用现有 .p8 token 发送一条测试推送并检查返回码(HTTP/2 200 为成功)。
15.
问:如果发现香港机房延迟升高,第一步应该做什么?
- 答:立即查看负载均衡与主机的 CPU/IO/网络带宽,回收不必要连接(例如短连接泄露),如需临时扩容则启动备用实例并调整 DNS/LB 流量,随后定位是应用层慢查询、缓存失效还是链路问题。
来源:ios香港机房 在香港机房保障iOS服务稳定性的运维清单