我必须将 nodejs 放在端口 80 中,但 apache 已经在使用它。如何将两者(nodejs 和 apache)放在同一个端口 80 上?我需要它,因为在我的大学里,除了 PORT 80 之外的所有端口都被阻塞了。(这是一个带有 nodejs 和 socket.io(websockets)的实时应用程序,而另一方面是一个 php 应用程序)。非常感谢
6 回答
我通过 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
以便您的代理启动,以防系统关闭。
您还可以使用 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)。
我个人从@liammclennan 以相反的方式做到了这一点。一些人认为通过 Apache 代理会破坏 Node 的一些性能和可扩展性优势(我自己没有经验,因为我的服务器没有获得那么多流量,但是来自@liammclennan 的链接:“通过 Apache 传入的每个请求都会导致一个 Apache 线程等待/阻塞,直到从您的 Node.js 进程返回响应。",这显然与 Node 的架构不太吻合。)
我使用node-http-proxy大致按照第一个链接中的描述设置了一个 Node 代理服务器(我的 Node 代理在端口 80 上运行;Apache 和我的其他 Node 服务没有)。到目前为止似乎运行良好,尽管我偶尔会遇到稳定性问题,通过检查代理是否仍在运行 cron 作业(编辑:这些天似乎更加稳定),我已经“解决”了这些问题。代理非常轻巧,占用大约 30MB 内存。
你不能。您必须在另一个端口上运行 node.js,然后通过 apache 代理请求。您可以使用 mod_proxy 执行此操作
http://davybrion.com/blog/2012/01/hosting-a-node-js-site-through-apache/
在这种情况下,我通常使用haproxy作为前端,并将代理连接到适当的后端服务器。(尽管根据您的需要使您的 node.js 进程成为代理服务器也是一种有效的方法)。
我发现了一个很酷的要点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 之外的其他端口。