2014-02-23 8 views
9

Nachdem ich meine Django App letzte Nacht im Einsatz Ich habe jede Menge seltsame E-Mails sagen:ERROR: Ungültige HTTP_HOST header: ‚/webapps/../gunicorn.sock‘

ERROR: Invalid HTTP_HOST header: '/webapps/example_com/run/gunicorn.sock 

ich bin sicher, das ist irgendwie im Zusammenhang mit der folgenden nginx config:

upstream example_app_server { 
    server unix:/webapps/example_com/run/gunicorn.sock fail_timeout=0; 
} 

server { 

    listen 80; 
    server_name example.com; 

    client_max_body_size 4G; 

    access_log /webapps/example_com/logs/nginx-access.log; 
    error_log /webapps/example_com/logs/nginx-error.log; 


    location/{ 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

     proxy_set_header Host $http_host; 

     proxy_redirect off; 

     if (!-f $request_filename) { 
      proxy_pass http://example_app_server; 
      break; 
     } 
    } 
} 

Antwort

18

fand ich die Antwort auf meine meine Frage in einem Bericht django Fehler.

proxy_set_header Host $http_host; 

hat mit ausgewechselt werden:

proxy_set_header Host $host; 

zu nginx die richtigen Header aus, dass auf anstelle der gunicorn Buchse machen passieren die angeforderte Seite in der django Warnungen war.

+1

Könnten Sie bitte einen Verweis auf den Bug-Report verknüpfen und jede mögliche zusätzliche Informationen wie die erste verursacht das Problem _why_? Ich habe den ersten Ansatz auf mehreren Websites verwendet und hatte nie ein Problem. Eine meiner letzten Websites ist jedoch betroffen. – Andre

+3

@Andre, habe ich über http://search.aol.com/aol/search?q=proxy_set_header+site%3Acode.djangoproject.com&s_it=opensearch gesucht. und https://code.djangoproject.com/ticket/19867 scheint der eine zu sein, achten Sie auf den letzten Kommentar. – flyingfoxlee

+0

Danke @flyingfoxlee Ich werde das auf unserer nächsten Iteration testen. :) – Andre

1

This person erklärt ein bisschen mehr, was vorgeht, basierend auf dem gleichen Beitrag. Hier ist seine/ihre Erklärung:

...when a request is made to the server and the HTTP Host is empty, nginx sets the HTTP host to the gunicorn sock.

I can generate this error using curl:

curl -H "HOST:" MY_DOMAIN_NAME -0 -v 

This sends a request without a HTTP Host. The -0 causes curl to use HTTP version 1.0. If you do not set this, the request will use HTTP version 1.1, which will cause the request to be rejected immediately and not generate the error.

The solution is to replace $http_host with $host (as pointed out on Stackoverflow). When HTTP Host is missing, $host will take on the value of the “server_name” directive. This is a valid domain name and is the one that should be used.