Node.js 无法从外部世界访问运行在Ubuntu服务器上的Express web服务器
这可能是StackOverflow上最常见的问题之一,但我已经尝试了所有我知道要尝试的方法 我刚刚购买了我的第一个域名,打算在Linode上运行一个网站。我的Linode公共IP是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
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。