您的位置:首页 > 移动开发 > 微信开发

Phoenix + 微信H5房卡棋牌三公搭建平台分布式部署验证

2018-03-09 13:57 260 查看

实验器材

微信H5房卡棋牌三公搭建平台(h5.fanshubbs.com)
Docker联系Q1687054422
Docker compose
Elixir开发/运行环境
一个最基本的Phoenix聊天室,不含数据库,不含assets,不含brunch。

安装发布工具

Elixir社区目前比较推荐的发布工具是Distillery(蒸馏器),这次实验就用它。安装只需要在项目根目录的
mix.exs
里添加如下内容就行
defp deps do
[
{:distillery, "~> 1.5", runtime: false}   #<--- 这一行
]
end
这里的
runtime: false
表示distillery不会在web应用中用到,只在发布的时候用一下。
添加完后只需
mix deps.get
一下就行。

发布配置

首先让distillery生成一些最基本的发布配置:
$ mix release.init
你会看到项目根目录下多了个
rel
目录,里面只有一个空的
plugins
目录和一个
config.exs
文件。这个文件的配置用来发布到单台服务器已经足够了,但是要做集群还是不太够,因为我们要让各台服务器上的Phoenix应用能连起来相互通信。为此,我们需要给每个运行的实例一个名称(
name
sname
)。为了达到这个目的,我们需要一个
vm.args
文件。这个文件记录了Erlang启动虚拟机时所需的命令行参数。但是这个文件长啥样?我们现release一个,让它自动生成一个
vm.args
文件再说。
$ MIX_ENV=prod mix release --env prod
这里的
MIX_ENV=prod
是指“用Phoenix的prod环境的配置来运行发布任务”,这样做可以使项目的编译得到优化,比如去除debug信息等。而
--env prod
指的是“按
rel/config.exs
文件里
:prod
环境的配置去构建发布版”。这个
prod
和Phoenix的
prod
的意义完全不同,所以两个都不能少。既然说到了
rel/config.exs
里定义的环境,就先看看它长什么样吧。
Path.join(["rel", "plugins", "*.exs"])
|> Path.wildcard()
|> Enum.map(&Code.eval_file(&1))

use Mix.Releases.Config,
default_release: :default,
default_environment: Mix.env()

environment :dev do
set dev_mode: true
set include_erts: false
set cookie: :"<&9.`Eg/{6}.dwYyDOj>R6R]2IAK;5*~%JN(bKuIVEkr^0>jH;_iBy27k)4J1z=m"
end

environment :prod do
set include_erts: true
set include_src: false
set cookie: :">S>1F/:xp$A~o[7UFp[@MgYVHJlShbJ.=~lI426<9VA,&RKs<RyUH8&kCn;F}zTQ"
end

release :gossipy do
set version: current_version(:gossipy)
set applications: [
:runtime_tools
]
end
这就是一个完整的
rel/config.exs
文件内容(去掉了注释)。我们可以看到里面有个
environment :prod
块,还有一个
environment :dev
块,这两个块定义了两种不同的构建策略。这里比较重要的是
set include_erts: true|false
这一项。erts是“Erlang RunTime System”的缩写,也就是整个Erlang运行环境。如果把这一项设置成
true
,则打出来的包里包含整个Erlang运行环境,于是你的目标服务器上就可以不用装Erlang和Elixir了。上述命令运行完后,会生成
_build/prod/rel
目录及其下面所有的文件。在这里面找到
vm.args
文件(具体位置忘了),把它复制到项目根目录下的
rel
目录里,稍事修改:
# 删除下面这一行
# -name gossipy@127.0.0.1
# 加入下面这一行
-sname gossipy
name
sname
的区别不多说了。因为到时候我们要部署到docker上去,用IP或全限定域名不方便,所以就用主机名。改完
vm.args
之后,我们要让distillery认识这个改动过的
vm.args
。我们在
rel/config.exs
里加上一行:
environment :prod do
...
set vm_args: "rel/vm.args"
end
除了这些,Distillery还要求在项目的
config/prod.exs
里加一些东西:
config :gossipy, GossipyWeb.Endpoint,
...
check_origin: false,
server: true,
root: ".",
version: Application.spec(:gossipy, :vsn)
check_origin: false
只是做实验的时候图一时方便,正式上产品的时候千万不要加这一行。
server: true
的意思是这是一个web server,所以要用Cowboy去启动,而不是直接从Application启动。
root: "."
表示静态文件(CSS,JS之类)的根在哪儿。因为我们这次没有静态文件,所以不配也OK。
version
是发布的版本号。它的值通过
Application.spec(:gossipy, :vsn)
获取,也就是
mix.exs
里那个版本号。
另外,我们需要在这个配置文件里列出所有的分布式节点:
config :kernel,
sync_nodes_optional: [:"gossipy@ws1", :"gossipy@ws2"],
sync_nodes_timeout: 10000
sync_nodes_optional
是指“如果在
sync_nodes_timeout
指定的时间范围内没有连上指定的节点,则忽略那个节点”。与之相对的还有一个
sync_nodes_mandatory
选项。所有配置都准备好后,先清除掉上次构建的发布版,再重新构建一次:
$ MIX_ENV=prod mix release.clean
$ MIX_ENV=prod mix release --env prod
然后就可以准备部署了

创建Docker镜像

既然是部署到Docker,
a343
就要先创建一份Dockerfile,内容如下:
FROM ubuntu:xenial

EXPOSE 4000

ENV PORT=4000

RUN mkdir -p /www/gossipy && \
apt-get update && \
apt-get install -y libssl-dev

ADD ./_build/prod/rel/gossipy/releases/0.0.1/gossipy.tar.gz /www/gossipy

WORKDIR /www/gossipy

ENTRYPOINT ./bin/gossipy foreground
因为发布包内的Erlang运行环境要求服务器的OS和Distillery运行时的OS尽可能一样,所以这里就用Ubuntu 16.04的服务器版。端口设为4000(你喜欢其他端口号也OK)。由于WebSocket需要crypto.so,所以先装一下libssl-dev,否则应用起不来。把打包出来的tar包扔进镜像(docker会替你自动解压),当docker启动的时候把这个服务启动起来就是了。为了能简化命令行命令,再建一个docker-compose.yml
version: '3.2'

services:
ws1:
build: .
hostname: ws1
ports:
- 4001:4000

ws2:
build: .
hostname: ws2
ports:
- 4002:4000
我定义了两个节点,分别将宿主的4001和4002端口NAT到了docker容器的4000端口。另外,这里显式声明了每个节点的主机名(
hostname
),方便和Phoenix应用对接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: