Nodejs 虚拟机设置了端口映射,跑node,宿主机通过无法访问?
Nodejs 虚拟机设置了端口映射,跑node,宿主机通过无法访问?
据说linux跑node比较好,我根据新手入门的教程配置了node在虚拟机上(CentOS),然后根据以下教程写了第一个http server:https://github.com/alsotang/node-lessons/tree/master/lesson1 执行$ node app.js 显示 app is listening at port 8888
宿主机设置端口映射,主机的8088映射到虚拟机的8888,宿主机上的浏览器访问http://localhost:8088/ 请求超时了 作为对比,我开了centos自带的httpd,监听的是虚拟机的80端口,然后映射到主机的8080 ,宿主机上访问http://localhost:8080/ 可以!
继续作为比较,我在虚拟机上分别 $ nc -C 127.0.0.1 80 $ nc -C 127.0.0.1 8888 然后GET / 两个均有应答,访问8888 正常显示hello world, 但是只有宿主机不能访问node。。。这是为什么呢? P.S. iptables已经stop了。
还有个奇怪的地方,虚拟机下$ nc -C localhost 8888 会显示Ncat: Connection refused.
这就很奇怪了,在Host上查看一下是不是8088
端口已经被占用了:sudo lsof -i :8088
。
程序没问题,看样子是VMWare的设置有问题。不知道你设置好端口转发后,有没有关闭虚拟机,重启VMWare,重启虚拟机。
试试吧,看有没有luck
收集到与问题相关的一些资源:
- https://cnodejs.org/topic/50bf7116637ffa4155a2650c ,看作者PS
- http://blog.csdn.net/mby_123/article/details/48296209 ,这篇帖子,心路历程啊……
- 我自己做练习时,是把 防火墙关闭了的. 我在 centos6.9上
service iptables stop
根据你的描述,问题可能出在Node.js服务器只监听了本地地址,而不是所有网络接口。你需要确保Node.js服务器监听了所有的网络接口,这样宿主机才能通过端口映射访问它。
你可以修改你的app.js
文件,将服务器绑定到所有网络接口,而不仅仅是localhost
或127.0.0.1
。以下是示例代码:
const http = require('http');
const hostname = '0.0.0.0'; // 绑定到所有网络接口
const port = 8888;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
将上述代码保存为app.js
,然后在虚拟机中运行:
$ node app.js
这将使Node.js服务器监听所有网络接口。现在你应该可以在宿主机上通过http://localhost:8088/
访问该服务。
如果你仍然遇到问题,请检查以下几点:
- 确认虚拟机和宿主机之间的网络连接正常。
- 检查虚拟机中的防火墙设置(虽然你说iptables已停止,但确认其他防火墙规则)。
- 确认虚拟机中的端口映射配置正确。