如何将nodejs和apache放在同一个80端口

Posted

技术标签:

【中文标题】如何将nodejs和apache放在同一个80端口【英文标题】:how to put nodejs and apache in the same port 80 【发布时间】:2012-06-25 16:56:38 【问题描述】:

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

【问题讨论】:

可以代理node.js流量through Apache. @Douglas 很慢。那么使用 node.js 没有任何意义,因为 apache 会减慢它的速度。最好反其道而行之以提高效率。 嗯,我以前没有听说过使用 node.js 来提高性能。出于某种原因,我认为他无法更改 Apache 设置,尽管我现在看到问题并没有这样说。 现在我这样做:nginx:80 -> 代理取决于主机名 -> node/apache/?从 8000 端口开始。 【参考方案1】:

你不能。您必须在另一个端口上运行 node.js,然后通过 apache 代理请求。你可以使用 mod_proxy 来做到这一点

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

【讨论】:

这似乎是一个死链接。副本位于github.com/davybrion/companysite-dotnet/blob/master/content/…【参考方案2】:

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

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

【讨论】:

比较流行,稳定的是使用NGinx。甚至(最初但已停止开发)的创建者 Ryan Dahl 也提出了这个建议,因为 node.js 仍然是一个非常年轻的项目。 @Alfred 够公平的。我知道 nginx 是非阻塞的,所以不会像 Apache 那样遇到同样的问题,而且它在速度方面确实享有盛誉。对我来说,Node 似乎是一个很好的解决方案,因为它在内存上非常简单,并且已经安装了软件,但是对于更大和更繁忙的网站来说,它可能是现在要走的路。 听起来 apache 代理对于低流量站点或开发来说是可以的,当以后需要性能时,你会选择专用的纯 node.js 服务器。 @snez 当然,应该没问题,尽管根据我的经验,只运行 Node 服务器(在不同的端口上)对于开发人员来说非常容易。也就是说,我到处都有 Node,而且这些天都很少使用 Apache。 @meloncholy 是的,如果您获得报酬以专门从事节点项目:)。另一个开发解决方案是使用 pow (pow.cx) 在单独的端口和代理请求上同时运行 apache 和节点,这非常容易。在生产节点上,我可能会配置节点集群 (rowanmanning.com/posts/node-cluster-and-express)。【参考方案3】:

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

使用npm 或official page 安装http-proxy

例子:

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 添加一个条目,以便您的代理启动以防系统关闭。

【讨论】:

这个回复很旧,但是我找到的最好的一个。 http-proxy 现在以完全不同的方式工作。但结果是一样的——和惊人的。我在 8000 上运行 Apache,在 80 上运行 node.js 代理脚本并添加到 init.d 中,它就像一个魅力。 @ZiaUrRehman 我发现 nginx 是一个更好的解决方案,因为它更稳定,在启动时启动并且可能更快。但是两者都可以工作;)。如果你想要性能检查 HAProxy/Varnish 我尝试了 nginx,但无法按预期工作。它总是指向默认的 nginx html。不幸的是,我根本不熟悉 nginx。如果 nginx 是我应该使用的,那么这就是我应该使用的。但是,您能指导我完成一些简单的分步教程吗? @ZiaUrRehman 查看digitalocean.com/community/tutorials/… 步骤 5.. @ZiaUrRehman 你可能没有重新加载配置(例如/etc/init.d/nginx reload【参考方案4】:

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

【讨论】:

【参考方案5】:

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

步骤 1

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

第二步

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

第三步

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

第四步

安装 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 替换为您之前的 IP 地址 从 WHM cPanel 保留。

第 5 步

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

更新:

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

【讨论】:

它需要额外的 IP,这在许多机器中需要额外付费。提问者提到他正在做一个大学项目。这意味着他很可能需要一个解决方案来在同一 IP 地址上同时运行节点和 apache。 我支持@AliAzhar 的观点。我不能简单地为这样的项目购买另一个 IP。另一种情况:在我的本地机器上作为测试环境运行。如果我只有一个 NIC,我从哪里获得另一个 IP?【参考方案6】:

您还可以使用 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)。

【讨论】:

你能发布服务器的例子吗?它不适合我。 它对我不起作用。可以发个例子吗 无法让它工作。有人有这个的工作版本吗?

以上是关于如何将nodejs和apache放在同一个80端口的主要内容,如果未能解决你的问题,请参考以下文章

apache和nodejs共享80怎么设置?

Mac 上的 Nodejs 和 Wordpress 都端口 80 虚拟主机配置

nodejs如何检查哪个IP访问80端口

如何让iis和apache公用80端口或者有其他更好的方法? - 技术问答

IIS和APACHE如何共用80端口?

运行问题,如何修改APACHE的监听端口和密码