如何在使用Docker时设置生产环境下Django的ALLOWED_HOSTS选项?

8

我总是在Django中使用环境变量设置我的ALLOWED_HOSTS。在我的开发.env文件中,我总是设置ALLOWED_HOSTS=.localhost,.127.0.0.1,而在生产环境下,我设置为ALLOWED_HOSTS=mydomain.dom,my_ip_address

现在我正在熟悉Docker,问题是在生产环境中ALLOWED_HOSTS的值应该是什么。它应该保持为localhost,因为我了解localhost将指向主机容器,还是应该将其设置为我的域名。我正在使用Nginx进行反向代理以转发请求。

4个回答

3
你应该把它设置为你的域名。ALLOWED_HOSTS用于确定请求是否源自正确的域名。
如果你查看ALLOWED_HOSTS的文档,你会发现它与请求的Host头进行比较,该头由访问你网站的用户代理设置。
因此,尽管Docker容器正在本地主机上提供服务,但请求却是从example.com发起的。
查看文档中的这一部分,以确切了解为什么需要主机头验证,你可能会更好地理解ALLOWED_HOSTS的目的。

谢谢。我也记得我可以利用/etc/hosts。https://dev59.com/9rbna4cB1Zd3GeqPYks_#57937075 - theTypan

1
您可以使用常规的域名/IP地址。ALLOWED_HOSTS 与用户头部匹配服务器IP有关,服务器内部机制并不涉及此事。

ALLOWED_HOSTS=mydomain.dom,my_ip_address

你应该选择这个。


谢谢。我也记得我可以利用/etc/hosts。https://dev59.com/9rbna4cB1Zd3GeqPYks_#57937075 - theTypan

1
感谢您的回答,我已经确认这是真的。我想补充一点,这也可以通过将您的域添加到/etc/hosts并指向127.0.0.1来进行确认。如果域名未包含在/etc/hosts中,则Django会抛出调试错误,告诉您该域名未添加到ALLOWED_HOSTS中。

0

在使用 Docker 时,当你正在使用像 Nginx 或 Apache 这样的 Web 服务器时,为该服务器(Nginx、Apache 等)设置配置时,你应该选择一个类似下面的名称作为你的服务器名称,例如在 nginx.conf 文件中:

    server {
       listen       80;
       listen       [::]:80;
       server_name  localhost;
       root         /usr/share/nginx/html;

这个配置文件将localhost映射到您的Docker机器的IP地址, 您可以在Docker容器内运行此命令来确认。
   cat /etc/hosts

在输出中,你应该看到类似这样的内容>
127.21.0.2   localhost

127.21.0.2是容器的IP地址,对你来说可能是不同的东西。

现在在Django项目中,按照以下方式修改settings.py >

import socket
ALLOWED_HOSTS = [socket.gethostbyname('localhost')]

通过这种方式,您可以动态设置ALLOWED_HOSTS,并且Docker容器IP的更改将由容器主机解析器管理。 请注意,将ALLOWED_HOSTS设置为*不是一个好主意 :) 这种方法也适用于uwsgi、gunicorn和任何其他wsgi。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接