27

我必须将 nodejs 放在端口 80 中,但 apache 已经在使用它。如何将两者(nodejs 和 apache)放在同一个端口 80 上?我需要它,因为在我的大学里,除了 PORT 80 之外的所有端口都被阻塞了。(这是一个带有 nodejs 和 socket.io(websockets)的实时应用程序,而另一方面是一个 php 应用程序)。非常感谢

4

6 回答 6

23

我通过 node.js 代理做到这一点..

http-proxy使用npm官方页面安装

例子:

var http = require('http'),
httpProxy = require('http-proxy'),
proxyServer = httpProxy.createServer ({
    hostnameOnly: true,
    router: {
        'domain.com':       '127.0.0.1:81',
        'domain.co.uk':     '127.0.0.1:82',
        '127.0.0.1':        '127.0.0.1:83'
    }
});

proxyServer.listen(80);

这将创建一个节点进程,侦听端口 80,并转发对去往:81、82、83 等的域的请求。我建议运行它forever并添加一个条目,init.d以便您的代理启动,以防系统关闭。

于 2012-06-24T00:15:37.323 回答
10

您还可以使用 Apache 2 的 mod_proxy 和 mod_proxy_http,它们可能更可靠或性能更好,具体取决于您的系统。

这是一个例子:

首先运行下面的命令来代理以允许

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests

# Use Apache for requests to http://example.com/
# but use Node.js for requests to http://example.com/node/
<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example/
    <Location /node>
        ProxyPass http://127.0.0.1:8124/
        ProxyPassReverse http://127.0.0.1:8124/
    </Location>
</VirtualHost>

当然,您可以根据需要修改指令,例如为您的虚拟主机使用不同的端口(例如,443),为 Node.js 使用不同的端口,或者在不同的块下设置代理,例如子域(例如,node.example.com)。

于 2015-09-07T01:59:57.703 回答
9

我个人从@liammclennan 以相反的方式做到了这一点。一些人认为通过 Apache 代理会破坏 Node 的一些性能和可扩展性优势(我自己没有经验,因为我的服务器没有获得那么多流量,但是来自@liammclennan 的链接:“通过 Apache 传入的每个请求都会导致一个 Apache 线程等待/阻塞,直到从您的 Node.js 进程返回响应。",这显然与 Node 的架构不太吻合。)

我使用node-http-proxy大致按照第一个链接中的描述设置了一个 Node 代理服务器(我的 Node 代理在端口 80 上运行;Apache 和我的其他 Node 服务没有)。到目前为止似乎运行良好,尽管我偶尔会遇到稳定性问题,通过检查代理是否仍在运行 cron 作业(编辑:这些天似乎更加稳定),我已经“解决”了这些问题。代理非常轻巧,占用大约 30MB 内存。

于 2012-06-23T22:41:55.103 回答
0

你不能。您必须在另一个端口上运行 node.js,然后通过 apache 代理请求。您可以使用 mod_proxy 执行此操作

http://davybrion.com/blog/2012/01/hosting-a-node-js-site-through-apache/

于 2012-06-23T22:26:40.200 回答
0

在这种情况下,我通常使用haproxy作为前端,并将代理连接到适当的后端服务器。(尽管根据您的需要使您的 node.js 进程成为代理服务器也是一种有效的方法)。

于 2012-06-24T04:07:11.853 回答
-2

我发现了一个很酷的要点Run apache and nodejs on port 80。还没有尝试,但当然会

第1步

获取提供2 个或更多 IP 地址的 VPS。

第2步

在 WHM cPanel 中,找到菜单项Service Configuration,选择Apache Configuration然后单击Reserved IPs Editor

第 3 步

勾选您不想让 Apache 收听的 IP 地址并将其写下来,以便在下一步中使用它。单击Save

第4步

安装 Node.js,并像这样创建一个服务器:

var http = require('http');

var server = http.createServer(function(req, res) {
  res.writeHead(200);
  res.end('Hello, world!');
});

server.listen(80, '111.111.111.111');

替换111.111.111.111为您之前从 WHM cPanel 保留的 IP 地址。

第 5 步

不要再浪费你的时间了,永远不要听那些告诉你 mod_rewrite再次使用代理 Node.js 的人。

更新:

我们可以通过许多不同的方式解决问题,恕我直言,我们至少应该知道每种可能的方式。我们可以在不购买新 IP 的情况下做到这一点,当然在 Apache 和 NodeJS 服务器前面放置一个代理,每个服务器都运行除 80 之外的其他端口。

于 2014-02-11T04:32:18.197 回答