关于 phoenix-ops
面向 Elixir/Phoenix 开发者的生产部署运维指南,涵盖发布配置、集群、可观测性与安全加固。还涉及后台任务、健康检查和常见部署模式。
主要功能
- 01配置生产发布与运行时设置
- 02规划集群、PubSub 与 Presence
- 03设置遥测、日志和指标
- 04加固 HTTP 端点与网络
- 05配置后台任务及部署模式
适用场景
- 01准备 Phoenix 应用的生产发布
- 02排查集群 Presence 不一致
- 03为服务添加指标与健康检查
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ bobmatnyc/ claude-mpm-skills --skill phoenix-ops安装后在 Claude Code 中输入/phoenix-ops确认已加载。
附带文件metadata.json
详细介绍
Phoenix 运维与部署(Elixir/BEAM)
生产就绪的 Phoenix 应用依赖发布版本、运行时配置、遥测、集群和安全端点。正确配置后,BEAM 可支持滚动重启,并通过监督机制增强韧性。
发布版本与运行时配置
MIX_ENV=prod PHX_SERVER=true mix assets.deploy
MIX_ENV=prod mix release
_build/prod/rel/my_app/bin/my_app eval "IO.puts(:os.type())"
_build/prod/rel/my_app/bin/my_app start
通过环境变量驱动设置的 config/runtime.exs:
config :my_app, MyApp.Repo,
url: System.fetch_env!("DATABASE_URL"),
pool_size: String.to_integer(System.get_env("POOL_SIZE", "10")),
ssl: true
config :my_app, MyAppWeb.Endpoint,
url: [host: System.fetch_env!("PHX_HOST"), port: 443, scheme: "https"],
http: [ip: {0,0,0,0}, port: String.to_integer(System.get_env("PORT", "4000"))],
secret_key_base: System.fetch_env!("SECRET_KEY_BASE"),
server: true
密钥
- 优先使用环境变量或密钥存储(AWS/GCP KMS、Vault);避免将密钥写入配置。
- 使用
mix phx.gen.secret生成SECRET_KEY_BASE。
集群与 PubSub/Presence
添加 libcluster 以自动发现节点:
# mix.exs deps
{:libcluster, "~> 3.3"},
{:phoenix_pubsub, "~> 2.1"},
# application.ex
topologies = [
dns_poll: [
strategy: Cluster.Strategy.DNSPoll,
config: [poll_interval: 5_000, query: "my-app.internal"],
connect: {:net_adm, :ping}
]
]
children = [
{Cluster.Supervisor, [topologies, [name: MyApp.ClusterSupervisor]]},
{Phoenix.PubSub, name: MyApp.PubSub},
MyAppWeb.Endpoint
]
指南
- 在各节点间共享
secret_key_base,以确保会话签名一致。 - 对 Presence 使用分布式 PubSub;启用依赖 Presence 的功能前,确保节点已连通。
- 对于蓝绿部署,确保不同版本的 Cookie 兼容。
遥测、日志与指标
- 安装
opentelemetry_phoenix和opentelemetry_ecto,用于追踪和指标。 - 添加
Plug.Telemetry和LoggerJSON,或使用结构化日志。 - 通过
:telemetry_poller导出指标(Prometheus/OpenTelemetry),获取 VM 统计信息(归约次数、内存、调度器)。 - 在生产环境中将
LOGGER_LEVEL=info;仅在排查问题时使用:debug。
HTTP 与网络加固
- 强制使用 HTTPS(
force_ssl)、HSTS、安全 Cookie(same_site、secure)和恰当的content_security_policy。 - CORS:为 API 源配置
cors_plug。 - 速率限制:使用 Plug(ETS/Cachex 令牌桶)或边缘服务(NGINX/Cloudflare)进行限制。
- 上传:优先使用预签名 URL;限制请求正文大小(
:max_request_line_length、:max_header_value_length)。
资源与静态内容交付
mix assets.deploy会运行 npm/tailwind/esbuild 并为资源生成摘要。- 通过 CDN/反向代理提供静态文件;确保在 Endpoint 中设置
cache-control标头。 - 在生产环境中禁用不需要的 watcher,以缩减镜像体积。
后台作业
- 推荐使用 Oban 来实现重试/退避、计划作业和隔离;在
application.ex中监督其进程。 - 通过运行时环境配置队列;使用 Oban Web/Pro 或遥测进行监控。
- 对于 CPU 密集型任务,可考虑使用进程池或外部工作进程,避免阻塞调度器。
部署模式
- 容器:使用多阶段构建;运行
mix deps.get --only prod、mix compile、mix assets.deploy,然后运行mix release。 - Systemd:将发布二进制文件作为服务运行,并通过
Environment=设置密钥;添加Restart=on-failure。 - Fly/Gigalixir/Render:提供环境变量、连接 Postgres/Redis,并开放长连接 WebSocket 端口。
- 蓝绿或金丝雀部署:确保数据库迁移兼容;先部署代码,再运行迁移;对架构变更使用功能标志。
可观测性与健康检查
- 添加
/health和/ready端点(检查 Repo 以及 PubSub/Presence)。 - 导出 VM 指标:运行
:telemetry_poller,监控调度器利用率和内存。 - 针对错误率、数据库超时、队列深度和 VM 内存设置告警。
常见问题
- 构建发布版本时未设置
PHX_SERVER=true(Endpoint 不会启动)。 config/runtime.exs中缺少运行时配置;依赖编译时配置保存密钥。- 未配置集群发现 → 各节点间的 Presence 状态不一致。
- 保留默认
secret_key_base或为每个节点单独设置密钥 → 部署后会话失效。 - 大型资源未生成摘要或未使用 CDN → 冷启动加载缓慢。
评论
支持 Markdown