【问题标题】:cannot run node.js webservice on port 80 or 443无法在端口 80 或 443 上运行 node.js webservice
【发布时间】:2014-08-16 18:39:03
【问题描述】:

我有一个运行 CENTOS 的 VPS,我正在试验 Node.js。 我运行了一个在各种端口上正确运行的示例 node.js 服务器,但是每当我尝试在端口 80 上运行节点时(443 的错误相同),我都会收到以下错误:

root@mic [~/Projects/NodeTutorial2]# node index.js
Server running on port 80.

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: listen EADDRINUSE
    at errnoException (net.js:883:11)
    at Server._listen2 (net.js:1021:14)
    at listen (net.js:1043:10)
    at Server.listen (net.js:1109:5)
    at Object.<anonymous> (/root/Projects/NodeTutorial2/index.js:8: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 重定向到 3000:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000

显然我执行了这个命令两次,因为: 当我做了一个:sudo iptables -t nat -L,它返回:

root@mic [~]# sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
REDIRECT   tcp  --  anywhere             anywhere            tcp dpt:http redir ports 3000
REDIRECT   tcp  --  anywhere             anywhere            tcp dpt:http redir ports 3000

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

但无济于事,我仍然得到同样的错误。

我尝试使用 netstat -tulpn | 查看端口 80 上正在运行什么。 grep:80 命令并返回:

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      477/httpd
tcp        0      0 :::80                       :::*                        LISTEN      477/httpd

所以我杀死了在端口 80 上运行的进程,并立即启动了我的 VPS。

我应该在哪些端口上运行我的 node.js 网络服务?

根据我的腻子设置,我正在访问的端口是端口 22,所以我不明白那里发生了什么。 此外,我不打算以 root 身份运行我的 web 服务。 我创建了另一个权限较少的用户来运行 node.js 网络服务。

【问题讨论】:

  • Apache 或某些网络服务器在 80(可能是 443)上运行。
  • 是的,但是我杀死了端口 80,它立即将我从腻子连接中引导了出去。也许我应该尝试杀死 443 看看会发生什么。
  • httpd 和 sshd 是完全不同的东西(如您所述,端口 22 与端口 80/443)。你应该记录你实际上做了什么来“杀死” httpd 以被启动。
  • 我的意思是我杀死了在端口 80 上运行的进程。
  • 我刚刚注意到 apache 正在运行。我认为我可以而且应该停止 apache,因为我希望将此 VPS 主要用于 Node.JS。

标签: linux node.js web-services centos port


【解决方案1】:
  1. 设置 nodejs 使用 8000 端口
  2. 安装 nginx 并将其设置为您的 nodejs 应用程序的反向代理。

不要使用 Apache,它会为每个请求创建一个线程/进程,而 nginx 不会。它的工作原理类似于 nodejs 事件循环,您有一个需要处理的请求队列,nginx 工作进程从队列中获取每个请求并处理它 - 在您的情况下,向 nodejs 服务器发送请求,然后等待响应。

永远不要在端口 80 上使用 nodejs,有太多的用例需要处理,没有必要重新发明轮子

【讨论】:

    猜你喜欢
    • 2018-09-17
    • 2011-08-31
    • 2012-02-12
    • 2013-10-02
    • 2021-06-05
    • 2019-03-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多