phoenix API服務釋出

wang_yb發表於2018-06-13

概述

Elixir 的 Phoenix 框架對於開發 Web 應用非常方便,不僅有 RoR 的便利,還有 Erlang 的效能和高併發優勢。 但是應用的釋出涉及到 Erlang 和 Elixir 環境,部署不是那麼方便,特別是很多 package 需要訪問國外的伺服器。

因此,如果能像 golang 那樣,把整個應用打包成一個可執行的二進位制,部署時會方便很多。 打包後不僅包含應用引用的 packages,也包含 erlang 的執行環境。

使用 distillery 就可以完成需求。 這裡打包的是 API 服務,也就是不包含前端的部分。

distillery 打包

distillery 提供豐富了 API,除了打包,還有升級/降級,程式碼熱替換等功能,這裡我們只介紹打包的功能。

建立示例工程

$ mix phx.new hello --no-brunch --no-ecto 

只是實驗 phoenix 工程的打包功能,所以這裡不安裝前端的依賴,也不安裝資料庫相關依賴。

建立一個簡單的 api lib/hello_web/router.ex

scope "/api", HelloWeb do
  pipe_through(:api)

  get("/", PageController, :api)
end

lib/hello_web/controllers/page_controller.ex

def api(conn, _params) do
  json(conn, %{result: "success"})
end

安裝 distillery

mix.exs 中的 deps 中新增:

defp deps do
  [
    ...
    {:distillery, "~> 1.5", runtime: false}
  ]
end

然後在 hello 工程目錄下執行:

mix deps.get 

執行成功的話,在命令列介面上可以看到安裝了 distillery 依賴。

配置 distillery 相關

首先,生成配置檔案

mix release.init

這個命令生成的 rel/config.exs 沒有什麼要修改的。

修改 config/prod.exs

config :hello, HelloWeb.Endpoint,
  server: true,
  http: [port: 4001],
  url: [host: "localhost", port: 4001]

這裡寫死了 port,也可以改成從環境變數中讀取。

釋出工程

MIX_ENV=prod mix release

編譯成功後,在 _build/prod/rel/hello/releases/ 資料夾下生成一個 hello.tar.gz 包,這個包就可以直接部署在其他機器上。 如果預設配置,version 就是 0.0.1

部署執行

將生成的 hello.tar.gz 放到其他機器也可以直接執行,不用安裝 erlang 和 elixir 環境。

cd /home
mkdir hello
tar zxvf hello.tar.gz -C hello
cd hello
./bin/hello foreground

總結

distillery 的功能遠不止此,更多的功能可以參考:https://hexdocs.pm/distillery/getting-started.html

相關文章