You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让apache2在Mininet主机h1中运行并被h2访问?

解决Mininet节点内运行Apache2的问题

核心原因

你猜的没错:Mininet的节点基于网络命名空间实现,但这些命名空间没有独立的systemd进程,用systemctl启动服务时,实际调用的是物理机的systemd,所以Apache2会运行在物理机的网络环境里,而非h1的命名空间,自然无法被h2通过10.0.0.1访问。

可行解决方案

1. 直接在h1的命名空间内手动启动Apache2进程

跳过systemctl,直接调用apache2二进制文件启动,强制让进程运行在h1的命名空间中:

  • 在h1的xterm终端执行:
    apache2 -D FOREGROUND
    
    (-D FOREGROUND让进程前台运行,方便查看日志;若需要后台运行,可加&放到后台)
  • 此时在h2的终端测试:
    curl 10.0.0.1
    
    或用telnet 10.0.0.1 80验证端口连通性,即可正常访问。

2. 复用物理机网站目录(可选)

如果需要复用物理机已配置的网站文件,可在拓扑脚本中把物理机的网站目录挂载到h1节点内:
修改你的simpleTest.py脚本,添加挂载配置:

from mininet.net import Mininet
from mininet.node import OVSSwitch, Controller
from mininet.cli import CLI
from mininet.log import setLogLevel

def simpleTopo():
    net = Mininet(switch=OVSSwitch, controller=Controller)
    c0 = net.addController('c0')
    s1 = net.addSwitch('s1')
    # 挂载物理机/var/www/html到h1的对应目录
    h1 = net.addHost('h1', ip='10.0.0.1', mountPairs=['/var/www/html:/var/www/html'])
    h2 = net.addHost('h2', ip='10.0.0.2')
    net.addLink(h1, s1)
    net.addLink(h2, s1)
    net.start()
    CLI(net)
    net.stop()

if __name__ == '__main__':
    setLogLevel('info')
    simpleTopo()

启动拓扑后,在h1的xterm里执行apache2 -D FOREGROUND即可复用物理机网站内容。

3. 在拓扑脚本中自动启动Apache2

无需手动打开xterm,直接在脚本中让h1自动启动服务:
在net.start()之后添加代码:

h1.cmd('apache2 -D FOREGROUND &')

启动拓扑后,Apache2会自动在h1的命名空间内运行,直接在h2的终端或Mininet命令行测试访问即可。

验证方法

  • 在h1的xterm执行ps aux | grep apache2,查看进程的NSpid列(命名空间内PID),确认进程运行在h1的命名空间中
  • 在h2执行curl 10.0.0.1,能返回网站内容即为成功

内容的提问来源于stack exchange,提问作者leeyee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 07:22:34