如何在生产环境中使用Docker时设置ALLOWED_HOSTS Django设置?

osh3o9ms  于 2023-07-01  发布在  Go
关注(0)|答案(4)|浏览(110)

我总是在Django的环境变量中设置我的ALLOWED_HOSTS。在开发.env时,我总是设置ALLOWED_HOSTS=.localhost,.127.0.0.1,而在生产环境中设置ALLOWED_HOSTS=mydomain.dom,my_ip_address
现在我正在熟悉Docker,问题是ALLOWED_HOSTS在生产中的价值是什么。它是否应该保持为localhost,因为我知道localhost将引用主机容器,或者我应该将其设置为我的域。我使用Nginx作为反向代理来转发请求。

mbskvtky

mbskvtky1#

您应该将其设置为您的域。ALLOWED_HOSTS用于确定请求是否来自正确的域名。
如果查看ALLOWED_HOSTS的文档,您将看到它与请求的Host头进行比较,该头由访问您站点的用户的User代理设置。
因此,尽管Docker容器是为自己的本地主机服务的,但请求是从example.com发出的
请查看文档的这一部分,了解为什么主机头验证是必要的,您可能会更好地理解ALLOWED_HOSTS的用途。

hrysbysz

hrysbysz2#

您可以使用您的常规域/IP地址。ALLOWED_HOSTS与匹配服务器IP的用户头有关。服务器上的内部机制不是它所关心的。
ALLOWED_HOSTS=mydomain.dom,my_ip_address
你就该这么说。

j1dl9f46

j1dl9f463#

谢谢你的回答,我证实了这是真的。我想补充的是,我还记得这可以通过将您的域添加到/etc/hosts指向127.0.0.1来确认。如果该域未包含在/etc/hosts中,Django将抛出一个调试错误,告诉您该域未添加到ALLOWED_HOSTS

insrf1ej

insrf1ej4#

在使用Docker时,当您使用Nginx或Apache等WebServer时,为该服务器(Nginx,Apache,...)设置配置时,您应该为服务器选择一个名称,如下所示,例如在nginx.conf中>

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

这个配置文件会将localhostMap到你的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 contaier ip的变化将由container host resolver管理。
注意,将ALLOWED_HOSTS设置为 * 并不是一个好主意:)
此方法也适用于uwsgigunicorn和任何其他wsgi

相关问题