我是一个刚刚接触nodejs的菜鸟,今天在学着写一个程序的时候
var http = require("http");
var url = require("url");
function start(){
console.log("call the start");
function onRequest(request,response){
console.log("call the onRequest function");
response.writeHead(200,{"Content-type":"text/plain"});
response.write("aa");
response.end();
}
http.createServer(onRequest).listen(80);
console.log("Server has started.");
}
exports.start = start;
发现会控制台会报错
call the start
Server has started.
events.js:66
throw arguments[1]; // Unhandled 'error' event
^
Error: listen EACCES
at errnoException (net.js:768:11)
at Server._listen2 (net.js:891:19)
at listen (net.js:935:10)
at Server.listen (net.js:984:5)
at Object.start (/home/xing/ANodeJsWebSite/node/server.js:11:31)
at Object.<anonymous> (/home/xing/ANodeJsWebSite/node/index.js:2:8)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
而把listen的端口改成8888之后就可以成功运行了。 想请问一下各位大侠,这是为什么
端口被占用或者是没有权限吧 EACCES应该是没有权限 Non-privileged user (not root) can’t open a listening socket on ports below 1024.
端口冲突吧,查看下你的80端口有没有在使用
Non-privileged user (not root) can’t open a listening socket on ports below 1024.
看到这个没权限,我试着使用sudo node index.js,然后成功运行了。这是不是说明针对80端口的监听只能是root,而其他一些非重要到端口就可以随便监听了?
冲突应该是EADDINUSE
E ACCES E ADD IN USE
Ubuntu的,没有装Apache,应该没冲突。后面使用sudo之后就可以,感觉应该是权限问题
用命令查查你的端口吧!
没有权限,我的nodeclipse插件正在纠结这个问题
首先,非root用户不能监听<1024的端口,这个是内核代码里写着的。 其次,不应该用root用户运行你的程序,这样会有安全问题。 尼玛啊,那怎么办?答案是用iptables:
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000
sudo iptables-save
好吧,俺也是现学现卖……
Good!
转发的话,ngnix啊,apache啊也是可以的…
只是学习没必要用80端口,就是正式使用也可以使用ngnix做转发啊
俺本来也想过来现卖一下,发现有人卖。。
可以监听80端口
普通用户只能监听1024以上的,root用户可以监听80端口
1024以下的端口都需要sudo权限运行
linux平台的非root用户要让node运行在80端口下,可以这样:
sudo setcap CAP_NET_BIND_SERVICE+ep /usr/local/bin/node
然后用普通用户试试, 注意这要linux内核在2.2后的系统,更多详细的解释可以 man capabilities.
@imzshh 内核默认是限制的,但可以改变capabilities来达到非root用户也能监控小于1024端口的目的。
@virteman 谢谢~又学到新知识了~