Django ERROR: En-tête HTTP_HOST invalide: u '/ run / monprojetname / gunicorn.sock:'
Je sais qu'il y a beaucoup de questions de ce genre, mais aucun d'entre eux semblent répondre à ma question en particulier.
Je comprends que Django ALLOWED_HOSTS
valeur est de bloquer toutes les requêtes vers le port 80
à mon IP qui ne viennent pas avec les Host:
valeur, et que, lorsqu'une demande qui n'a pas la bonne valeur, Django est en baisse de m'envoyer un courriel. Je connais le la nappe de Nginx hack de faire de ce problème de s'en aller, mais j'essaie de comprendre la nature de la demande et de déterminer si c'est un problème de sécurité j'ai besoin de vous en inquiéter.
Demandes comme ces sens:
[Django] ERROR: Invalid HTTP_HOST header: '203.0.113.1'. You may need to add u'203.0.113.1' to ALLOWED_HOSTS.
Mais ce genre de me reviennent:
[Django] ERROR: Invalid HTTP_HOST header: u'/run/my_project_name/gunicorn.sock:'.
N'est pas ce à dire que le demandeur a envoyé Host: /run/my_project_name/gunicorn.sock
pour le serveur? Si oui, comment ont-ils le nom de chemin d'accès pour mon .sock
fichier? Est mon serveur en quelque sorte une fuite de cette information?
En outre, comme je suis à court de Django 1.6.5, je ne comprends pas pourquoi je suis la réception de ces e-mails à tous, comme ce billet a été marquée fixe pour un certain temps maintenant.
Quelqu'un peut jeter un peu de lumière sur ce que je suis absent?
C'est mon settings.LOGGING
variable:
{
'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
}
Et voici ma config 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;
}
}
}
Enfin, j'ai trouvé ça dans mon nginx journal d'accès. Il correspond à la réception d'un email par le biais de se plaindre à propos de /exécuter/myprojectname/gunicorn.chaussette être un invalide HTTP_HOST en-tête.*
C'était sur une ligne de cours:
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:/"
Évidemment, je ne sais toujours pas ce que cela signifie que 🙁
- Mise à jour #1: Ajout de mon
settings.LOGGING
- Mise à jour #2: Ajout de ma config nginx
- Mise à jour #3: Ajout d'une phrase intéressante de mon nginx journal
- Mise à jour #4: mise à Jour de ma config nginx
source d'informationauteur Daniel Quinn
Vous devez vous connecter pour publier un commentaire.
Semble
doit être changé à
et
server_name
doit être réglé de façon appropriée à l'adresse utilisée pour accéder au serveur. Si vous voulez attraper, vous devez utiliserserver_name www.domainname.com ""
(doc ici).Je ne suis pas certain mais je pense que ce que vous voyez se passe si le client n'envoie pas la
Host:
en-tête. Depuis nginx reçoit pas deHost:
en-tête, pas deHost:
en-tête est transmis jusqu'à gunicorn. À ce stade, je pense que gunicorn remplit leHost:
comme le support le chemin d'accès et indique à Django cela, car c'est la connexion utilisée. À l'aide de$host
et le réglage de laserver_name
dans nginx doit assurer laHost:
est correctement transmis à gunicorn et résoudre ce problème.Comme pour l'e-mail, selon la s'engager dans le billet que vous avez lié, il ressemble e-mails sont toujours envoyés pour être rejetée hôtes. Ajouté le doc était aussi un suggéré un moyen de désactiver les e-mails envoyés:
J'ai vu certains commentaires qui suggèrent que la suppression des e-mails n'est pas une bonne idée, car il n'aborde pas directement la question. La solution la plus efficace que j'ai trouvé est ajoutée à la suite de votre nginx paramètres:
Pour plus d'informations: https://snakeycode.wordpress.com/2015/05/31/django-error-invalid-http_host-header/
Le blog fait référence à cette question.
Je sais que c'est une vieille question, mais la question qui m'est arrivé seulement aujourd'hui. La solution recommandée sur Django docs est d'ajouter un "catch all" nginx serveur dans votre config nginx:
La officiel nginx docs recommander la même solution, donner ou prendre un peu de syntaxe nuances.
De cette façon, la demande ne va pas à django, la connexion devient arrêt immédiatement lors de nginx reçoit une demande mal formulée.