14

我有一个使用 Elixir Phoenix 框架构建的网站。该网站在开发和生产模式下都运行良好。

当 phoenix 服务器在 dev 模式下运行时,我更新 Let's Encrypt 证书没有问题,但是当完全相同的应用程序在 prod 模式下运行时,我在尝试更新时不断收到权限错误。请注意,我说的是完全相同的应用程序,在同一个FreeBSD 服务器上,由同一个用户执行 - 两个命令都没有sudo. 唯一的区别是MIX_ENV=prod

我还注意到,在 prod 模式下,当 Letsencrypt 尝试访问我priv/static/.well-known/acme-challenge/(some-unique-string)的 phoenix +letsencrypt 的基本设置时,phoenix 服务器会记录 404 错误,此博客文章中有详细说明

问题是:phoenix 服务器在“prod”和“dev”模式之间如何处理目录/文件权限?

  • 使用 Elixir 1.2.4 和 Phoenix 1.1.4

更新:

伙计们,由于 LetsEncrypt 和 Phoenix 框架发展迅速,如果您使用 LetsEncrypt 和 Phoenix 1.2.0 的最新 cerbot,我上面列出的问题不再是问题

不过,这不是对原始问题的回答。

4

1 回答 1

2

我已经通过使用路由而不是文件解决了它:

scope "/.well-known", MyApp do
   get "/acme-challenge/:challenge", AcmeChallengeController, :show
end

还有一个简单的控制器..

defmodule AcmeChallengeController do
   use MyApp, :controller

   def show(conn, %{"challenge" => "the_random_file_name"}) do
      send_resp(conn, 200, "TheHashInTheFile")
   end

   def show(conn, _) do
      send_resp(conn, 200, "Not valid")
   end
end

这是硬编码的、编译的并且比发送文件更快,但是,也可以使用某种键/值存储,并在 UI 内管理(添加/删除)挑战,而无需重新部署。

于 2016-11-03T13:16:34.323 回答