Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 如何在端口80上运行Node.js?_Apache_Proxy_Node.js_Websocket - Fatal编程技术网

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

Apache 如何在端口80上运行Node.js?,apache,proxy,node.js,websocket,Apache,Proxy,Node.js,Websocket,我的目标是在端口80上运行Node.js。这是因为我发现node.js被某些不允许来自任何其他端口的流量的网络阻止 似乎最好的方法是通过Node.js代理Apache。我试着用它来做这件事,但我没有任何运气 我使用的代码如下: var util = require('util'), http = require('http'), httpProxy = require('http-proxy'); httpProxy.createServer(9000, 'localhost'

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

似乎最好的方法是通过Node.js代理Apache。我试着用它来做这件事,但我没有任何运气

我使用的代码如下:

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吗?节点http代理是实现这一点的最佳方式吗


谢谢。

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

使用node及其listen指令有2个值,例如:listen(80,NODEJS_IP或DNS名称)

其他一些建议


我不会在nodejs中使用apache,因为它不是事件。所以这真的不被推荐。实际上,我会考虑使用NGINX作为与Node的更好配对。

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

你对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文档:


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

当您启动节点时,您将获得“正在使用的地址”,因为Apache已经在使用端口80。如果要使用Apache代理,必须在不同的端口(比如9000)上使用Node,并让Apache侦听端口80并将请求转发到端口9000上的Node。(即
Apache:80->Node:9000

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

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

评论后编辑: 如果要执行
Apache:80->Node:9000
,可以在Apache上使用
mod_proxy
,并使用
ProxyPass
/
ProxyPassReverse
指令,例如

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

其中,
nodeurls
是您希望Apache转发到节点的URL系列。

然后在高端口8080上运行您的应用程序

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

如果您没有使用ngnix或apache,我也遇到了同样的问题,下面是我如何使用node http proxy在端口80上侦听,然后转发到express或apache


如果您仅处于开发环境模式

您可以
su root
,然后


node index.js
/node\u modules/coffee script/bin/coffee index.coffee
最简单的解决方案:安全地将您的节点应用程序配置为在端口80上运行

  • sudo apt get install libcap2 bin
  • sudo setcap cap\u net\u bind\u service=+ep/path/to/node
  • 塔达!你完了
我为什么喜欢它

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

参考链接:(这是一篇关于如何在云主机上设置节点应用程序的优秀文章)。

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

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

@保姆。谢谢如何将辅助IP绑定到端口80和node.js,而不是Apache?对于dns,1个IP使用www.domain.com,另一个IP使用chat.domain.com。在apache中,侦听第一个ip地址:侦听vvv.xxx.yyy.zzz:80。然后使用节点do.listen(80,chat.domain.com)。这是我正在使用的设置,我对任何公司防火墙等都没有问题。我不建议将nginx用于node。Nginx不支持HTTP 1.1,这意味着您将无法执行某些WebSocket操作。当您使用node.js时,我想您会非常快地使用它;)@FlashFan,我可以用Chrome做WebSocket的东西,我的网站也可以。你能详细说明一下吗?@PaulM-我在尝试将Apache绑定到特定IP时遇到了麻烦。我这里有个问题:你做这件事的时候有什么问题吗?谢谢。我不太确定。很抱歉我希望节点在apache:80上运行。所以节点:9000->Apache:80。不太确定这是否正确。如果要在端口80上运行Apache,则必须在另一个端口(如端口9000)上运行Node。在这种情况下,必须将Apache配置为将其部分请求转发给节点。我将把它写成
Apache:80->Node:9000
,继续上面的内容。啊,好的。我懂了。如何让Apache将一些请求转发给Node?请看我的编辑,您必须安装一个模块并对其进行配置。我想您的意思是
Apache:80->Node:9000
,而不是第一行的
Node:80->Node:9000
。很多人在端口80上运行Node。通过nginx代理需要一些开销。另外,在端口80上运行也不需要root。请参阅此处了解更多信息:我自己没有通过root运行节点。谢谢。我在看我的自动取款机。Nginx可能是未来的发展方向。看看Dry程序员的答案,了解如何在端口80上运行Node,不使用root。这个答案让我感觉我可以从同一台服务器和IP为Node和php应用程序提供服务,为每个应用程序使用不同的端口,但是我对nginx不太熟悉,我不确定它是否真的有可能……知道如何撤销它也会很有帮助。“--80端口”我想这不是电话号码