最近我经历了一篇文章,解释了YAWS服务器的潜力和每秒处理的请求数.有人提到YAWS每秒可以处理80K请求,并且它还可以在多线程环境中运行,以提高请求处理限制.
我们如何比较IIS,Apache和YAWS?哪一个会处理最大请求?我可以在某处找到任何比较吗?
我希望每次新客户端使用其Web服务器时都知道YAWS中正在执行哪些代码...
首先,我尝试了解YAWS如何处理并发用户...并查看以下.yaws页面:
io:format("~nProcess Identifier: ~p Port: ~p Client: ~p YAWS pid: ~p ~n",[self(), A#arg.clisock, A#arg.client_ip_port, A#arg.pid]).
Run Code Online (Sandbox Code Playgroud)
应该返回每个客户端的Pid,端口和IP ...我在同一个浏览器(Firefox)上打开了这个页面并打开了两个不同的标签...这是打印的:
Process Identifier: <0.65.0> Port: #Port<0.1211> Client: {{127,0,0,1},60451} YAWS pid: <0.65.0>
Process Identifier: <0.65.0> Port: #Port<0.1211> Client: {{127,0,0,1},60451} YAWS pid: <0.65.0>
Run Code Online (Sandbox Code Playgroud)
由于某种原因,返回相同的端口和pid(因此,YAWS不为每个客户端创建新端口或新pid).
当我在Chrome上试用这个时,会打印出来:
Process Identifier: <0.71.0> Port: #Port<0.2998> Client: {{127,0,0,1},60543} YAWS pid: <0.71.0>
Process Identifier: <0.71.0> Port: #Port<0.2998> Client: {{127,0,0,1},60543} YAWS pid: <0.71.0>
Run Code Online (Sandbox Code Playgroud)
因此,为什么YAWS不为同一浏览器上的每个标签打开一个新端口或pid?另外,回到原来的问题,YAWS在哪里和哪个代码产生新的PID或打开一个新的端口?
谢谢
我下载了Yaws 1.98,但在执行时./configure && make
如果失败并显示以下消息:
gcc -c -g -O2 -I/usr/include/security -m64 -I/usr/include/pam -DHAVE_SENDFILE -I"/usr/local/lib/erlang/usr/include" -I/usr/include/pam/ epam.c
epam.c:2:10: fatal error: 'pam_appl.h' file not found
#include <pam_appl.h>
^
1 error generated.
make[1]: *** [epam.o] Error 1
make: *** [all] Error 1
Run Code Online (Sandbox Code Playgroud)
关于如何解决这个问题的任何建议?有没有其他方法可以在Mac OS X 10.9上运行最新版本的Yaws?
是的,主观的问题.但是这里有很多这样的问题得到了很好的答案.所以现在我必须尝试使用Erlang开发一些REST API,因为我从google获得了我必须安装一些网络服务器,例如Cowboy,Webmachine,Yaws,Mociweb.但是我能找到的所有信息都太旧了,似乎不是真实的.那么服务器仍在继续开发,我该如何为我选择?我这样错了吗?
我在Yaws 2.0上测试脚本upload2.yaws但是没有用.这个剧本是为Yaws 1.57开发的.
雅司的日志是:
POST /html/upload2.yaws HTTP/1.1
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Host: 192.168.26.10
Referer: http://192.168.26.10/html/upload2.yaws
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36
Cookie: gsScrollPos=0; gsScrollPos=0
Content-Length: 1587
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary5zKIyUtdiK82R4de
Accept-Language: pt,en-US;q=0.8,en;q=0.6,pt-BR;q=0.4
Accept-Encoding: gzip, deflate
Https: 1
Origin: http://192.168.26.10
Cache-Control: max-age=0
upload.yaws:multipart/3 State=filename=undefined rlist=undefined data=undefined
upload.yaws:multipart/3 result
upload.yaws:process_part/4d State=filename=undefined rlist=undefined data=undefined
upload.yaws:multipart/3 done
upload.yaws:result_ehtml/3 error Reason=Error: filename not found in header.
Worker: <0.78.0>
[2015-07-24 13:50:54.795] ===== SRV -> CLI =====
HTTP/1.1 200 OK
Server: …
Run Code Online (Sandbox Code Playgroud) 如何在不包含延伸的情况下访问yaws文件?说,
www.domain.com/listen.yaws => www.domain.com/listen
我从yaws
documentation/appmod中找不到任何具体的文档.
我认为这个问题最终得到澄清!
我有一个.yaws文件,它调用我写setup/0
的authenticate
模块中的函数,我把它放在ebin
目录中.当我authenticate:setup/0
从Erlang shell 调用时,它创建一个表就好了,但是当我在浏览器中加载something.yaws时,调用该authenticate:setup/0
函数,它返回{aborted,{bad_type,users,disc_copies,nonode@nohost}}
(something.yaws只返回authenticate:setup/0
嵌入在html中的返回值以进行调试) .
这是setup/0
功能:
setup() ->
mnesia:create_schema([node()]),
mnesia:start(),
mnesia:create_table(users, [{type, set}, {record_name, user}, {disc_copies, [node()]}, {attributes, record_info(fields, user)}]).
Run Code Online (Sandbox Code Playgroud)
这是user
记录:
-record(user, {username, hashed_pw, salt}).
Run Code Online (Sandbox Code Playgroud)
(我已经尝试在浏览器中尝试之后从Erlang shell调用它,因此无法干扰它.)
如果我跑yaws --mnesiadir /usr/local/lib/yaws-appmods/mnesia/
,我得到
Erlang/OTP 19 [erts-8.1] [source] [64-bit] [smp:8:8] [async-threads:10] [kernel-poll:true]
Eshell V8.1 (abort with ^G)
1>
=INFO REPORT==== 7-Nov-2016::00:04:49 ===
Yaws: Using config file /etc/yaws/yaws.conf
=INFO REPORT==== 7-Nov-2016::00:04:49 ===
Yaws: Using global subconfig …
Run Code Online (Sandbox Code Playgroud) 我在生产环境中的应用程序中嵌入了YAWS,并使用该函数yaws:start_embedded/4
启动YAWS.
以下是我的代码:
Id = "my_server",
GconfList = [{logdir, "./log"}, {id, Id}],
SconfList = [{docroot, Docroot},
{port, Port},
{listen, Listen},
{appmods, [
{"/rest", mod_rest, []},
{"/file", mod_file, []}
]}
],
yaws:start_embedded(Docroot, SconfList, GconfList, Id).
Run Code Online (Sandbox Code Playgroud)
我想添加另一个appmod,例如: {"/upload", mod_upload, []}
是否可以在运行时添加appmod而无需重新启动YAWS?
我目前正在尝试使用YAWS了解并查找网页案例研究.除了源代码附带的默认代码之外,任何人都知道我能找到的任何样本页面吗?
谢谢,
某些Tuples
在Erlang中操作的函数会在操作后生成新元组的副本.在大多数情况下,程序不再对创建新元组的旧元组副本感兴趣.让我们看一个例子:
change(Position,Tuple1,NewValue) when size(Tuple1) > 10,Position < 10 -> NewTuple = erlang:setelement(Position, Tuple1, NewValue), %% at this point i don't want Tuple1 %% I want to destroy Tuple1 at this point ! %% how do i do it erlang:send(myprocess,NewTuple), ok.
在上面的示例中,我从现有元组创建一个新元组.如果我随后要这样做,我会想要破坏我自己的旧副本.我有一种感觉,编译器/运行时系统会自动执行此操作,但如果是这样,他们就不会给我们提供如下功能:erlang:garbage_collect/0
.我们肯定他们意识到我们可能需要隐式地管理我们的内存,可能它会使程序免于崩溃并找到通过代码的内存密集部分的方式.
我明白,在它中erlang shell
,它可能会让它忘记一个变量(假设他们的意思是破坏变量)使用f/0, f/1
.但是,似乎我不能在我的模块/功能中使用它.我还怀疑在变量名称前面放置一个下划线可能会加速运行时系统的破坏,即在我的代码中写入的一些内容:_Tuple1
to destroy Tuple1
.总之,问题是,如果我随后将从现有的元组创建元组,并且在每一步我想立即销毁旧副本(我自己),我该怎么做? *注意*我明白效率指南禁止这个,但是,如果我别无选择.....
伙计们帮忙,你的解决方案是什么?谢谢
我有一个小的yaws appmod测试:
-module(webservice).
-include("../include/yaws_api.hrl").
-compile(export_all).
http(parse_query,Arg) ->
yaws_api:parse_query(Arg);
out(Arg) ->
{html, [http(parse_query,Arg)]}.
Run Code Online (Sandbox Code Playgroud)
当yaws_api:parse_query函数运行时,我从yaws交互模式获得以下ERROR REPORT:
Yaws process died: {function_clause,
[{yaws_server,binary_size,
[0,{"i",undefined}],
[{file,"yaws_server.erl"},{line,3015}]},
{yaws_server,binary_size,2,
[{file,"yaws_server.erl"},{line,3018}]},
{yaws_server,binary_size,2,
[{file,"yaws_server.erl"},{line,3018}]},
{yaws_server,deflate_accumulated,4,
[{file,"yaws_server.erl"},{line,3712}]},
{yaws_server,deliver_accumulated,4,
[{file,"yaws_server.erl"},{line,3666}]},
{yaws_server,finish_up_dyn_file,2,
[{file,"yaws_server.erl"},{line,2745}]},
{yaws_server,aloop,4,
[{file,"yaws_server.erl"},{line,1175}]},
{yaws_server,acceptor0,2,
[{file,"yaws_server.erl"},{line,1016}]}]}
Run Code Online (Sandbox Code Playgroud)
appmod在config中设置:
<server localhost>
port = 8080
listen = 127.0.0.1
#docroot = /usr/share/yaws
docroot = /usr/lib/yaws/www
appmods = </,webservice>
# dir_listings = true
</server>
Run Code Online (Sandbox Code Playgroud)