2010年10月26日 星期二

快速讓二郎建立Web Server

最近~才剛剛開始接觸Erlang(二郎註1),覺得這functional programming很好玩,所以~特地到圖書館去把Erlang程式設計這本書借回家好好研究,之前~很可惜都與它差插擦身而過好次,只怪相見恨晚:-( 雖然~整本還沒讀完,就開始在東搞西弄的...

  • 自己試著用OTP來玩玩看Web Server

    HTTP ServerErlang Intes這兩篇內容,在按自己的需求來設定…很容易就可以產生一個陽春型Web Server。我參考lib\inets-5.5\examples\server_root\conf下幾個conf檔,隨手抓幾個必要設定來寫成自己的conf。

    myserver.conf

    Port 8089
    ServerName DonaldIsFreak
    ServerRoot /tmp
    DocumentRoot /tmp
    BindAddress localhost
    #為這後面esi功能鋪的梗
    ErlScriptAlias /erl test_esi io
    #等等要試試esi的功能
    Modules mod_alias mod_auth mod_esi mod_actions mod_cgi mod_responsecontrol mod_trace mod_range mod_head mod_include mod_dir mod_get mod_log mod_disk_log

    到Document Root隨便丟個測試的index.html,接著在Console mode下erlc testserver.erl來產生testserver.beam檔案。

    testserver.erl

    -module(testserver).
    -export([init/0,start/0,stop/1]).

    -define(CONFIG_FILE,'myserver.conf').

    init() ->
    %開啟HTTP Server
    inets:start().
    start() ->
    %載入之前的設定值
    {ok,Pid}=inets:start(httpd,[{file,?CONFIG_FILE}]),
    Pid.
    stop(Pid) ->
    inets:stop(httpd,Pid).

    再下erl -s testserver init進入erl mode...



    %建立Web Server
    Pid=testserver:start().

    這樣就可以進入localhost:8089,看到剛剛丟進去的index.html,不過~我還想再試試看4.5 Dynamic Web Pages提到的Erlang Server Interface (ESI),因為~之前的conf已經偷偷設定ErlangAlias和Modules,我就直接把寫個Erlang檔案來玩(記得先Stop Server)。

    test_esi.erl

    -module(test_esi).
    -export([redirect/2,getname/2]).

    redirect(_Env,_Input) ->
    "Location: http://donaldknuth.blogspot.com\r\n\r\n".

    getname(Env,Input) ->
    ["Content-type:text/plain\r\n\r\n",
    io_lib:format("Enviorment : ~p~n",[Env]),
    io_lib:format("Input : ~p~n",[Input]),
    io_lib:format("After Parsed : ~p~n",[httpd:parse_query(Input)])
    ].

    一樣在Console mode下先erlc testserver.erl,不然~在建立Web Server會出現找不到ErlangAlias所指定的Module,最後~把index.html加入:


    <a href='/erl/test_esi:redirect'>Redirect to DonaldIsFreak Blogger</a>
    <form action='/erl/test_esi/getname' method='get'>
    泥素雖?<input type='text' name='Yourname'/>
    <input type='submit' value='讓我來告訴你'/>
    </form>

    可以看到在call Erlang function有兩種URL用法,而我就玩到這為止了!

  • 安裝Yaws的Web Server
    Web Server這檔事,還是應該讓專業的Yaws來才對,目前~還在摸索…,想寫寫看用不一樣的思考模式來完成Dynamic Web Content,而Nitrogen提供了很棒的Framework,如果~有時間也想接觸。

好~~那就草率下個結論做Ending...我從Google找到Erlang拿來當Web Server和與Apache拿來比較效能的幾篇文章,暫切不論結果如何,個人覺得能運用Erlang的特性來開發Web Server,實在是一件很酷的事,也想趁著機會好好學習Erlang這奇怪的程式語言:P。

以上是DonaldIsFreak個人想法,如果~有錯誤地方還不吝指教,謝謝!



  1. 從Yahoo!知識看到Erlang God翻譯成二郎神,覺得有趣就打算直接這樣叫了!

2 則留言:

  1. Nitrogen 我在 Windows 上一直弄不起來

    回覆刪除
  2. 下載Nitrogen 2.0.3 for Windows這版本怪怪的,用他包好的boot和erl v5.7.5一樣會有錯誤,後來~我git check out,然後~跑 Quickstart/quickstart.bat就能正常執行了!

    回覆刪除