Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 无法从外部世界访问运行在Ubuntu服务器上的Express web服务器_Node.js_Http_Express_Ubuntu_Webserver - Fatal编程技术网

Node.js 无法从外部世界访问运行在Ubuntu服务器上的Express web服务器

Node.js 无法从外部世界访问运行在Ubuntu服务器上的Express web服务器,node.js,http,express,ubuntu,webserver,Node.js,Http,Express,Ubuntu,Webserver,这可能是StackOverflow上最常见的问题之一,但我已经尝试了所有我知道要尝试的方法 我刚刚购买了我的第一个域名,打算在Linode上运行一个网站。我的Linode公共IP是45.79.142.131。为了测试一切是否正常,我设置了一个简单的ExpressWeb服务器,它提供一个简单的Hello,World。服务器代码: const express = require('express') const app = express() app.get('/', (req, res) =&g

这可能是StackOverflow上最常见的问题之一,但我已经尝试了所有我知道要尝试的方法

我刚刚购买了我的第一个域名,打算在Linode上运行一个网站。我的Linode公共IP是
45.79.142.131
。为了测试一切是否正常,我设置了一个简单的ExpressWeb服务器,它提供一个简单的Hello,World。服务器代码:

const express = require('express')
const app = express()

app.get('/', (req, res) => res.send('Hello World!'))

app.listen(80, () => console.log('Example app listening on port 80!'))
要允许Express绑定端口80(注意:对于实际部署,我不会这样做;这只是一个脏测试),我使用以下命令:

$ sudo node server-80.js 
Example app listening on port 80!
如果我在服务器上本地使用
curl
,我会得到一个响应:

$ curl 45.79.142.131:80
Hello World!
但是,如果我在外部使用web浏览器或curl,服务器不会提供响应

$ curl 45.79.142.131:80
curl: (7) Failed to connect to 45.79.142.131 port 80: Operation timed out
我的第一个猜测是防火墙阻止了我的外部请求。我正在使用
ufw
管理我的防火墙。我使用``来允许端口80上的请求。我还允许
ssh
https
,以及一个虚拟端口3000。我还使用
sudoufw-reload
重新加载了防火墙

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere                  
80/tcp                     ALLOW       Anywhere                  
443/tcp                    ALLOW       Anywhere                  
3000/tcp                   ALLOW       Anywhere                  
22/tcp (v6)                ALLOW       Anywhere (v6)             
80/tcp (v6)                ALLOW       Anywhere (v6)             
443/tcp (v6)               ALLOW       Anywhere (v6)             
3000/tcp (v6)              ALLOW       Anywhere (v6)  
在服务器上本地运行
nmap
,可提供以下输出:

$ nmap localhost -Pn

Starting Nmap 7.60 ( https://nmap.org ) at 2018-08-27 22:12 EDT
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00027s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 998 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 0.13 seconds
端口80似乎已打开。但是,如果我在外部运行
nmap
(即我的Mac),我看不到端口80处于打开状态

$ nmap 45.79.142.131 -Pn
Starting Nmap 7.70 ( https://nmap.org ) at 2018-08-27 22:14 EDT
Nmap scan report for li1241-131.members.linode.com (45.79.142.131)
Host is up (0.096s latency).
Not shown: 999 filtered ports
PORT   STATE SERVICE
22/tcp open  ssh

Nmap done: 1 IP address (1 host up) scanned in 47.51 seconds
我不知所措。我真的不知道这里发生了什么。然而,让事情变得更奇怪的是,如果我在端口3000上运行我的Express web服务器(和
sudo ufw allow 3000/tcp
),一切都会完美地工作。我能够从web服务器获得响应。端口80出现了一些特定的问题。看起来很像防火墙在阻止我的请求,但我特别为端口80添加了一个例外


如果有任何日志或其他信息有助于诊断问题,我很乐意与大家分享。

在将
ufw
设置为默认拒绝传入流量后,我无意中刷新了我的
iptables
。这导致我的
ssh
连接中断。我从头开始完全重建了我的Ubuntu实例。当需要用
ufw
配置防火墙时,我只允许
ssh
http/tcp
。幸运的是,一切似乎都按预期进行!我可以通过端口80访问虚拟web服务器


我不知道出了什么问题。我能想到的唯一一件事是我的
iptables
不知何故进入了严重的配置错误状态。也许我在第一次学习如何使用
ufw
或其他东西时发出了一个错误的命令。

Linode上是否有任何网络安全组设置?如果可以,请检查您的Linnode安全配置。因为一些云计算供应商,比如Azure和Aliyun,提供了一些虚拟网络子网安全策略来保护你的虚拟机。我不这么认为。我正在看Linode发布的故障排除指南。在“无法连接到Web服务器”部分中,没有提到需要在Linode实例上进行任何特殊配置以允许端口80通信。建议检查是否允许端口80通过防火墙。我是否应该对端口80的
iptables
执行
grep
?也许
ufw
在某个地方造成了一些错误配置?因此,我不经意地刷新了
iptables
,同时还让
ufw
拒绝所有传入流量,因此我无意中终止了我的
ssh
连接。我从头开始重新配置了Ubuntu安装。幸运的是,现在一切正常!我可以通过端口80访问我的虚拟服务器!我最好的猜测是,当我第一次学习使用
ufw
时,我意外地错误配置了我的
iptables
,并且不知何故影响了端口80。