nodejs能够监听80端口吗?
发布于 12 年前 作者 shuizhongyueming 44337 次浏览 最后一次编辑是 8 年前

我是一个刚刚接触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之后就可以成功运行了。 想请问一下各位大侠,这是为什么

19 回复

端口被占用或者是没有权限吧 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

@shuizhongyueming Linux 下监听 < 1024 的端口要 root 权限, 应该是了

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

好吧,俺也是现学现卖……

转发的话,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 谢谢~又学到新知识了~

回到顶部