본문 바로가기
개발/erlang

erlang + rebar3 + cowboy tutorial

by 감토끼 2019. 10. 21.

 

 

환경 : centos7

참고1 : 책 "모바일 서버 프로그래밍 입문 얼랭으로 만들며 배운다"
참고2 : https://tecadmin.net/install-erlang-on-centos/
참고3 : https://medium.com/erlang-central/building-your-first-erlang-app-using-rebar3-25f40b109aad

책 "모바일 서버 프로그래밍 입문 얼랭으로 만들며 배운다" 에 나오는 튜토리얼을 따라하며
플러그인들은 최신 버전으로 적용했습니다.

해당 튜토리얼은 간단히 GET /hello/world 라는 http 요청을 받아서 "hello world" 라는 문자열로 응답해보는 것입니다.

erlang 설치

$ sudo yum install epel-release
$ wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
$ sudo rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
$ sudo yum install erlang
$ sudo yum install esl-erlang

rebar3 설치

$ git clone https://github.com/erlang/rebar3.git
$ cd rebar3
$ ./bootstrap
$ sudo cp ~/rebar3/rebar3 /usr/bin/rebar3

rebar3 app 생성

myapp 이라는 이름으로 생성한다.

$ rebar3 new app myapp
$ cd myapp

rebar3_hex 플러그인 추가

$ vi rebar.config

# 맨 밑줄에 다음 추가
{plugins, [rebar3_hex]}.

$ rebar3 update

cowboy 추가

$ vi rebar.config

# deps 부분에 cowboy 추가
{deps, [cowboy]}.

$ rebar3 compile

# 잘 설치 됬는지 확인
$ rebar3 deps

서버시작 스크립트 생성

####################
# start 라는 이름의 스크립트 파일 생성.
# vm.args 라는 파일을 읽어서 인자를 받아 얼랭 실행

$ vi start

erl -args_file vm.args

$ chmod 775 start

####################
# vm.args 생성

$ vi vm.args

-pa _build/default/lib/myapp/ebin
-pa _build/default/lib/ranch/ebin
-pa _build/default/lib/cowlib/ebin
-pa _build/default/lib/cowboy/ebin
-eval "application:start(myapp)"

src/myapp_app.erl 수정

-module(myapp_app).

-behaviour(application).

-export([start/2, stop/1]).

start(_StartType, _StartArgs) ->
    %% 필요한 어플리케이션 실행
    ok = application:start(crypto),
    ok = application:start(asn1),
    ok = application:start(public_key),
    ok = application:start(ssl),
    ok = application:start(ranch),
    ok = application:start(cowlib),
    ok = application:start(cowboy),

    %% Cowboy Router 설정
    Dispatch = cowboy_router:compile([
        {'_', [
            {"/hello/world", myapp_http, []}
        ]}
    ]),

    %% HTTP Server 설정
    {ok, _} = cowboy:start_clear(http, [{port, 8080}], #{
        env => #{dispatch => Dispatch}
    }),
    case myapp_sup:start_link() of
        {ok, Pid} ->
            io:format("start ok~n"),
            {ok, Pid};
        Error ->
            Error
    end.

stop(_State) ->
    ok.

src/myapp_http.erl

-module(myapp_http).

%% API
-export([init/2, terminate/3]).

init(Req0, State) ->
    Req = cowboy_req:reply(200, #{
            <<"content-type">> => <<"text/plain">>
                }, <<"Hello World!">>, Req0),
                    {ok, Req, State}.

terminate(_Reason, _Req, _State) ->
    ok.

서버시작

$ rebar3 compile
$ ./start

브라우저로 요청해서 결과 확인