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

发布于 2024-11-09 23:30:21 字数 801 浏览 0 评论 0 原文

我的目标是在端口 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 是实现这一目标的最佳方法吗?

谢谢。

My aim is to run Node.js on port 80. This is because I am finding node.js is being blocked from certain networks which do not allow traffic from any other port.

It appears that the best way to do this is by proxying Apache through Node.js. I have tried using node-http-proxy to do this but I have not had any luck.

The code I am using is here:

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);

But I keep getting the error "Address in use" for port 80. I must be doing something wrong.

How do I proxy Apache through node.js using node-http-proxy? Will this enable me to run node.js on port 80? And is node-http-proxy the best way to achieve this?

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

揪着可爱 2024-11-16 23:30:21

则在高端口 8080 或其他端口上运行您的应用程序

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

如果您不使用 ngnix 或 apache,

run your app on a high port 8080 or whatev then

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

If you are not using ngnix or apache

旧人哭 2024-11-16 23:30:21

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

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

为什么我喜欢它?

  • 您不必使用 apache 或 nginx
  • 您不必以 root 身份运行应用程序
  • 您不必转发端口(并在每次计算机启动时处理该端口)

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

The simplest solution: safely configure your node app to run on port 80.

  • sudo apt-get install libcap2-bin
  • sudo setcap cap_net_bind_service=+ep /path/to/node
  • Ta da! You're done.

Why do I like it?

  • You don't have to use apache or nginx
  • You don't have to run your application as root
  • You won't have to forward ports (and handle that each time your machine boots)

Reference Link: https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps (A great article on how to set up your node app on cloud hosting).

季末如歌 2024-11-16 23:30:21

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

使用 Node 及其监听指令有 2 个值,例如: .listen(80, NODEJS_IP 或 DNS 名称);

其他一些建议。

我不会将 apache 与 nodejs 一起使用,因为它没有事件。所以这确实不推荐。我实际上会考虑使用 NGINX,因为它与 Node.js 的更好搭配。

What you need to do is have 2 ip's for the server you are running. Apache has 1 ip bound to port 80 and then node.js has the other ip bound to port 80.

Using node and its listen directive has 2 values eg. .listen(80, NODEJS_IP or DNS NAME);

Some other advice.

I would not use apache with nodejs as it's not evented. So this really isn't recommended. I would actually look into using NGINX as its a much better pairing with Node.

对你而言 2024-11-16 23:30:21

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

您对 apache 的喜爱程度如何?通过 nginx 代理节点是一个经过验证的真实解决方案,其 nginx 配置如下:

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

It is currently not recommended to run node on port 80, as that requires running node as root.

How attached are you to apache? Proxying node through nginx is a tried and true solution, with an nginx-config such as this:

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 documentation:

http://wiki.nginx.org/HttpProxyModule

http://wiki.nginx.org/HttpUpstreamModule

阪姬 2024-11-16 23:30:21

您的代码看起来像示例代码,其中您创建从端口 80 到端口 9000 的基于节点的代理,然后在端口 9000 上创建基于节点的 HTTP 服务器。(即 Node:80 -> Node: 9000)

当你启动 Node 时,你会得到“地址正在使用”,因为 Apache 已经在使用端口 80。如果你想使用 Apache 进行代理,则必须在不同的端口上使用 Node(例如 9000)并让 Apache 侦听端口 80 并将请求转发到端口 9000 上的 Node。(即 Apache:80 -> Node:9000

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

您想要执行 Node:80 -> Apache:9000Apache:9000 -> Node:80,到底呢?

评论后编辑:
如果你想做 Apache:80 -> Node:9000,您可以在 Apache 上使用 mod_proxy 并使用 ProxyPass/ProxyPassReverse 指令,类似于

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

where nodeurls 是您希望 Apache 转发到 Node 的 URL 系列。

Your code looks like example code in which you're creating a Node-based proxy from port 80 to port 9000, and then creating a Node-based HTTP server on port 9000. (i.e. Node:80 -> Node:9000)

You are getting "address in use" when you launch Node because Apache is already using port 80. If you want to use Apache to proxy, you must use Node on a different port (say 9000) and have Apache listening on port 80 and forwarding the requests to Node on port 9000. (i.e. Apache:80 -> Node:9000)

It looks like the library you're using is for doing the opposite: using Node as the proxy and forwarding requests to Apache. In this case you must configure Apache to run on another port than port 80. (i.e. Node:80 -> Apache:9000).

Are you wanting to do Node:80 -> Apache:9000 or Apache:9000 -> Node:80, in the end?

EDIT after comments:
If you want to do Apache:80 -> Node:9000, you can use mod_proxy on Apache and use the ProxyPass/ProxyPassReverse directives, something like

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

where nodeurls is the family of URLs you wish for Apache to forward to Node.

泅人 2024-11-16 23:30:21

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

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

If you are a non-root user, you cannot run or bind with ports lower than 1024 (in Unix system). To allow non-root user can run node on port lower than 1024 use this command.

$ sudo setcap 'cap_net_bind_service=+ep' $(which node)
待"谢繁草 2024-11-16 23:30:21

我遇到了同样的问题,以下是我如何使用 node-http-proxy 侦听端口 80,然后转发到 Express 或 apache 来解决该问题。

https://stackoverflow.com/a/9645091/500270

I was having the same issue, here is how I resolved it using node-http-proxy to listen on port 80, then forward to either express or apache.

https://stackoverflow.com/a/9645091/500270

就像说晚安 2024-11-16 23:30:21

我也遇到了同样的问题,我只是将端口更改为 8080 就可以了。

httpsServer.listen(8080, () =>
    console.log(chalk.rgb(208, 60, 240)(`Server listening on port: 8080`))
  );

I had the same issue, I just changed my port to 8080 and it worked.

httpsServer.listen(8080, () =>
    console.log(chalk.rgb(208, 60, 240)(`Server listening on port: 8080`))
  );
傲娇萝莉攻 2024-11-16 23:30:21

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

,您可以 su root,然后

node index.js./node_modules/coffee-script/bin/coffee index.coffee< /代码>

if you just in develop environment mode

you can su root, then

node index.js or ./node_modules/coffee-script/bin/coffee index.coffee

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文