【发布时间】:2014-10-11 19:30:35
【问题描述】:
我知道在 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 标头的电子邮件。*
当然,这一切都在一条线上:
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 配置
【问题讨论】: