1

我正在尝试让 Yaws Web 服务器在云服务(亚马逊 AWS)上运行。我已经在服务器上编译并安装了一个本地副本。我的问题是在端口 8000 或端口 80 上运行时,我无法让 Yaws 运行。

我在 yaws.conf 中有以下配置:

   port = 8000
   listen = 0.0.0.0
   docroot = /home/ubuntu/yaws/www/test
   dir_listings = true

这会产生以下成功的启动/结果:

Eshell V5.8.5(使用 ^G 中止)

=INFO REPORT==== 16-Sep-2012::17:21:06 === Yaws:使用配置文件 /home/ubuntu/yaws.conf

=信息报告==== 16-Sep-2012::17:21:06 === Ctlfile : /home/ubuntu/.yaws/yaws/default/CTL

=INFO REPORT==== 16-Sep-2012::17:21:06 === Yaws:收听 <3> 虚拟服务器的 0.0.0.0:8000:- http://domU-12-31-39 -0B-1A-F6:8000 下 /home/ubuntu/yaws/www/trial -

=INFO REPORT==== 16-Sep-2012::17:21:06 === Yaws:收听 <1> 虚拟服务器的 0.0.0.0:4443:-

当我尝试访问 url (http://ec2-72-44-47-235.compute-1.amazonaws.com) 时,它永远不会连接。我尝试使用 paping 检查端口 80 或 8000 是否打开(http://code.google.com/p/paping/)并且我收到“无法解析主机”错误,所以显然不是在职的。

我还尝试将 yaws.conf 设置为端口 80,如下所示:

   port = 8000
   listen = 0.0.0.0
   docroot = /home/ubuntu/yaws/www/test
   dir_listings = true

我收到以下错误:

=错误报告==== 2012 年 9 月 16 日::17:24:47 === Yaws: 无法收听 0.0.0.0:80 : {error,eacces}

=错误报告==== 2012 年 9 月 16 日::17:24:47 === 无法监听套接字:{error,eacces} =错误报告==== 2012 年 9 月 16 日::17: 24:47 === Top proc 死亡,终止 gserv =ERROR REPORT==== 16-Sep-2012::17:24:47 === Top proc 死亡,终止 gserv =INFO REPORT==== 16-Sep -2012::17:24:47 === application: yaws exited: {shutdown,{yaws_app,start,[normal,[]]}} 类型:永久 {"Kernel pid terminate",application_controller," {application_start_failure,yaws ,>>>>>>{关机,>{yaws_app,start,[正常,[]]}}}"}

我还使用 iptables 打开了 80 端口。运行 sudo iptables -L 给出以下输出:

Chain INPUT (policy ACCEPT) target prot opt source destination
ACCEPT tcp -- ip-192-168-2-0.ec2.internal ip-192-168-2-16.ec2.internal tcp dpt:http ACCEPT tcp -- 0.0 .0.0 任何地方 tcp dpt:http 接受所有 -- 任何地方 ctstate RELATED,ESTABLISHED 接受 tcp -- 任何地方 tcp dpt:http 接受 tcp -- 任何地方 tcp dpt:http

Chain FORWARD (policy ACCEPT) target prot opt source destination

Chain OUTPUT (policy ACCEPT) target prot opt source destination

谢谢你的耐心

4

6 回答 6

3

实际上,我通过这个论坛帖子 (http://www.trapexit.org/forum/viewtopic.php?p=42923) 找到了为什么我无法让它工作的答案。

它指出:

2a. I run yaws on 8080 and have nginx reverse proxying 
from http://mydomain:80 to 8080. Yaws won't run as a 
low-privilege user if you want it to listen on port 
80.

2b. nginx.conf needs the following directives: 
server { 
listen 80; 
server_name yourdomain.com; 
access_log /path/to/access/log.log 
location / { 
proxy_pass http://127.0.0.1:8080; 
proxy_redirect default; 
} 
} 

基本上,我安装了 nginx,并将其配置为作为代理服务器运行。

为了让 Chicago Boss 框架运行,我使用了相同的解决方案,唯一的区别是我将 nginx proxy_pass 设置为 >http://127.0.0:8001,因为 Chicago Boss 默认在 8001 上运行。如果有人使用 nginx 作为代理服务器,任何人都知道这如何影响 erlang 服务器的并发优势,或者它没有任何影响?

于 2012-09-22T21:14:05.723 回答
1

您粘贴的错误报告之一显示了您无法在端口 80 上启动服务器的原因:权限({error, eaccess})。

=ERROR REPORT==== 16-Sep-2012::17:24:47
=== Yaws: Failed to listen 0.0.0.0:80 : {error,eacces}

关于在端口 8000 上启动,您是否尝试通过 SSH 连接到机器并在本地连接到服务器(例如通过 telnet)?如果这可行,那么您的问题一定与其他人建议的那样,与未打开端口 8000 的 Ubuntu 防火墙或您的 EC2 实例的安全组不包含允许该端口上的入站流量的路由有关。

也就是说,这个问题可能应该转移到ServerFaultAskUbuntu

于 2012-09-17T07:37:54.460 回答
1

有两件事要寻找:

  • 检查您的实例的安全组设置,并确保端口 80 或 8000 已打开(可从 访问0.0.0.0/32)。
  • 尝试将您的服务器绑定到机器的内部 IP 地址。有些服务器需要监听这个接口而不是0.0.0.0.你可以在控制台或使用ifconfig
于 2012-09-17T07:47:53.330 回答
1

值得注意的是交互式命令行需要root权限:

sudo su
yaws -i --id whatever

如果 yaws 守护程序同时运行,您还必须指定一个 ID。

于 2012-10-27T16:37:36.130 回答
1

http://hyber.org/privbind.yaws

绑定到特权端口

在 UN*X 操作系统上发现的一个常见错误功能是只有 root 可以绑定到低于 1024 的端口的限制。很多钱都浪费在了变通方法上,而且 - 通常 - 结果是安全漏洞。

$ setcap 'cap_net_bind_service=+ep' /usr/lib/erlang/erts-5.7.4/bin/beam
于 2013-06-17T12:56:37.383 回答
0

@Bernard 是正确的,EC2 实例有防火墙保护它。您需要为实例修改EC2 安全组(您可以在管理控制台 Web 界面的左侧找到它)以允许入站 TCP 流量到您要使用的端口。对于端口 80,您可以HTTP从组合框中进行选择。对于端口 8080,选择Custom TCP Rule并输入端口号。

于 2012-09-16T20:07:21.833 回答