如何在端口80上运行Node.js?


72

我的目标是在端口80上运行Node.js。这是因为我发现node.js被某些网络阻止,这些网络不允许来自任何其他端口的流量。

看来最好的方法是通过Node.js代理Apache。我尝试使用node-http-proxy来做到这一点,但是我没有任何运气。

我正在使用的代码在这里:

var util = require('util'),
    http = require('http'),
    httpProxy = require('http-proxy');

httpProxy.createServer(9000, 'localhost').listen(80);

http.createServer(function (req, res) {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.write('request successfully proxied to: ' + req.url + '\n' + JSON.stringify(req.headers, true, 2));
  res.end();
}).listen(9000);

但是我一直收到端口80的错误消息“使用中的地址”。我一定做错了。

如何使用node-http-proxy通过node.js代理Apache?这将使我能够在端口80上运行node.js吗?并且node-http-proxy是实现此目标的最佳方法吗?

谢谢。

Answers:


30

您需要做的是为正在运行的服务器设置2 ip。Apache将1个IP绑定到端口80,然后node.js将另一个IP绑定到端口80。

使用节点及其监听指令具有2个值,例如。.listen(80,NODEJS_IP或DNS NAME);

其他一些建议。

我不会将Apache与nodejs一起使用,因为这不会发生。因此,实际上不建议这样做。我实际上会考虑使用NGINX作为与Node更好的配对。


@PaulM。谢谢。如何将辅助IP绑定到端口80和node.js而不是Apache?
套件

与您的dns一样,www.domain.com代表1个IP,chat.domain.com代表另一个IP。在apache中收听第一个IP地址:收听vvv.xxx.yyy.zzz:80。然后使用节点执行.listen(80,chat.domain.com)。这是设置,我使用,我曾与任何企业防火墙等没有问题
PaulM

1
我不建议将nginx用于节点。Nginx不支持HTTP 1.1,这意味着您将无法做一些WebSocket的工作。当您使用node.js时,我想您会非常快地使用它;)
Van Coding

2
@FlashFan,我可以在我的网站上使用Chrome来完成WebSocket的工作。您能否进一步阐述?
PaulM 2011年

@PaulM-我在尝试将Apache绑定到特定IP时遇到麻烦。我在这里有问题:serverfault.com/questions/273143 / ...当您这样做时,您有任何问题吗?
Kit

117

在8080或更高端口上运行您的应用

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

如果您没有使用ngnix或apache


2
知道如何撤消此操作也将有所帮助。我认为“-移植80”不是完美的解决方案。它仍然必须处理此绑定。
Lilian A. Moraru

5
就像这样,Nginx被淘汰了。

13
要撤消此操作:sudo iptables -D PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080(基本上将-A更改为-D。仅此
而已

如何在此处设置特定的IP?
jonathancardoso 2015年

@fullstacklife如果我也在旁边使用apache怎么办?
Faizan

44

最简单的解决方案:安全地配置节点应用程序以在端口80上运行

  • sudo apt-get install libcap2-bin
  • sudo setcap cap_net_bind_service=+ep /path/to/node
  • da!你完成了。

我为什么喜欢它?

  • 您不必使用apache或nginx
  • 您不必以超级用户身份运行应用程序
  • 您无需转发端口(每次计算机启动时都可以处理)

参考链接:https : //www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps(一篇很棒的文章有关如何在云托管上设置节点应用程序的信息)。


荣誉不仅提供了最优雅的解决方案,而且还提供了合法的参考链接。
Gor 2015年

这正是我所需要的。我花了一会抓我的头,试图找出为什么我可以启动我的快递HTTP服务器节点的每个端口上,除了80
尼克

优秀的!如果他升级了Node(例如,使用nvm),则只需要记住再次执行此操作即可。
杰克逊

这对于节点以外的其他平台也很有用。
查尔斯伍德

它对我没有用。我做了sudo setcap cap_net_bind_service = + ep / usr / bin / nodejs(对于Mac)。当我执行netstat -tlpn时,它仍在端口80上显示apache2,在8000上显示nodejs。我在做什么错?
codeinprogress

19

当前不建议在端口80上运行节点,因为这需要以root身份运行节点。

您对Apache有多重视?通过nginx代理节点是一种久经考验的解决方案,它具有如下nginx-config:

upstream node_cluster {
    ip_hash;   
    server 127.0.0.1:8000;
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
}

server {
    listen 0.0.0.0:80;
    server_name foo;
    access_log /var/log/nginx/foo.log;

    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;

      proxy_pass http://node_cluster/;
      proxy_redirect off;
    }
}

