买了云服务器,部署了Node.js应用后,外部访问一直失败,特此记录下怎么解决的。
可以编写一个简单的脚本来尝试建立连接(这里使用3000端口),在app.js中写入以下代码:
// 引入Express模块
const express = require('express');
const app = express();
const port = 3000; // 服务器监听的端口
// 创建一个简单的路由
app.get('/', (req, res) => {
res.send('Hello, World!'); // 向客户端发送响应
});
// 启动服务器
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}/`);
});
然后启动Node.js应用。
确认应用监听在正确的端口
查看项目日志,是否有打印Server running at ...,确认应用监听在正确的端口。
本地与外部连接测试
在终端输入以下命令:
curl localhost:3000
我的结果如下:
[root@iZ2ooo8o8oooo888oooooo,Z ~]# curl localhost:3000 Hello, World!
可以看出成功打印出了Hello, World!,证明Node.js项目运行成功,在本地可以访问。
接下来输入以下命令:
telnet 自己服务器的地址 3000
我的结果如下:
[root@iZ2ooo8o8oooo888oooooo ~]# telnet 8.888.888.8 3000
Trying 8.888.888.8...
telnet: connect to address 8.888.888.8: Connection timed out
可以看出外部访问失败。
确认安全组规则已应用
确保这个安全组规则已经允许3000端口通过。在一些云平台上,修改安全组规则后可能需要重新关联安全组到特定实例或等待几分钟使规则生效。检查是否有其他安全组规则,有时候,云服务器可能会关联多个安全组,而其他安全组中的规则可能会覆盖或冲突导致端口被阻塞。请检查所有关联到服务器实例的安全组规则。
检查服务器上的防火墙状态
1.检查firewalld的状态
在终端输入以下命令:
sudo firewall-cmd --state
我的结果如下:
[root@iZ2ooo8o8oooo888oooooo ~]# sudo firewall-cmd --state running
可以看出防火墙正在运行。
2.列出所有规则,包括允许和拒绝的连接
在终端输入以下命令:
sudo iptables -L
我的结果如下:
[root@iZ2ooo8o8oooo888oooooo ~]# sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
可以看出全部都允许了。
3.列出所有允许的服务和端口
在终端输入以下命令:
sudo firewall-cmd --list-all
我的结果如下:
[root@iZ2ooo8o8oooo888oooooo ~]# sudo firewall-cmd --list-all
public (active) target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: cockpit dhcpv6-client ssh
ports: 20/tcp 21/tcp 22/tcp 80/tcp 443/tcp 12003/tcp 39000-40000/tcp 888/tcp
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
可以看出没有3000端口,所以原因出现在防火墙这里。
为了允许外部访问Node.js应用(运行在3000端口上),需要将3000端口添加到允许的端口列表中。那么我们继续通过以下firewalld命令来实现这一点:
sudo firewall-cmd --zone=public --add-port=3000/tcp --permanent
这个命令会将3000端口添加到public
区域的允许列表中,并且--permanent
标志会确保这个规则在防火墙重启后依然有效。
添加规则后,需要重新加载firewalld的配置来应用更改:
sudo firewall-cmd --reload
执行完这些命令后,应该能够从外部访问运行在3000端口的Node.js应用了。
可以再次运行sudo firewall-cmd --list-all
来确认3000端口已经被正确添加到允许的端口列表中。