我认为我的远程实例上的端口 80 已被阻止,并且我正尝试使用端口 80 运行 node.js 应用程序。我已经尝试了端口 3000 和 3002,两个端口都运行良好,但在端口 80 上运行时出现错误。从netstat -an
下面的输出来看,我怀疑端口 80 已被阻止,但是如何才能找到下面阻止端口 80 的地址的进程 ID?
[lucas@ecoinstance]~/node/nodetest1$ netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:3002 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:27017 127.0.0.1:51108 ESTABLISHED
tcp 0 0 127.0.0.1:51106 127.0.0.1:27017 ESTABLISHED
tcp 0 0 127.0.0.1:27017 127.0.0.1:51106 ESTABLISHED
tcp 0 0 127.0.0.1:51107 127.0.0.1:27017 ESTABLISHED
tcp 0 0 10.240.241.116:3002 174.61.171.61:36583 TIME_WAIT
tcp 0 0 127.0.0.1:27017 127.0.0.1:51109 ESTABLISHED
tcp 0 0 10.240.241.116:42423 169.254.169.254:80 ESTABLISHED
tcp 0 0 127.0.0.1:51108 127.0.0.1:27017 ESTABLISHED
tcp 0 532 10.240.241.116:22 174.61.171.61:56824 ESTABLISHED
tcp 0 0 127.0.0.1:27017 127.0.0.1:51107 ESTABLISHED
tcp 0 0 10.240.241.116:42412 169.254.169.254:80 ESTABLISHED
tcp 0 0 127.0.0.1:51109 127.0.0.1:27017 ESTABLISHED
tcp 0 0 127.0.0.1:51105 127.0.0.1:27017 ESTABLISHED
tcp 0 0 10.240.241.116:42422 169.254.169.254:80 TIME_WAIT
tcp 0 0 127.0.0.1:27017 127.0.0.1:51105 ESTABLISHED
tcp6 0 0 :::22 :::* LISTEN
udp 0 0 0.0.0.0:49948 0.0.0.0:*
udp 0 0 0.0.0.0:68 0.0.0.0:*
udp 0 0 10.240.241.116:123 0.0.0.0:*
udp 0 0 127.0.0.1:123 0.0.0.0:*
udp 0 0 0.0.0.0:123 0.0.0.0:*
udp6 0 0 :::12151 :::*
udp6 0 0 :::123 :::*
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 405680 /tmp/ssh-KdkxJfFLpKTC/agent.22
813
unix 2 [ ACC ] STREAM LISTENING 408230 /tmp/ssh-ofUeNNEwAqtP/agent.22
243
unix 2 [ ACC ] STREAM LISTENING 416227 /tmp/mongodb-27017.sock
unix 2 [ ACC ] SEQPACKET LISTENING 3692 /run/udev/control
unix 7 [ ] DGRAM 5286 /dev/log
unix 2 [ ACC ] STREAM LISTENING 5318 /var/run/acpid.socket
unix 2 [ ACC ] STREAM LISTENING 16170 /tmp//tmux-1000/default
unix 2 [ ACC ] STREAM LISTENING 414450 /var/run/dbus/system_bus_socke
下面是尝试使用 node.js 在端口 80 上运行的日志:
[lucas@ecoinstance]~/node/nodetest1$ npm start
> [email protected] start /home/lucas/node/nodetest1
> node ./bin/www
events.js:72
throw er; // Unhandled 'error' event
^
Error: listen EACCES
at errnoException (net.js:904:11)
at Server._listen2 (net.js:1023:19)
at listen (net.js:1064:10)
at Server.listen (net.js:1138:5)
at Function.app.listen (/home/lucas/node/nodetest1/node_modules/express/lib/applicati
on.js:532:24)
at Object.<anonymous> (/home/lucas/node/nodetest1/bin/www:7:18)
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)
npm ERR! [email protected] start: `node ./bin/www`
npm ERR! Exit status 8
npm ERR!
npm ERR! Failed at the [email protected] start script.
npm ERR! This is most likely a problem with the nodetest1 package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR! node ./bin/www
npm ERR! You can get their info via:
npm ERR! npm owner ls nodetest1
npm ERR! There is likely additional logging output above.
npm ERR! System Linux 3.13-0.bpo.1-amd64
npm ERR! command "/usr/local/bin/node" "/usr/local/bin/npm" "start"
npm ERR! cwd /home/lucas/node/nodetest1
npm ERR! node -v v0.10.28
npm ERR! npm -v 1.4.9
npm ERR! code ELIFECYCLE
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR! /home/lucas/node/nodetest1/npm-debug.log
npm ERR! not ok code 0
并且sudo netstat -lnp
不返回任何匹配的 80 端口:
[lucas@ecoinstance]~/node/nodetest1$ sudo netstat -lnp [48/648]
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Progr
am name
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 29160/mon
god
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1976/sshd
tcp6 0 0 :::22 :::* LISTEN 1976/sshd
udp 0 0 0.0.0.0:49948 0.0.0.0:* 1604/dhcl
ient
udp 0 0 0.0.0.0:68 0.0.0.0:* 1604/dhcl
ient
udp 0 0 10.240.241.116:123 0.0.0.0:* 2076/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 2076/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 2076/ntpd
udp6 0 0 :::12151 :::* 1604/dhcl
ient
udp6 0 0 :::123 :::* 2076/ntpd
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 405680 22814/ssh-agent /tmp/ssh-K
dkxJfFLpKTC/agent.22813
unix 2 [ ACC ] STREAM LISTENING 408230 24049/ssh-agent /tmp/ssh-o
fUeNNEwAqtP/agent.22243
unix 2 [ ACC ] STREAM LISTENING 416227 29160/mongod /tmp/mongo
db-27017.sock
unix 2 [ ACC ] SEQPACKET LISTENING 3692 284/udevd /run/udev/
control
unix 2 [ ACC ] STREAM LISTENING 5318 1798/acpid /var/run/a
cpid.socket
unix 2 [ ACC ] STREAM LISTENING 16170 5177/tmux /tmp//tmux
-1000/default
unix 2 [ ACC ] STREAM LISTENING 414450 28213/dbus-daemon /var/run/d
bus/system_bus_socket
unix 2 [ ACC ] STREAM LISTENING 404225 22324/1 /tmp/ssh-9
TlDmu4bjl/agent.22324
答案1
您正尝试以非 root 用户身份启动节点。Linux 默认仅允许 root 绑定到端口 1024 或以下。
如果你想以该用户身份运行它,你可能需要查看https://stackoverflow.com/questions/413807/是否有办法让非根进程绑定到特权端口 1024-on-l
答案2
我认为最简单、最好的答案是:
sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep /usr/local/bin/node
- 太棒了!这样你的节点应用程序就可以在端口 80 上运行而不会出现任何问题。
我为什么喜欢它?因为:
- 你不必使用 apache 或 nginx
- 你不必以 root 身份运行你的应用程序
- 您不必转发端口(并在每次机器启动时处理该问题)
参考链接:https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps(关于如何在云托管上设置节点应用程序的精彩文章)。
答案3
尝试netstat -lnp
以 root 身份或lsof -n -i :80
答案4
我尝试使用运行服务器node server.js
。结果没有显示任何错误。另外,
lsof -t -i:80
没有列出任何流程。
问题是我尝试以非特权用户身份进行绑定。当我尝试时,它成功了:
sudo node server.js
很简单,但是,有时你可能会忘记它,当你有多个服务器时,你将开始在其他服务器进程后面运行,例如apache、nginx 等正在您的机器上运行。(就像我一样)。希望这对某些人有帮助!!!