我知道在SO上有很多这样的问题,但是似乎没有一个问题可以回答我的特定问题。

我知道Django的ALLOWED_HOSTS值阻止了我IP上没有适当80值的端口Host:的任何请求,并且当请求传入的值不正确时,Django将向我发送电子邮件。我也知道使此问题消失的slick Nginx hack,但我试图理解这样一个请求的性质,并确定这是否是我需要担心的安全性问题。

这样的请求很有意义:

[Django] ERROR: Invalid HTTP_HOST header: '203.0.113.1'.  You may need to add u'203.0.113.1' to ALLOWED_HOSTS.

但是,这让我很害怕:
[Django] ERROR: Invalid HTTP_HOST header: u'/run/my_project_name/gunicorn.sock:'.

这是否意味着请求者已将Host: /run/my_project_name/gunicorn.sock发送到服务器?如果是这样,它们如何具有我的.sock文件的路径名?我的服务器是否以某种方式泄漏了此信息?

另外,在我运行Django 1.6.5时,我根本不明白为什么我会收到这些电子邮件,因为this ticket已经被标记为固定了一段时间。

有人可以阐明我的缺失吗?

这是我的settings.LOGGING变量:
{
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {'()': 'django.utils.log.RequireDebugFalse'}
    },
    'formatters': {
        'simple': {'format': '%(levelname)s %(message)s'},
        'verbose': {'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'}
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
            'level': 'DEBUG'
        },
        'mail_admins': {
            'class': 'django.utils.log.AdminEmailHandler',
            'filters': ['require_debug_false'],
            'level': 'ERROR'
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True
        },
        'my_project_name': {
            'handlers': ['console'],
            'level': 'DEBUG'
        }
    },
    'version': 1
}

这是我的nginx配置:
worker_processes 1;
pid /run/nginx.pid;
error_log /var/log/myprojectname/nginx.error.log debug;
events {
}
http {
  include mime.types;
  default_type application/octet-stream;
  access_log /var/log/myprojectname/nginx.access.log combined;
  sendfile on;
  gzip on;
  gzip_http_version 1.0;
  gzip_proxied any;
  gzip_min_length 500;
  gzip_disable "MSIE [1-6]\.";
  gzip_types text/plain text/html text/xml text/css
             text/comma-separated-values
             text/javascript application/x-javascript
             application/atom+xml;
  upstream app_server {
    server unix:/run/myprojectname/gunicorn.sock fail_timeout=0;
  }
  server {
    listen 80 default;
    listen [::]:80 default;
    client_max_body_size 4G;
    server_name myprojectname.mydomain.tld;
    keepalive_timeout 5;
    root /var/www/myprojectname;
    location / {
      try_files $uri @proxy_to_app;
    }
    location @proxy_to_app {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $host;
      proxy_redirect off;
      proxy_pass http://app_server;
    }
    error_page 500 502 503 504 /500.html;
    location = /500.html {
      root /tmp;
    }
  }
}

最后,我在nginx访问日志中找到了这个。它对应于抱怨/run/myprojectname/gunicorn.sock是无效的HTTP_HOST header 的电子邮件。*

当然,这全都在一行上:
2014/09/05 20:38:56 [info] 12501#0: *513 epoll_wait() reported that client
prematurely closed connection, so upstream connection is closed too while sending
request to upstream, client: 54.84.192.68, server: myproject.mydomain.tld, request:
"HEAD / HTTP/1.0", upstream: "http://unix:/run/myprojectname/gunicorn.sock:/"

显然我仍然不知道这是什么意思:-(
  • 更新#1 :添加了我的settings.LOGGING
  • 更新#2 :添加了我的Nginx配置
  • 更新#3 :从我的nginx日志
  • 中添加了一条有趣的行
  • 更新#4 :更新了我的Nginx配置
  • 最佳答案

    看起来像

    proxy_set_header Host $http_host
    

    should be changed
    proxy_set_header Host $host
    

    并将server_name should be set appropriately更改为用于访问服务器的地址。如果要全部捕获,则应使用server_name www.domainname.com ""(doc here)。

    我不确定,但是我认为如果客户端不发送Host: header ,您会看到什么。由于nginx没有收到Host: header ,因此没有Host: header 传递给gunicorn。在这一点上,我认为gunicorn将Host:填充为套接字路径,并告诉Django,因为这就是所使用的连接。使用$host并在nginx中设置server_name应该确保Host:正确传递给gunicorn并解决此问题。

    至于电子邮件,根据您链接的票证中的commit,看来仍在向禁止的主机发送电子邮件。添加到文档中的还有一个suggested a way to disable the emails being sent:
        'loggers': {
            'django.security.DisallowedHost': {
            'handlers': ['null'],
            'propagate': False,
        },
    

    关于django - Django错误:无效的HTTP_HOST header :u'/run/myprojectname/gunicorn.sock:',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25370868/

    10-15 17:49