Nginx文档:

http://wiki.nginx.org/HttpProxyModule

http://wiki.nginx.org/HttpUpstreamModule


4
很多人在端口80上运行节点。通过nginx进行代理需要一些开销。另外,您也不需要root用户即可在端口80上运行。有关更多信息,请参见此处:comment.gmane.org/gmane.comp.lang.javascript.nodejs/8959 我自己不是通过root用户运行node的。
PaulM 2011年

谢谢Waquo。我正在查看我的自动取款机。Nginx可能是前进的方向。
套件

查看dryprogrammers答案,了解如何在没有root权限的端口80上运行Node。

这个答案让我觉得我可以在同一服务器和IP上为节点和php应用程序提供服务,并为每个应用程序使用不同的端口,但是我不太熟悉nginx确保它确实可行...
Loupax

8

你的代码看起来像在你创建从一个80端口的基于节点的代理端口9000,然后在端口9000建立一个基于节点的HTTP服务器示例代码(即Node:80 -> Node:9000

启动Node时会得到“使用中的地址”,因为Apache已经在使用端口80。如果要使用Apache进行代理,则必须在其他端口(例如9000)上使用Node,并让Apache监听端口80并转发在端口9000上对Node的请求。(即Apache:80 -> Node:9000

看起来您正在使用的库是相反的操作:使用Node作为代理并将请求转发到Apache。在这种情况下,您必须将Apache配置为在端口80以外的其他端口上运行。Node:80 -> Apache:9000

您想做Node:80 -> Apache:9000还是Apache:9000 -> Node:80到底?

注释后编辑:如果您想这样做Apache:80 -> Node:9000,则可以mod_proxy在Apache上使用并使用ProxyPass/ProxyPassReverse指令,例如

ProxyPass /nodeurls/ http://localhost:9000/
ProxyPassReverse /nodeurls/ http://localhost:9000/  

nodeurls您希望Apache转发到Node的URL家族在哪里?


谢谢。我不太确定。抱歉! 我希望节点在apache:80上运行。因此,节点:9000-> Apache:80。不太确定这是否正确。
套件

如果要在端口80上运行Apache,则必须在另一个端口(例如端口9000)上运行Node。在这种情况下,必须将Apache配置为将其某些请求转发到Node。我写这篇文章是Apache:80 -> Node:9000为了继续上面的内容。
nicolaskruchten

喔好吧。我懂了。如何使Apache将其一些请求转发到Node?
套件

查看我的编辑,您必须安装模块并进行配置。
nicolaskruchten

1
我认为您的意思Apache:80 -> Node:9000不是Node:80 -> Node:9000第一行。
Pratik Khadloya 2012年


0

如果您是非root用户,则不能使用低于1024的端口(在Unix系统中)运行或绑定。要允许非root用户可以在低于1024的端口上运行节点,请使用此命令。

$ sudo setcap 'cap_net_bind_service=+ep' $(which node)

-5

如果您只是在开发环境模式下

你可以su root,然后

node index.js 要么 ./node_modules/coffee-script/bin/coffee index.coffee


3
我不是网络管理员,但是出于安全考虑,我强烈建议不要以root特权运行服务器。
尼克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.