我在拥有大量IP地址的主机上运行临时Django应用程序。使用manage.py runserver 0.0.0.0:5000
时,如果可能的话,代码如何看到机器的多个IP地址中的哪一个是请求实际触及的那个?
或换句话说:
我的主机有IP地址10.0.0.1
和10.0.0.2
。当runserver正在监听0.0.0.0
时,我的应用程序如何知道用户是在点击http://10.0.0.1/app/path/etc
还是http://10.0.0.2/app/path/etc
?
据我所知,如果我使用Apache,我可以使用像SERVER_ADDR
这样的Apache环境变量,但我没有使用Apache。
有什么想法吗?
修改
更多信息:
我正在使用一个小型Django应用程序测试负载均衡器。这个应用程序正在侦听许多不同的IP,我需要知道通过负载均衡器发出的请求中的哪个IP地址被命中,所以我可以确保它正常平衡。
我无法使用request.get_host()
或request.META
选项,因为它们会返回用户输入的内容以达到负载均衡器。
例如:用户点击http://10.10.10.10/foo
并将请求转发给http://10.0.0.1/foo
或http://10.0.0.2/foo
- 但request.get_host()
将返回10.10.10.10
,而不是服务器正在侦听的实际IP。
谢谢, 本
答案 0 :(得分:5)
request.get_host()
https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_host
但请注意,这可能会被欺骗,所以不要在其上转发您的安全措施。
如果用户在同一地址下看到你的机器,我不确定这是否可以通过runserver(它应该是简单的开发工具)。
也许你可以使用nginx? 或者,如果这仅用于测试,请执行以下操作:
for i in 1 2 3 4 5; do manage.py runserver 10.0.0.$i:5000; done
然后sys.args [2]是你的地址
答案 1 :(得分:0)
如果您的目标是确保负载均衡器正常工作,我认为在应用程序代码中执行此操作并不是绝对必要的。您可以使用可以侦听特定接口(例如tcpdump -i <interface>
)并查看输出的网络数据包分析器。