查看源代码 部署简介

一旦我们拥有了一个可运行的应用程序,我们就可以将其部署了。如果您还没有完成自己的应用程序,别担心。只需按照 快速入门指南 创建一个基本的应用程序即可。

准备应用程序进行部署时,主要有三个步骤:

  • 处理应用程序密钥
  • 编译应用程序资产
  • 在生产环境中启动服务器

在本指南中,我们将学习如何在本地运行生产环境。您可以使用本指南中的相同技术在生产环境中运行应用程序,但根据您的部署基础设施,可能需要额外的步骤。

作为部署到其他基础设施的示例,我们还在我们的指南中讨论了四种不同的方法:使用 Elixir 的发布 以及 mix release使用 Gigalixir使用 Fly 以及 使用 Heroku。我们还在 社区部署指南 中包含了在其他平台上部署 Phoenix 的链接。最后,发布指南提供了一个示例 Dockerfile,如果您希望使用容器技术进行部署,可以使用该文件。

让我们逐一探讨上述步骤。

处理应用程序密钥

所有 Phoenix 应用程序都有一些必须保持安全的数据,例如,生产数据库的用户名和密码,以及 Phoenix 用于签署和加密重要信息的密钥。一般建议将这些信息保存在环境变量中,并将其加载到应用程序中。这在 config/runtime.exs(以前是 config/prod.secret.exsconfig/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 时设置 PORTMIX_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

就是这样。接下来,您可以使用我们的官方指南之一进行部署

社区部署指南