我有一个用Elixir Phoenix框架建造的网站。该网站在开发和生产模式下运行良好。
当phoenix服务器在开发模式下运行时,我没有问题续订Let's Encrypt证书,但当完全相同的应用程序在生产模式下运行,我在尝试续订时不断收到权限错误。请注意,我说的是完全相同的应用程序,位于相同的reeBSD服务器上,由同一个用户执行-两者都是不带sudo
的命令。唯一的差异是MIX_ENV=prod
我还注意到,在prod模式下,当Letsencrypt试图访问我的priv/static/.well-known/acme-challenge/(some-unique-string)
时,phoenix服务器记录了一个404错误
问题是:phoenix服务器如何在"prod"one_answers"dev"模式下区别对待目录/文件权限
- 使用Elixir 1.2.4和Phoenix 1.1.4
更新:
各位,由于LetsCrypt和Phoenix框架发展迅速,如果您使用LetsCrypto和Phoenix1.2.0 的最新cerbot,我上面列出的问题不再是问题
不过,这并不是对最初问题的必要回答。
我已经解决了这个问题,使用了一个路由,而不是文件:
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中管理(添加/删除)挑战,而无需重新部署。