apache 通过URL访问Node.js服务器,末尾不带端口

wgx48brx  于 2023-02-05  发布在  Apache
关注(0)|答案(4)|浏览(145)

我的服务器运行在带有Express的Node.js环境中。我的服务器工作正常,但我无法从URL中删除域名末尾的端口。
使用末尾没有端口的URL访问我的应用程序的正确方法是什么?

0dxa2lsx

0dxa2lsx1#

客户端

默认情况下,当浏览器发出HTTP请求时,端口为80
如果您键入localhost,则实际请求为localhost:80,因为未指定端口。它与任何域名相同。如果您键入example.com,则实际请求为example.com:80
它是客户端(这里是浏览器)选择在哪个端口上向服务器发出请求。
您可以通过在域名后添加 *:port_number *(如localhost:3000example.com:3000)来强制浏览器在任何端口发出请求。这里我们将端口从80更改为3000

服务器端

Web服务器选择监听请求的端口。它可以是803000或任何其它端口。
如果客户端发出HTTP请求,您的Web服务器需要侦听正确的端口。如果客户端发出example.com:4000,您的Web服务器必须侦听端口4000以获取和处理请求。
要制作一个Web服务器,你可以使用Node.js,Apache(LAMP中使用),Nginx等。你可以有多个Web服务器运行在你的系统上,每个服务器可以使用多个端口,但你不能让它们监听同一个端口。你的一个Web服务器可能无法启动,或可能领先于其他服务器或崩溃...
解决方案是只使用一个Web服务器或在不同端口上使用多个Web服务器。在您的情况下,您正在使用LAMP,因此Apache Web服务器。它可能在配置中的端口80上运行。在这种情况下,您无法在端口80上运行节点Web服务器,因为它已在使用中。您应该选择其他端口,例如3000。然后Node和Apache都将在您的系统上运行,但端口不同,分别为300080
在最后一种情况下,您可以直接访问Apache,但如果没有精确的端口3000,则无法访问Node。要在不停止Apache的情况下通过端口80访问Node Web服务器,您需要通过Apache,并在某些情况下使其将请求重定向到您的Node服务器。为此,你需要在你的Apache中配置一个代理服务器。2注意如果你使用Nginx或者其他的Web服务器,这是一样的。

示例

让我们以端口3000上的简单Express服务器为例:

// server.js  
var express = require('express'),
        app = express(),
        http = require('http').createServer(app),
        port = 3000;

app.get('*', function (req, res, next) { res.sendFile(__dirname + '/views/index.html'); });

http.listen(port, function () { console.log('App running & listening on port ' + port); });
  • 如果您键入终端node server.js,您可以通过localhost:3000从浏览器访问,但不能通过localhost访问,因为端口80上没有运行Web服务器。
  • 如果您将端口变量更改为80,则可以通过localhostlocalhost:80从浏览器访问,但不能再通过localhost:3000访问。
  • 如果您使用新行127.0.0.1 example.com编辑/etc/hosts(sudo nano/etc/hosts),您可以通过example.com从浏览器访问,如果端口是80,否则 * example. com:port_number * 类似于example.com:3000此第三种解决方案仅在本地客户端将域名Map到IP地址。

如果所选端口(例如80)已被另一个进程(如LAMP)使用,则节点服务器可能无法工作。在这种情况下,应先关闭此另一个进程,或为节点进程选择另一个端口。在第三个示例中,如果先关闭LAMP,则可以通过浏览器访问www.example.com,如果为节点选择另一个端口,example.com**, if you choose another port for Node, you can access from browser by example.com:port_number like example.com:3000 for Node and still access your LAMP server on port80.
不要忘记,如果没有指定端口,80是浏览器使用的默认端口。如果您使用其他端口,您应该通过在域后添加 *:port_number * 来从浏览器中精确它。

  • 现在如果你拥有一个真实的域名,你需要做一个真实的DNSMap,而不是juts edit /etc/hosts.在你的registrar帐户(你买域名的地方)上配置你的DNS,使它指向你的服务器的IP.这样,当客户端向域名发出HTTP请求时,它将被重定向到你的服务器.
  • 要在端口80上运行Apache和Node.js,您应该按照上面的说明创建一个代理。实际上,对于您来说,问题可能是您已经有一个Web服务器在端口80上运行(Apache with LAMP),并且您还希望Node.js应用在端口80上运行,以便不强制客户端在url末尾精确指定端口。您需要在Apache conf中创建一个代理,将来自特定域名的请求重定向到正确端口上的本地主机节点服务器进程。

就像你的Apache会议上说的:

<VirtualHost *:80>
  ServerName example.com
  ServerAlias www.example.com

  ProxyRequests Off
  ProxyPreserveHost On
  ProxyVia Full

  ProxyPass / http://127.0.0.1:3000/
  ProxyPassReverse / http://127.0.0.1:3000/
</VirtualHost>

这里当一个请求到达你的服务器端口80时,Apache会检查它是否来自example.com,如果是,它会重定向到127.0.0.1:3000,你的节点服务器将在那里起主导作用。两个不同的进程(Apache和Node)应该同时在你的服务器上运行在不同的端口。

pkln4tw6

pkln4tw62#

如果你想运行你的node js服务器而不使用任何端口,并且只使用http://localhost,那么在端口80上监听你的express js服务器。

bjp0bcyl

bjp0bcyl3#

您可以按照前面的答案所述在端口80上运行

您可以让服务器运行在您想要的任何端口上,并设置一个代理服务器(如nginx),然后将HTTP请求转发到所述服务器。
如果您想启动多个示例甚至不同的进程,这可能会很有帮助。

x759pob2

x759pob24#

当您看到没有端口的URL时,表示正在服务两个端口之一:

*https://-端口443
*http://-端口80
即使假设端口未被使用,您也无法在没有超级用户权限的情况下直接向端口80提供服务,因为端口80和端口443是特权端口。

如果要直接测试在端口80上运行的服务器:

sudo node index.js

其中index.js是Express应用程序的名称。

  • 让它继续 *

因为您标记了apache,所以我假设您想知道如何使用Apache设置节点服务器,如果您不需要生产质量的服务器,只想让它一直运行,您也可以这样做。

开发人员/保持运行

你可以守护你的服务器。快速查找一个“节点”解决方案,forever就是一种方法。简单地安装和运行如下:

yarn global add forever
# or
# npm i -g forever
# remember, sudo for port 80
sudo forever start index.js

生产/Apache

对Node使用非特权端口,并在Apache中设置代理。

ProxyPass / http://localhost:8000

如果您将端口设置为8000,请将其放入<VirtualHost>。例如here。您可能仍然希望使用forever或一些类似的守护程序工具(systemd非常适合Linux服务)守护您的nodejs应用程序。

相关问题