2017-07-18 10 views
1

私はErlangで初めてですErlangを使ってWebサーバーを作る方法

私はErlangでWebサーバーを作ろうとしています。 Erlangでそれを行うには? 私は地元を作るために、このコードを使用していた。

-module(test). 
-export([start/0,service/3]). 

start() -> 
    inets:start(httpd, [ 
     {modules, [ 
     mod_auth, 
     mod_esi, 
     mod_actions, 
     mod_cgi, 
     mod_dir, 
     mod_get, 
     mod_head, 
     mod_log, 
     mod_disk_log 
     ]}, 

     {port,8082}, 
     {server_name,"helloworld"}, 
     {server_root,"C://xampp//tmp"}, 
     {document_root,"C://xampp//htdocs"}, 
     {erl_script_alias, {"/erl", [test]}}, 
     {error_log, "error.log"}, 
     {security_log, "security.log"}, 
     {transfer_log, "transfer.log"}, 

     {mime_types,[ 
     {"html","text/html"}, {"css","text/css"}, {"js","application/x-javascript"} ]} 
    ]). 

service(SessionID, _Env, _Input) -> mod_esi:deliver(SessionID, [ 
    "Content-Type: text/html\r\n\r\n", 
    "<DOCTYPE html> 
    <head> 
    <meta charset='utf-8'> 
    <meta http-equiv='X-UA-Compatible' content='IE=edge'> 
    <meta name='viewport' content='width=device-width, initial-scale=1'> 
    <title>HTML1</title> 
    <script 
    src='https://code.jquery.com/jquery-3.2.1.js' 
    integrity='sha256-DZAnKJ/6XZ9si04Hgrsxu/8s717jcIzLy3oi35EouyE=' 
    crossorigin='anonymous'></script> 
    <link href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css' rel='stylesheet'/> 
    <link href='css/test1.css' rel='stylesheet'/> 
    <script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js'></script> 
    </head> 
     <html> 
     <body>Ham oc cho! 
     <div class='header'> 
      <ul class='first'> 
       <li class='col-md-4'><a href='#' >Tai khoan cua toi</a></li> 
       <li class='col-md-4'><a href='#' >Trang thai don hang</a></li> 
       <li class='col-md-4'><a href='#' >Danh sach ua thich</a></li> 
       <li class='col-md-4'><a href='#' >Gio hang</a></li> 
       <li class='col-md-4'><a href='#' >Dang nhap</a></li> 
       <li class='col-md-4'><a href='#' >Dang ky</a></li> 
      </ul> 
     </div> 
     </body> 
     </html>" ]). 

をしかし、私は、CSS-jsのファイルを追加する方法を見ていないし、これにバックエンドを書く方法を知りません。

あなたは男、いくつかの例やドキュメントを持ってplsは私に

答えて

5

を共有している場合、ウェブプロトコルに作業するためCowboyMochiwebChicagobossYAWSのようないくつかの有用なErlangのツールがあります。

+0

Ty。私は質問がある:Erlang PHPを置き換えることができますか? 私はErlangがmilionアクセスとphpを千のアクセスのためにサポートできると聞きました。そうですか? –

+2

Erlang(Toolbox)とPHP(レンチ)を比較するのは間違っています。 – Pouriya

+0

私の質問に答えてください。本当に助けてくれます –

2

swsErlang simple web serverで作業することが有益な場合があります。 Erlangの組み込みソケットサポートとHTTPサポートを使用して、接続を処理し、ソケットからHTTP要求を読み込み、応答を送信する方法を示します。

Webサーバが着信接続を受け入れ、アーランの内蔵—参照ライン29を解析するHTTPリクエストのサポートを使用して着信要求を解析することで動作します。

ok = inet:setopts(S, [{packet,http_bin}]), 

{packet, http_bin} socket optionとして、着信ソケットデータを解析しようとするアーランを伝えますHTTP。

ok = inet:setopts(S, [{active, once}]), 
HttpMsg = receive 
       {http, S, Msg} -> Msg; 
       _ -> gen_tcp:close(S) 
      end, 

serve/3:行36にserve/3機能において、フロー制御および背圧の目的のために、我々はまた、メッセージが—線37-41を参照としてswsがアーランから着信データを受信する{active, once}モード、ソケットを保ちます関数は再帰的であり、完全な要求またはエラーが発生するまでHTTP要求データを受け取ります。 serve/3に完全なリクエストがあると、それはハンドラ関数に渡されます。このハンドラ関数は、sws:start/1,2にコールするときに提供することが期待されます。ハンドラは、HTTPステータス、HTTP応答ヘッダ、およびHTTP応答ボディの3組を返すことが期待されます。ここで、ヘッダまたは本文は返された状態によって空になることがあります。

たとえば、次のような単純な「Hello、World!」があります。 Erlangのシェルで実行しているアプリケーション:

ここ
1> c(sws). 
{ok,sws} 
2> Sws = spawn(sws, start, [fun(_,_) -> {200, [], <<"Hello, World!">>} end]). 
<0.73.0> 

、ハンドラとして渡さfunは常にHTTPステータス200、応答なしヘッダ、および応答体の文字列のバイナリを返します。 Unixのシェルからカール経由でサーバーにアクセスすると予想される応答を示しています。私たちは-vの詳細を表示するようにカールする渡すと

$ curl http://localhost:8000 
Hello, World! 

を、我々は、次を参照してください。

$ curl -v http://localhost:8000 
* Rebuilt URL to: http://localhost:8000/ 
* Trying ::1... 
* TCP_NODELAY set 
* Connection failed 
* connect to ::1 port 8000 failed: Connection refused 
* Trying 127.0.0.1... 
* TCP_NODELAY set 
* Connected to localhost (127.0.0.1) port 8000 (#0) 
> GET/HTTP/1.1 
> Host: localhost:8000 
> User-Agent: curl/7.51.0 
> Accept: */* 
> 
* HTTP 1.0, assume close after body 
< HTTP/1.0 200 
< 
* Curl_http_done: called premature == 0 
* Closing connection 0 
Hello, World! 

まずカールがIPv6経由で接続しようとすると、 swsはそれをサポートしていないので失敗します(成功する可能性もあります)ので、成功したIPv4で再試行します。次に、Curlはリソースに対してGETリクエストを送信します。 curlが応答を見ると、200のステータスコードが表示され、返信がHTTP 1.0であることがわかります。したがって、本体が送信された後に接続が閉じられると正しく仮定しているので、応答を受け取った後、 。

あなたが提供するハンドラ関数は、クライアントソケットと要求オブジェクトの2つの引数をとります。これは2タプルからなるプロパティリストで、最初のタプル要素はその関連データを識別する原子です。例えば、ハンドラはlists:keyfind/3を用いRequest引数にmethodタプルを見つけることによって呼び出されるHTTPメソッドを決定することができる:上記の例について

{method, Method} = lists:keyfind(method, 1, Request), 

Method'GET'(原子)の値を有するであろう。このように発見することができ、要求の他の特性は以下のとおりです。要求 におけるHTTPヘッダのリストについては、クライアントのHTTPバージョン

  • headersため、要求されたリソース
  • versionため

    • uri

      あなたが提供するハンドラ関数は、単純なものでも複雑なものでもかまいません。

      :バック我々が生み出しswsプロセスにstopメッセージを送るErlangのシェルでは、それはswsキャッチに、あなたのハンドラが例外を失敗し、原因となる場合がありますし、Webサーバーを停止するにはHTTPステータスコードに500

      を返します。

      3> Sws ! stop. 
      stop 
      =ERROR REPORT==== 19-Jul-2017::11:17:05 === 
      Error in process <0.77.0> with exit value: 
      {{badmatch,{error,closed}},[{sws,accept,2,[{file,"sws.erl"},{line,28}]}]} 
      

      無視することができ、ここで示されたエラー、原因swsは常にgen_tcp:accept/1が—はライン28を参照成功したことを想定しているという事実に単純です:

      {ok, S} = gen_tcp:accept(LS), 
      

      代わりにこれをcaseの式にして、エラーを処理するのは簡単です。

      swsは、デモンストレーションと学習を目的としているため、HTTP 1.0のみをサポートし、接続ごとに1つの要求しか処理しないため、意図的に効率的ではありません。

  • 関連する問題