如何将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端口的主要内容,如果未能解决你的问题,请参考以下文章
Mac 上的 Nodejs 和 Wordpress 都端口 80 虚拟主机配置