如何让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.1telnet 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
相关产品推荐
相关产品推荐

