所有本地运行的网络服务器是否都依赖于 /etc/hosts 文件?

所有本地运行的网络服务器是否都依赖于 /etc/hosts 文件?

我正在本地运行 Django 网络服务器,我希望能够输入 www.my-site.dev 或 username.my-site.dev 并将其映射到我的 Django 应用程序。

我已经看到很多针对 Apache 的解决方案,并尝试将以下内容添加到我的 /etc/hosts 文件中,假设 Django 服务器也会检查 /etc/hosts。

127.0.0.1:8000 www.my-site.dev  
127.0.0.1:8000 username.my-site.dev  

答案1

一些东西

1)Django 可能没有引用您的 hosts 文件。(我说可能,因为我不使用 Django,但是引用 hosts 文件是没有意义的,因为它不需要自行查找)。

2) hosts 用于本地名称解析。它与端口无关。如果您希望这两个站点解析到您的本地计算机,则应该在 hosts 文件中使用它。

127.0.0.1     www.my-site.dev    username.my-site.dev  

然后您可以通过网络浏览器访问该网站:

www.my-site.dev:8000

唯一不需要输入 8000 的方法是让 Django 监听端口 80(或者假设您正在使用 SSL,则监听 443)。这应该是在 Django 中可配置的,并且不会引起任何问题(除非您已经在运行使用端口 80 的程序)。

答案2

这里我将概述几个问题。其他人已经在某种程度上解释了这些问题,但作为 Django 开发人员,我可以补充一些被忽视的问题:

  • 不要误解服务器、浏览器和 DNS 之间的关系。浏览器需要 DNS 来查找名称并获取要连接的 IP 地址。服务器不会给出指向其 IP 的名称的飞香蕉。
    笔记:httpd 会这样做,但不是为了连接目的 —— 它使用它在一个 IP 上托管多个虚拟主机。
  • /etc/hosts可以将域名指向 IP,但仅此而已。它们无法指定端口 8000。这是浏览器的工作。
  • 要在端口 80 上托管某些内容,您需要以 root 身份运行它,重定向端口 80, 或者允许setcapPython 占用 80 端口。最后两个方法很 hack,但它们比以 root 身份运行 Django 开发服务器好得多。请永远不要这样做。
  • 托管多个 Django开发不可能在一个 IP 的 80 端口上同时连接多个服务器。它们都会贪婪地尝试绑定到该 IP 并禁止进一步绑定。您要么必须错开端口,要么在前面放置一个 httpd/reverse-proxy 以将虚拟主机拆分到 Django 服务器。

对于开发,我只需在需要时加载开发服务器即可。我一次只运行一个,并且它在默认模式下运行127.0.0.0:8000。如果该模型适合您,并且您只想在自定义域名上托管,只需对您的进行如下操作/etc/hosts

127.0.0.1 my.domain.ext sub.my.domain.ext

您可以继续将它们链接起来,但请记住,这将覆盖这些域上的所有出站请求流量。又名:别忘了您已经破解了自己的 DNS!从那里您只需加载http://my.domain.ext:8000并查看您的开发服务器。

如果您愿意http://my.domain.ext,您要么必须破解一切(参见上文),要么必须转向更传统的基础设施(下文)。


如果您需要运行多个服务器,我只能建议运行适当的堆栈。我会运行 nginx + uwsgi + virtualenv 堆栈。类似于您在生产中使用的堆栈。事实上,您越能反映您的生产环境,就越好。如果您使用 Apache 和 modwsgi,请这样做。

这为您提供了更好的测试平台。如果您需要进行调试,我发现将 uwsgi 设置为日志(并监控日志)是实时控制台输出的合适替代品。

答案3

我不是专家,但听起来你需要一个 DNS 服务器。否则,你的浏览器将检查万维网以尝试查找 www.my-site.dev,并且除非你设置 DNS 服务器并设置任何访问 www.my-site.dev 的客户端以使用你设置的 DNS 服务器,否则将找不到你的本地计算机。然后 DNS 服务器将客户端指向你的本地计算机。如果我错了,请忽略我 :)

相关内容