即使没有其他进程阻塞端口,Node.js应用程序也不能在端口80上运行

我在安装了Node.js的Amazon EC2上运行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) 

现在,当我检查是否有一个进程(作为root的情况下隐藏的任何东西)听80端口使用:

 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中被阻止? 我应该采取哪些步骤来使代码正确运行?

错误代码EACCES意味着您没有适当的权限来在该端口上运行应用程序。 在Linux系统上,低于1024的任何端口都需要root权限。

而不是在端口80上运行,您可以使用端口80redirect到您的应用程序的端口(> 1024)

 iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000 

如果您的应用程序在端口3000上运行,这将工作。

简而言之,您可以使用以下方式允许节点访问该端口:

setcap 'cap_net_bind_service=+ep' /path/to/nodejs

很长的答案

请注意,如果您正在运行apache ,则可以在虚拟主机上创build一个反向代理。 如果您的节点在端口8080上运行:

 <VirtualHost 127.0.0.1:80> ServerName myLocalServer ProxyPass / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/ </VirtualHost> 

当然,添加服务器到/etc/hosts

 127.0.0.1 myLocalServer 

你将需要启用相关的apache模块:

 sudo a2enmod proxy_html sudo a2enmod proxy_http sudo a2enmod proxy_connect sudo a2enmod proxy_ajp sudo service apache2 restart 

…现在你可以连接到http://myLocalServer