NodeJS HTTP - 在80以外的其他端口上侦听

Sv4*_*443 8 apache xampp http node.js

我在Windows上运行XAMPP以在端口80上托管Apache服务器.现在我正在尝试在后台运行NodeJS脚本,但问题是它只能在端口80上侦听.如果确实如此,一切都可以正常运行应该但我不能同时运行Apache,因为Apache优先考虑并且只是为我的网站服务.NodeJS脚本甚至无法收听.

我的问题是:如何切换NodeJS脚本的监听端口(特定端口无关紧要),这样Apache仍然可以在端口80上运行,我可以从世界各地访问NodeJS脚本.

NodeJS代码的一部分:

const http = require('http');

const port = 8080;
const host = '0.0.0.0';




server = http.createServer( function(req, res) {
    if (req.method == 'POST') {
        var body = '';
        req.on('data', function (data) {
            body += data;
            doStuff(body);
        });
        res.writeHead(200, {'Content-Type': 'text'});
        res.end('received request successfully');
    }
    else {
        res.writeHead(405, {'Content-Type': 'text'});
        res.end('not allowed method ' + req.method + ', try again with GET or POST');
    }

})

server.listen(port, null, function(error){
  if(!!error){
    console.log("\x1b[41m%s\x1b[0m", "error while initializing listener on port " + port + ": " + error);
   }
   else{
    console.log("\x1b[32m%s\x1b[0m", "started listener at 'http://" + host + ':' + port + "'");}
 });
Run Code Online (Sandbox Code Playgroud)

其他信息在我的另一个问题中被标记为重复.

wil*_*end 6

看看你的另一个问题,它被标记为这个问题的重复,你在那里得到了一些额外的信息,可能有助于阐明你需要什么。具体来说,您提到了以下几点:

我想用 NodeJS 托管多个 http 服务器,它们都可以获取和发送 http 请求。同时我想让 Apache 运行,它占用 80 端口。如果我禁用 Apache 并让 NodeJS 在端口 80 上运行,它会工作,但我不能让它们同时运行。

该脚本将在端口 8081 上本地运行和接收请求,但我似乎无法通过 Internet 向它发送 AJAX 请求,即使在使用路由器转发端口之后:

我认为 @ankit-agarwal 可能是正确的,因为您需要设置反向代理来将流量转发到不同的后端。假设您有一个面向外部的 IP 地址,您应该能够使用它们正在侦听的端口访问每个后端。例如,如果您的机器暴露的公共 IP 地址是 100.120.110.43:

+---------+------+-------------------------------------+
| Backend | Port |             Web Address             |
+=========+======+=====================================+
| Apache  |   80 | 100.120.110.43 or 100.120.110.43:80 |
| Node1   | 8080 | 100.120.110.43:8080                 |
| Node2   | 8081 | 100.120.110.43:8081                 |
+---------+------+-------------------------------------+
Run Code Online (Sandbox Code Playgroud)

如果你想在不指定端口的情况下访问每个后端,你必须有一些方法告诉你的内部网络根据请求服务哪个后端。一种方法是使用基于路径的路由,您可以在其中设置反向代理以根据 url 中的路径将流量路由到不同的后端。您没有发布您的 Apache 配置,但您可以使用您当前的 Apache 服务器使用类似于以下的ProxyPassProxyPassReverse指令来处理此问题:

ProxyPass "/node1"  "http://100.120.110.43:8080/"
ProxyPassReverse "/node1"  "http://100.120.110.43:8080/"

ProxyPass "/node2"  "http://100.120.110.43:8081/"
ProxyPassReverse "/node2"  "http://100.120.110.43:8081/"
Run Code Online (Sandbox Code Playgroud)

使用反向代理很酷的一点是你不必向公众公开你的节点后端。假设您没有,并且只能从内部网络 0.0.0.0:port 访问它们。

Listen 80
<VirtualHost *:80>
    DocumentRoot /www/apache
    ServerName www.apachefrontend.com
    ProxyRequests off
    ProxyPass /node1  http://0.0.0.0:8080/
    ProxyPassReverse /node1  http://0.0.0.0:8080/
    ProxyPass /node2  http://0.0.0.0:8081/
    ProxyPassReverse /node2  http://0.0.0.0:8081/
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

您还可以指向只有您有权访问的不同主机/ip。

最后,如果您有不同的 DNS 记录指向不同的后端,您还可以使用 VirtualHost 和 ServerName。

Listen 80
<VirtualHost *:80>
    DocumentRoot /www/apache
    ServerName www.apachefrontend.com
</VirtualHost>
<VirtualHost *:80>
    ServerName www.nodebackend1.com
    ProxyRequests off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    <Location />
        ProxyPass /  http://0.0.0.0:8080/
        ProxyPassReverse /  http://0.0.0.0:8080/
    </Location>
</VirtualHost>
<VirtualHost *:80>
    ServerName www.nodebackend2.com
    ProxyRequests off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    <Location />
        ProxyPass /  http://0.0.0.0:8081/
        ProxyPassReverse /  http://0.0.0.0:8081/
    </Location>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

要使上述任何一项工作,您都需要在 apache 中启用mod_proxymod_proxy_http启用。

这些可能不是最强大的例子,我还没有测试过它们,但它们应该可以证明这个想法。您可以在此处了解更多信息