我正在亚马逊EC2上运行一个安装了Node.js的Debian实例。如果我运行以下代码:
http = require('http');
http.createServer(function (request, response){
response.writeHead(200, {'Content-Type':'text/plain'});
response.end('Hello World\n');
}).listen(80);
console.log("Running server at port 80");
我得到下面的输出,它告诉我在端口80上有另一个进程在监听:
Running server at port 80
events.js:72
throw er; // Unhandled 'error' event
^
Error: listen EACCES
at errnoException (net.js:901:11)
at Server._listen2 (net.js:1020:19)
at listen (net.js:1061:10)
at Server.listen (net.js:1127:5)
at Object.<anonymous> (/home/admin/nodetests/nodetest.js:6:4)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
现在,当我使用以下命令检查是否有一个进程在端口80上监听时(以root身份进行监听,以防有任何隐藏):
netstat -tupln
我得到了下面的输出,它告诉我在端口80上没有任何监听:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1667/sshd
tcp6 0 0 :::22 :::* LISTEN 1667/sshd
我应该注意到,debian将端口80作为入站规则打开,如果这有区别的话。
我的问题是:我做错了什么?为什么我不能识别监听端口80的进程?为什么它在Debian中被阻止了?我应该采取哪些步骤来让代码正确运行?
发布于 2013-09-23 02:53:48
错误代码EACCES
表示您没有在该端口上运行应用程序的适当权限。在Linux系统上,1024以下的任何端口都需要root访问权限。
发布于 2013-09-23 06:48:01
您可以使用以下命令将端口80重定向到应用程序的端口(>1024),而不是在端口80上运行
iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000
如果您的应用程序在端口3000上运行,这将会起作用。
发布于 2014-11-24 09:22:10
简而言之:您可以使用以下命令允许节点访问该端口:
setcap 'cap_net_bind_service=+ep' /path/to/nodejs
编辑:
https://stackoverflow.com/questions/18947356
复制相似问题