2011-11-04 15 views
9

responsabilidad:Missing encabezado personalizado con Django, nginx y gunicorn

estoy trabajando en un proyecto en el que existe un "enorme" aplicación web que tiene una API para los móviles, por lo que cambiar la API no es una opción.

Esta aplicación fue desarrollada hace tiempo y varios desarrolladores han trabajado en él,

Dicho esto, el problema es el siguiente;

en la API para el móvil de este sitio (sólo puntos de vista que los retornos de datos JSON), el código está en busca de una ficha, pero lo hace en las cabeceras de solicitud:

token = request.META.get('HTTP_TOKEN') 

Cuando la prueba esta API a nivel local, funciona bien, pero en producción no lo hace, entonces, intento averiguar qué está pasando y encontré esto:

django convierte encabezados, incluso encabezados personalizados en claves en request.META, utilizo urllib2 y requests para probar el api y el problema en la producción es que en el servidor de producción el request.META nunca tiene una clave llamada HTTP_TOKEN, entonces, haciendo un poco de depuración I s Creo que el problema es la forma en que servimos la aplicación django.

Estamos usando django1.3, nginx, gunicorn, virtualenvwrapper, python2.7.

Mi principal sospechoso es nginx, creo que, de alguna manera, nginx recibe el encabezado pero no lo reenvío a django, intento investigar un poco sobre esto, pero solo encontré información sobre encabezados de seguridad y encabezados personalizados de nginx, pero no encuentro el documento o algo sobre cómo decirle a nginx que permite ese encabezado y no lo elimine.

Necesito ayuda aquí, lo primero es probar si nginx recibe el encabezado, pero sé un poco sobre nginx y no sé cómo decirle que registre los encabezados de las solicitudes.

Gracias

Actualizar

nginx conf file

+1

¿Puede probar esa suposición? Registra una solicitud desde nginx y django, y asegúrate de que haya una diferencia en los encabezados HTTP. –

+0

En parte ese es el problema, en las pruebas, un script que usa urllib2 y solicita que defina los encabezados que envío, en la vista imprimo los encabezados que recibo, en desarrollo servidor, los encabezados están bien, pero en producción django no recibe Encabezado HTTP_TOKEN. – diegueus9

+0

Con eso estoy buscando una manera de decir a los encabezados de solicitud de impresión de nginx, pero el documento es un poco horrible – diegueus9

Respuesta

4

Si se accede a Django usando uwsgi_pass, a continuación, en el lugar correspondiente (s) ...

# All request headers should be passed on by default  
# Make sure "Token" response header is passed to user 
uwsgi_pass_header Token; 

Si se accede a Django usando fastcgi_pass, a continuación, en el lugar correspondiente (s) ...

# All request headers should be passed on by default  
# Make sure "Token" response header is passed to user 
fastcgi_pass_header Token; 

Si se accede a Django usando PROXY_PASS, a continuación, en el lugar correspondiente (s) ...

# All request headers should be passed on by default 
# but we can make sure "Token" request header is passed to Django 
proxy_set_header Token $http_token; 

# Make sure "Token" response header is passed to user 
proxy_pass_header Token; 

Estos deben ayudar a eliminar la posibilidad de que Nginx no esté pasando cosas de tu problema.

+0

Esto es con gunicorn de archivo de configuración nginx? – diegueus9

+0

Suponiendo que haya querido decir "gunicornio o ...", la respuesta es que estas son directivas nginx. ubiquitousthey te dio algunos enlaces antes. – Dayo

+1

En una nota interesante, personalmente he tenido problemas al pasar encabezados cuyo nombre contiene caracteres de subrayado cuando se usa uwsgi_pass_header. Por ejemplo, el encabezado AUTH_TOKEN nunca llegaría a Django cuando se utiliza AUTHTOKEN. – stephenmuss

2

creo que esto es lo que necesita:

log_format combined '$remote_addr - $remote_user [$time_local] ' 
        '"$request" $status $body_bytes_sent ' 
        '"$http_referer" "$http_user_agent" "$http_http_token" "$upstream_http_http_token"' 

para iniciar la sesión lo que está sucediendo.

Puede profundizar en la sección proxy_set_header en el módulo proxy ascendente para ver cómo pasar los encabezados que necesita.

Puede encontrar la documentación aquí:

La última entrada parece indicar que nginx pasa la mayor parte de los encabezados de forma predeterminada

2

No se ha encontrado una respuesta real, pero pude hacer una solución. Estaba teniendo el mismo problema con los encabezados estándar de RFC if-none-match y if-modified-since, por lo que mi solución se prueba para esos encabezados.

añadido a Mi configuración nginx:

uwsgi_param HTTP_IF_NONE_MATCH $http_if_none_match; 
uwsgi_param HTTP_IF_MODIFIED_SINCE $http_if_modified_since; 

No puedo explicar por qué nginx se niega a pasar estos encabezados para uwsgi por defecto. Esta configuración lo fuerza. Las páginas generan 304 segn sea apropiado ahora.

Para la pregunta inicial acerca de la no-estándar "señal" de cabecera, esto debe hacer el truco:

uwsgi_param HTTP_TOKEN $http_token; 
3

En el archivo de configuración de nginx (Fe mysite_nginx.conf) en la sección deservidor agregue este parámetro: uwsgi_pass_request_headers on;.

Por ejemplo:

server { 
    # the port your site will be served on 
    listen  8000; 

    ... 

    underscores_in_headers on; 
} 

Y si el acceso a Django pasa por uwsgi_pass, es necesario agregar un parámetro este uwsgi_pass_request_headers on; en ubicación sección.

Por ejemplo:

location/{ 
    include  /etc/nginx/uwsgi_params; # the uwsgi_params file you installed 
    uwsgi_pass_request_headers on; 
    uwsgi_pass django; 
} 
Cuestiones relacionadas