UP | HOME

Phoenix 部署记

Table of Contents

1 安装elixir

https://elixir-lang.org/install.html#unix-and-unix-like

使用ubuntu安装

Erlang Solutions repo: wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb

Run: sudo apt-get update

Install the Erlang/OTP platform and all of its applications: sudo apt-get install esl-erlang

Install Elixir: sudo apt-get install elixir

2 phoenix 部署流程

  1. 处理配置文件,应用secret token, config.exs, prod.exs
  2. 编译静态文件, node & brunch
  3. 生产模式下启动,distillery & mix

3 配置

3.1 https 配置

使用 certbot 管理 Let's Encrypt 证书

phoenix prod.exs https 配置示例

config :books, BooksWeb.Endpoint,
  load_from_system_env: false,
  url: [host: "example.com", port: 443],
  force_ssl: [hsts: true],
  https: [:inet6,
          port: 443,
          keyfile: "/etc/letsencrypt/live/example.com/privkey.pem",
          cacertfile: "/etc/letsencrypt/live/example.com/chain.pem",
          certfile: "/etc/letsencrypt/live/example.com/cert.pem"]

load_from_system_env 控制是否从环境变量加载配置, 比如 PORT

4 Phoenix 项目单独启动方式

如果不使用 distillery 打包, 不使用 systemd 类的daemon管理

可以直接使用 mix 命令启动

后台daemon

$ sudo MIX_ENV=prod elixir --detached -S mix do compile, phx.server

不进入后台

$ sudo MIX_ENV=prod mix phx.server

没有进程管理,持掉不能重启

5 distillery

使用distillery 打包 生产环境的release, 使用 distillery 更复杂

$ MIX_ENV=prod mix release

部署到不同的平台的话, 设置 rel/config.exs

include_erts: false 或者 include_erts: path/to/cross/compiled/erts

要部署的tar包位置在 _build/prod/rel/<name>/releases/<version>/<name>.tar.gz

复制到部署机器解压 tar -xzf <name>.tar.gz 或者直接在部署机器跑release任务

6 distillery & systemd 配置

6.1 systemd 配置示例

distillery(doc) 提供三种systemd配置方式

使用第二,第三种更方便,第一种需要生成pid文件

比如我们项目是books,systemd配置文件如下 /etc/systemd/system/books.service 我们使用 foreground & simple 方式, ExecStart 启动当前服务的命令时,使用 foreground , systemd Type 配置为 simple

[Unit]
Description=books
After=network.target

[Service]
User=root
Group=root
Type=simple
WorkingDirectory=/home/ifsclimbing/books
ExecStart=/home/ifsclimbing/books/_build/prod/rel/books/bin/books foreground
ExecStop=/home/ifsclimbing/books/_build/prod/rel/books/bin/books stop
Restart=on-failure
RestartSec=5
Environment=MIX_ENV=prod
Environment=LANG=en_US.UTF-8
SyslogIdentifier=books
RemainAfterExit=no

[Install]
WantedBy=multi-user.target

6.2 systemd Type 配置

systemd 根据 Type=forking Type=simple ExecStart 运行不同的命令

在 systemd 配置中 Type:定义启动时的进程行为

  • Type=simple:默认值,执行ExecStart指定的命令,启动主进程
  • Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
  • Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
  • Type=dbus:当前服务通过D-Bus启动
  • Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行

6.3 systemd 命令

更新配置文件完要执行

$ sudo systemctl daemon-reload

其它命令

$ sudo systemctl enable books
$ sudo systemctl start books
$ sudo systemctl status books

7 Mix & systemd 配置

参考 https://elixirforum.com/t/elixir-apps-as-systemd-services-info-wiki/2400

上面的配置改成下面的样子 ExecStart 修必为使用 mix , type 为 simple

[Unit]
Description=books2
After=network.target

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/home/ifsclimbing/books
ExecStart=/usr/local/bin/mix phx.server 
Restart=on-failure
RestartSec=5
Environment=MIX_ENV=prod
Environment=LANG=en_US.UTF-8
SyslogIdentifier=books2
RemainAfterExit=no

[Install]
WantedBy=multi-user.target

查看日志

$ journalctl -u books2 -n 20

-u 表示哪个unit -n 表示行数, 查看最后20行

8 links

Author: lidashuang

Created: 2018-05-04 Fri 13:11

Emacs 25.3.3 (Org mode 8.2.10)