2017-07-18 59 views
1

使Web服务器我是新使用Erlang如何使用Erlang的

我尽量让使用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文件,不知道怎么写了后端到这一点。

如果你小子有一些例子或文档分享请我

回答

5

有一些有用的Erlang工具,如CowboyMochiwebChicagobossYAWS对网络协议的工作。

+0

泰。我有一个问题:Erlang可以取代php吗? 听说二郎可以支持只为一千访问。就是这种权利畅想访问和PHP? –

+2

比较Erlang(Toolbox)和PHP(扳手)是错误的。 – Pouriya

+0

ty回答我的问题。真的帮我 –

2

您可能会发现通过sws,我的Erlang simple web server工作很有指导意义。它演示了如何处理连接,从套接字读取HTTP请求,并使用Erlang的内置套接字支持和HTTP支持发送回复。

Web服务器的工作原理是接受传入连接并解析使用传入的请求Erlang的内置的HTTP请求支援解析—见行29:

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

{packet, http_bin} socket option告诉二郎尝试解析传入套接字数据HTTP。在线路36上的serve/3功能,用于流控制和背压的目的,我们保持插座中{active, once}模式,这也意味着sws从二郎接收传入的数据作为消息—见线37-41:

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

serve/3函数是递归的,接收HTTP请求数据直到我们得到完整的请求或错误。一旦serve/3有一个完整的请求,它将它传递给一个处理程序函数,当您拨打sws:start/1,2时,预计会提供该函数。该处理程序应该返回一个3状态的HTTP状态,HTTP回复标题和HTTP回复主体,根据返回状态,标题或正文可以为空。

例如,这里有一个简单的“Hello,World!”应用一个Erlang shell中运行:

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

在这里,作为一个处理器通过fun总是返回HTTP状态200,无应答头,以及用于身体回复一串二进制文件。在Unix外壳访问通过卷曲服务器显示了预期的答复:

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

如果我们经过-v卷曲表现出更多的细节,我们可以看到:

$ 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元组,其中所述第一元组元素是原子识别其相关的数据的属性列表。例如,该处理程序可以通过在使用lists:keyfind/3Request参数找到method元组确定所调用的HTTP方法:

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

对于上面的例子,Method将具有'GET'(原子)的值。可以发现这样的要求的其他特性是:

  • uri请求的资源
  • version客户端的HTTP版本
  • headers的HTTP标头的请求
列表如你所愿

您提供的处理函数可以简单或复杂。请注意,如果您的处理程序失败,导致异常,sws捕获它并返回HTTP状态码500

要停止Web服务器,早在Erlang的外壳我们发送一个stop消息到生成sws过程:

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,并且每个连接只处理一个请求。

相关问题