虚拟机里跑Nodejs,通过ip访问不了

虚拟机里跑Nodejs,通过ip访问不了

情况是这样子的: 主机是windows7, 虚拟机是ubuntu,网络用的桥接,ip相同网段,都可以互相ping通的。 我试了主机下下的tomcat通过ip地址能在虚拟机中访问。 在虚拟机中安装好了nodejs, 写了一个hello测试,在虚拟机中用localhost:port能访问,但是通过虚拟机的ip:port就访问不了。 求助~~什么原因?

已经解决

ps:因为绑定的是"127.0.0.1"ip,所以只能127.0.0.1和localhost访问… 网上的hello_node.js就是这么写的。。。


11 回复

虚拟机里跑Node.js,通过IP访问不了

情况是这样子的:

主机是Windows 7, 虚拟机是Ubuntu,网络使用的是桥接模式,IP在同一网段,都可以互相ping通。我在主机上运行Tomcat,通过IP地址可以在虚拟机中访问。

在虚拟机中安装并配置好了Node.js,并写了一个简单的Hello World测试程序。在虚拟机中使用localhost:port可以访问,但是通过虚拟机的IP地址和端口却无法访问。

求助~~什么原因?


解决方案

问题的核心在于Node.js服务器默认只监听本地回环地址(即127.0.0.1localhost),而不是所有网络接口。因此,只有通过localhost127.0.0.1才能访问到该服务,而不能通过虚拟机的IP地址访问。

示例代码

假设你有一个简单的Node.js应用文件 app.js

const http = require('http');

const hostname = '127.0.0.1'; // 这里绑定了本地回环地址
const port = 3000;

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}/`);
});

在这个例子中,如果你将 hostname 改为 0.0.0.0,则服务器会监听所有网络接口,包括虚拟机的IP地址。

修改后的代码如下:

const http = require('http');

const hostname = '0.0.0.0'; // 绑定所有网络接口
const port = 3000;

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}/`);
});

解释

  • 127.0.0.1localhost: 这个地址表示仅监听本机的回环接口,因此只能通过本地访问。
  • 0.0.0.0: 这个地址表示监听所有可用的网络接口,包括虚拟机的IP地址。因此,从主机或其他设备可以通过虚拟机的IP地址和端口号访问该服务。

通过上述修改,你可以确保Node.js服务不仅可以通过localhost访问,也可以通过虚拟机的IP地址访问。


你本机的地址已经不是本机IP了。你可以ipconfig 查看本机IP。然后再用当前IP访问

我说的本机ip就是虚拟机的ip,桥接方式,主机和虚拟机都有ip了。

我觉得楼主应该把 ifconfig 截图和端口号之类全贴上来才好说… 当你说"通过本机 IP 访问"我还是不明白你指的是什么

service iptables stop 试试

本机是指虚拟机。sorry,表意不清。

那请问楼主怎么将这种绑定解除,我是新手,我也出现了和楼主一样的问题,求大神解救

只指定端口,不指定ip

我也遇到了楼主一样的问题,还没有解决,求指教

没注意楼上已经给出答案了,谢谢大牛们

根据你提供的信息,问题出在Node.js服务器绑定的IP地址上。默认情况下,Node.js应用程序通常会绑定到 127.0.0.1(即 localhost),这使得它只能通过 localhost 访问,而不能通过虚拟机的IP地址访问。

解决方案

你需要将Node.js服务器绑定到所有可用的网络接口上。可以通过将服务器绑定到 0.0.0.0 来实现这一点。以下是修改后的代码示例:

const http = require('http');

const hostname = '0.0.0.0'; // 绑定到所有网络接口
const port = 3000;

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}/`);
});

解释

  • const hostname = '0.0.0.0'; 这行代码确保你的Node.js服务器监听所有网络接口。这样做之后,你就可以通过虚拟机的IP地址来访问你的Node.js服务。
  • server.listen(port, hostname, () => { ... }); 这行代码启动服务器,并指定它应该监听的端口和IP地址。

测试

确保你在虚拟机内部运行这段代码,并且你的虚拟机网络设置为桥接模式。然后你可以通过主机的浏览器访问 http://<虚拟机IP>:3000 来验证是否可以成功访问。

这样配置后,你应该能够从主机通过虚拟机的IP地址访问Node.js应用。

回到顶部