我是节点js的新手。我正在使用表达节点js。我的节点应用程序运行正常,但我的应用程序无法从终端启动服务器而无法运行。
从节点网址中删除端口以及在没有端口的简单网址上运行应用的正确方法是什么?
答案 0 :(得分:10)
默认情况下,浏览器发出HTTP请求时,端口为 80 。
如果键入localhost
,则实际请求为localhost:80
,因为未指定端口。任何域名都将相同。如果您输入example.com
,则实际请求为example.com:80
。
由客户端(在这里是浏览器)选择向服务器发出请求的端口。
您可以通过在域名后添加:port_number 作为localhost:3000
或example.com:3000
来强制浏览器在任何端口上发出请求。在这里,我们将端口从 80 更改为 3000 。
Web服务器选择它在哪个端口上侦听请求。可以是 80 , 3000 或任何其他端口。
如果客户端发出HTTP请求,则您的Web服务器需要侦听正确的端口。如果客户端发出example.com:4000
,则您的Web服务器必须在端口 4000 上进行侦听,以获取并处理该请求。
要创建Web服务器,可以使用Node.js,Apache(在LAMP中使用),Nginx等。您可以在系统上运行多个Web服务器,并且每个Web服务器可以使用多个端口,但是不能让他们在同一端口上侦听。您的一台Web服务器可能无法启动,或者可能导致其他服务器瘫痪或崩溃...
解决方案是仅使用一台Web服务器或在不同端口上使用多台Web服务器。在您的情况下,您使用的是LAMP,所以是Apache Web服务器。它可能在其配置中的端口 80 上运行。在这种情况下,您无法在端口 80 上运行Node Web服务器,因为该服务器已在使用中。例如,您应该选择另一个端口,例如 3000 。然后,Node和Apache都将在您的系统上运行,但分别在 3000 和 80 的不同端口上运行。
在最后一种情况下,如果没有精确的端口 3000 ,则可以直接访问Apache,但不能访问Node。为了能够通过端口 80 访问Node Web服务器而不停止Apache,在某些情况下,您需要使用Apache并将其重定向到您的Node服务器。为此,您需要在Apache中配置代理。请注意,如果您使用的是Nginx或其他Web服务器,则将是相同的。
让我们在端口3000上安装一个简单的快递服务器:
// 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
进行访问,因为端口上没有运行Web服务器。 80 。
如果将端口变量更改为80,则可以通过localhost
或localhost:80
从浏览器进行访问,但不能再通过localhost:3000
进行访问。
如果用新行/etc/hosts
编辑127.0.0.1 example.com
(sudo nano / etc / hosts),并且端口为 80,则可以通过example.com
从浏览器访问,否则为 example.com:port_number ,例如example.com:3000
。 第三个解决方案仅将域名映射到您本地客户端中的IP地址。
如果所选的端口(例如 80 )已被另一个进程(如LAMP)使用,则您的节点服务器可能无法工作。在这种情况下,您应该首先关闭该其他进程,或者为节点进程选择另一个端口。在第三个示例中,如果先关闭LAMP,则可以通过 example.com 从浏览器访问,如果为Node选择另一个端口,则可以通过example.com:port_number从浏览器访问,例如{ {1}}代表Node,并且仍在端口 80 上访问您的LAMP服务器。
如果没有指定端口,请不要忘记 80 是浏览器使用的默认端口。如果您使用其他端口,则应通过在域后添加:port_number 在浏览器中进行精确设置。
现在,如果您拥有真实的域名,则需要进行真实的DNS映射,而不要编辑example.com:3000
。在registar帐户(您购买域名的地方)上配置DNS,使其指向服务器的IP。这样,当客户端对域名发出HTTP请求时,它将被重定向到您的服务器。
要同时运行Apache和Node.js并在端口 80 上提供它们,您应该按照上面的说明制作一个代理。确实,对您而言,问题可能在于您已经在端口 80 (带有LAMP的Apache)上运行了Web服务器,并且还希望Node.js应用程序在端口 80 上运行strong>请勿强迫客户在网址末尾精确指定端口。要解决此问题,您需要在Apache conf中创建一个代理,以将来自特定域名的请求重定向到正确端口上的本地主机节点服务器进程。
您的apache conf中有类似的内容:
/etc/hosts
这里,当请求通过端口 80 到达您的服务器时,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>
,如果是,它将重定向到example.com
节点服务器将带头。这两个不同的进程(Apache和Node)应该在服务器上的不同端口上同时运行。
答案 1 :(得分:5)
如果您要运行没有任何端口的节点js服务器,只需通过http://localhost即可,然后在端口80上监听Express js服务器。
答案 2 :(得分:4)
您可以按照前面的答案进行操作,然后在端口80上运行
或
您可以让服务器在所需的任何端口上运行,并设置诸如nginx之类的代理服务器,并将HTTP请求转发至该服务器。
如果您想启动多个实例甚至不同的进程,这可能会有所帮助。
答案 3 :(得分:2)
当您看到没有端口的URL时,表示正在服务两个端口之一:
即使假定端口未使用,您也不能在没有超级用户特权的情况下直接服务于端口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
或某些类似的守护程序工具来守护您的nodejs应用程序(systemd对于Linux服务来说非常有用)