apache2 / nodejs / express 在数字海洋服务器上 - 如何在没有地址使用错误的情况下侦听公共端口(80)

mhe*_*ers 2 apache ajax jquery node.js express

我是服务器环境中 nodejs 的新手,并试图弄清楚如何让它与我在我的数字海洋服务器上运行的所有其他东西一起工作。

我成功地在数字海洋的子域上设置了沙箱环境,其中我有一个快速服务器侦听来自端口 3000 的请求。然后,从端口 3000 上的 Web 浏览器,我可以向节点发出 ajax GET 请求服务器,并检索响应。

但是,现在我正在尝试将该沙箱环境实施到一个新的子域中,在该子域中我正在运行工艺 PHP CMS。这在默认端口 80 上运行。所以我希望我的节点服务器能够侦听来自端口 80 的请求。但在此之前我可以说:

app.listen(3000, function () {
  console.log('listening')
})
Run Code Online (Sandbox Code Playgroud)

如果我尝试从端口 3000 运行craft,它将引发 URL 路由错误: Cannot GET [url_segments]

因为它旨在查找来自端口 80(默认 Web 端口)的请求。如果我将快速服务器更改为侦听端口 80,则会出现错误,指出地址正在使用中。

> node app.js:
Error: listen EADDRINUSE :::80
Run Code Online (Sandbox Code Playgroud)

如何app.js在没有此 EADDRINUSE 错误的情况下只收听我的数字海洋服务器上的默认公共 html 端口?我希望人们访问我的子域:

http://subdomain.domain.com/episodes/episode-2

并让它能够通过 AJAX 调用我的快速服务器:

var urlParams = new URLSearchParams(window.location.search);
var startDate = urlParams.get('start');
var endDate = urlParams.get('end');
var urlWithParams = "/list?start=" + startDate + "&end=" + endDate;

$.ajax({
    method: "GET",
    url: urlWithParams,
}).done(function (data) {
    //do stuff
})
Run Code Online (Sandbox Code Playgroud)

我的快递服务器上的列表功能类似于:

let app = express()

app.get('/list', (request, response) => {
  //DO STUFF
}
Run Code Online (Sandbox Code Playgroud)

我在使用 Ubuntu 14.04 和 Apache2 的数字海洋服务器上

Jon*_*ion 5

您需要使用代理。

nginx 示例:

server {
    listen 80;
    server_name subdomain.domain.com

    location / {
        proxy_pass http://localhost:3000;
    }   
}
Run Code Online (Sandbox Code Playgroud)

阿帕奇:

<VirtualHost *:*>
    ProxyPass / http://0.0.0.0:3000/
    ServerName localhost
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

更多信息在这里