查看源代码 部署简介
一旦我们拥有了一个可运行的应用程序,我们就可以将其部署了。如果您还没有完成自己的应用程序,别担心。只需按照 快速入门指南 创建一个基本的应用程序即可。
准备应用程序进行部署时,主要有三个步骤:
- 处理应用程序密钥
- 编译应用程序资产
- 在生产环境中启动服务器
在本指南中,我们将学习如何在本地运行生产环境。您可以使用本指南中的相同技术在生产环境中运行应用程序,但根据您的部署基础设施,可能需要额外的步骤。
作为部署到其他基础设施的示例,我们还在我们的指南中讨论了四种不同的方法:使用 Elixir 的发布 以及 mix release
、使用 Gigalixir、使用 Fly 以及 使用 Heroku。我们还在 社区部署指南 中包含了在其他平台上部署 Phoenix 的链接。最后,发布指南提供了一个示例 Dockerfile,如果您希望使用容器技术进行部署,可以使用该文件。
让我们逐一探讨上述步骤。
处理应用程序密钥
所有 Phoenix 应用程序都有一些必须保持安全的数据,例如,生产数据库的用户名和密码,以及 Phoenix 用于签署和加密重要信息的密钥。一般建议将这些信息保存在环境变量中,并将其加载到应用程序中。这在 config/runtime.exs
(以前是 config/prod.secret.exs
或 config/releases.exs
)中完成,该文件负责从环境变量中加载密钥和配置。
因此,您需要确保在生产环境中设置了正确的相关变量
$ mix phx.gen.secret
REALLY_LONG_SECRET
$ export SECRET_KEY_BASE=REALLY_LONG_SECRET
$ export DATABASE_URL=ecto://USER:PASS@HOST/database
请勿直接复制这些值,请根据 mix phx.gen.secret
的结果设置 SECRET_KEY_BASE
,并根据您的数据库地址设置 DATABASE_URL
。
如果由于某种原因您不想依赖环境变量,您可以在 config/runtime.exs
中硬编码密钥,但请确保不要将该文件检入您的版本控制系统。
在您的密钥信息安全地保护之后,就可以配置资产了!
在执行此步骤之前,我们需要做一些准备工作。由于我们将为生产环境做好准备,因此我们需要在该环境中进行一些设置,以便获取我们的依赖项并进行编译。
$ mix deps.get --only prod
$ MIX_ENV=prod mix compile
编译应用程序资产
此步骤仅在您有可编译的资产(如 JavaScript 和样式表)时才需要。默认情况下,Phoenix 使用 esbuild
,但所有内容都封装在一个单独的 mix assets.deploy
任务中,该任务在您的 mix.exs
中定义
$ MIX_ENV=prod mix assets.deploy
Check your digested files at "priv/static".
就是这样!Mix 任务默认情况下会构建资产,然后生成带有缓存清单文件的摘要,以便 Phoenix 可以在生产环境中快速提供资产。
注意:如果您在本地机器上运行上述任务,它会在
priv/static
中生成许多摘要资产。您可以通过运行mix phx.digest.clean --all
来修剪它们。
请记住,如果您不小心忘记了运行上述步骤,Phoenix 会显示一条错误消息
$ PORT=4001 MIX_ENV=prod mix phx.server
10:50:18.732 [info] Running MyAppWeb.Endpoint with Cowboy on http://example.com
10:50:18.735 [error] Could not find static manifest at "my_app/_build/prod/lib/foo/priv/static/cache_manifest.json". Run "mix phx.digest" after building your static files or remove the configuration from "config/prod.exs".
错误消息非常清楚:它表示 Phoenix 找不到静态清单。只需运行上面的命令来修复它,或者,如果您没有提供或根本不关心资产,您可以从配置中删除 cache_static_manifest
配置。
在生产环境中启动服务器
要在生产环境中运行 Phoenix,我们需要在调用 mix phx.server
时设置 PORT
和 MIX_ENV
环境变量
$ PORT=4001 MIX_ENV=prod mix phx.server
10:59:19.136 [info] Running MyAppWeb.Endpoint with Cowboy on http://example.com
要在分离模式下运行,以便 Phoenix 服务器不会停止,即使您关闭终端也会继续运行
$ PORT=4001 MIX_ENV=prod elixir --erl "-detached" -S mix phx.server
如果您遇到错误消息,请仔细阅读,如果仍然不清楚如何解决,请提交错误报告。
您也可以在交互式 shell 中运行应用程序
$ PORT=4001 MIX_ENV=prod iex -S mix phx.server
10:59:19.136 [info] Running MyAppWeb.Endpoint with Cowboy on http://example.com
整合
前面的部分概述了部署 Phoenix 应用程序所需的步骤。实际上,您最终会添加自己的步骤。例如,如果您使用数据库,您还希望在启动服务器之前运行 mix ecto.migrate
,以确保您的数据库是最新的。
总而言之,这是一个您可以用作起点的脚本
# Initial setup
$ mix deps.get --only prod
$ MIX_ENV=prod mix compile
# Compile assets
$ MIX_ENV=prod mix assets.deploy
# Custom tasks (like DB migrations)
$ MIX_ENV=prod mix ecto.migrate
# Finally run the server
$ PORT=4001 MIX_ENV=prod mix phx.server
就是这样。接下来,您可以使用我们的官方指南之一进行部署
- 使用 Elixir 的发布
- 到 Gigalixir,一个以 Elixir 为中心的平台即服务 (PaaS)
- 到 Fly.io,一个 PaaS,可以将您的服务器部署到靠近用户的位置,并提供内置的分布式支持
- 以及 到 Heroku,最流行的 PaaS 之一。
社区部署指南
- Render 对 Phoenix 应用程序提供了首屈一指的支持。有指南可用于使用 Mix 发布、Distillery 以及作为 分布式 Elixir 集群 托管 Phoenix。