2008-10-01 16 views
10

Estoy ejecutando un sitio de Django utilizando la interfaz de fastcgi para nginx. Sin embargo, algunas páginas se sirven truncadas (es decir, el origen de la página simplemente se detiene, a veces en el medio de una etiqueta). ¿Cómo puedo solucionar este problema (que me haga saber qué información adicional se necesita, y lo voy a publicar)Problema de truncamiento de Nginx + fastcgi

Detalles:

estoy usando flup, y el desove el servidor fastcgi con el siguiente comando:

python ./manage.py runfcgi umask=000 maxchildren=5 maxspare=1 minspare=0 method=prefork socket=/path/to/runfiles/django.sock pidfile=/path/to/runfiles/django.pid 

La configuración de nginx es el siguiente:

# search and replace this: {project_location} 
pid /path/to/runfiles/nginx.pid; 
worker_processes 2; 
error_log /path/to/runfiles/error_log; 
events { 
    worker_connections 1024; 
    use epoll; 
} 
http { 
    # default nginx location 
    include  /etc/nginx/mime.types; 
    default_type application/octet-stream; 
    log_format main 
     '$remote_addr - $remote_user [$time_local] ' 
      '"$request" $status $bytes_sent ' 
     '"$http_referer" "$http_user_agent" ' 
     '"$gzip_ratio"'; 
    client_header_timeout 3m; 
    client_body_timeout 3m; 
    send_timeout   3m; 
    connection_pool_size  256; 
    client_header_buffer_size 1k; 
    large_client_header_buffers 4 2k; 
    request_pool_size  4k; 
    output_buffers 4 32k; 
    postpone_output 1460; 
    sendfile  on; 
    tcp_nopush    on; 
    keepalive_timeout  75 20; 
    tcp_nodelay   on; 
    client_max_body_size  10m; 
    client_body_buffer_size 256k; 
    proxy_connect_timeout  90; 
    proxy_send_timeout   90; 
    proxy_read_timeout   90; 
    client_body_temp_path  /path/to/runfiles/client_body_temp; 
    proxy_temp_path   /path/to/runfiles/proxy_temp; 
    fastcgi_temp_path   /path/to/runfiles/fastcgi_temp; 
    gzip on; 
    gzip_min_length 1100; 
    gzip_buffers  4 32k; 
    gzip_types  text/plain text/html application/x-javascript text/xml text/css; 
    ignore_invalid_headers on; 
    server { 
     listen 80; 
     server_name alpha2.sonyalabs.com; 
     index index.html; 
     root /path/to/django-root/static; 
     # static resources 
     location ~* ^/static/.*$ 
     { 
     root /path/to/django-root; 
       expires 30d; 
       break; 
     } 
     location/{ 
      # host and port to fastcgi server 
      fastcgi_pass unix:/path/to/runfiles/django.sock; 
      fastcgi_param PATH_INFO $fastcgi_script_name; 
      fastcgi_param REQUEST_METHOD $request_method; 
      fastcgi_param QUERY_STRING $query_string; 
      fastcgi_param CONTENT_TYPE $content_type; 
      fastcgi_param CONTENT_LENGTH $content_length; 
      fastcgi_pass_header Authorization; 
      fastcgi_intercept_errors off; 
     } 
     location /403.html { 
       root /usr/local/nginx; 
       access_log off; 
     } 
     location /401.html { 
       root /usr/local/nginx; 
       access_log off; 
     } 
     location /404.html { 
       root /usr/local/nginx; 
       access_log off; 
     } 
     location = /_.gif { 
        empty_gif; 
       access_log off; 
     } 
      access_log /path/to/runfiles/localhost.access_log main; 
      error_log /path/to/runfiles/localhost.error_log; 
     } 
} 

Respuesta

3

interfaz fastcgi lo que está usando y cómo. ¿Es flup? En caso afirmativo, pega la forma en que engendras el servidor y cómo está enganchado en nginx. Sin esa información, es solo adivinar qué podría salir mal.

problemas posibles:

  • Nginx está libre de errores. Al menos lighttpd tiene horribles errores fastcgi, no me gustaría saber si nginx también tiene alguno :)
  • Django está muriendo con un rastreo en un sistema interno que no está apropiadamente atrapado y cierra el servidor fastcgi del que no se puede ver el cliente. En esa situación envuelva la llamada de la aplicación del servidor fastcgi y pruebe/excepto para imprimir la excepción.

Pero el registro y la configuración del servidor serían geniales.

+0

He actualizado la descripción con más información. ¿Te importaría echar un vistazo y decirme qué ves? – Silas

+0

Armin, ¿te importaría publicar información sobre los errores de FastCGI en nginx y lighttpd? En este sitio, "Apache o lighttpd" y "Configuración del servidor más limpia y rápida para Django" podrían usar ese conocimiento. – akaihola

0

estoy corriendo configuraciones muy similar a este, tanto en mi servicio de hosting (Webfaction) y en el servidor dev Ubuntu local y no veo ningún problema. Supongo que es un tiempo de espera o un búfer completo que está causando esto.

¿Se puede publicar el resultado del registro de errores nginx? ¿Qué versión de nginx estás usando?

Como nota al margen, puede valer la pena mirar django-logging para descubrir lo que está haciendo su proceso fastcgi.

5

Revise los registros de errores para errores de "Permiso denegado" al .../nginx/tmp/.... Nginx funcionará bien a menos que necesite espacio temporal, y eso normalmente ocurre en límites de 32 K. Si encuentra estos errores, asegúrese de que el directorio tmp sea editable por el usuario que nginx ejecuta como.

+1

Esta es la pista correcta. Permítanme agregar que puede obtener el mismo resultado si se queda sin espacio en disco. –

+0

@JanRychter - gracias Jan, me estaba rascando la cabeza con este problema hasta que leí tu comentario! – codebox

7

Tuve el mismo problema al ejecutar Nagios en nginx. Me topé con su pregunta mientras que buscando en Google por una respuesta, y la lectura de "permiso denegado" respuestas relacionadas se me ocurrió (y tal vez que le ayudará a):

  • error Nginx.registro estaba informando:

    2011/03/07 11:36:02 [crit] 30977 # 0: * 225952 abrir() "/ var/lib/nginx/fastcgi/2/65/0000002652" fallido (13: permiso denegado)

  • por lo que sólo corrió # chown -R www-data: www-data/var/lib/nginx/fastcgi

  • fijo! (y gracias por su ayuda indirecta)

2

FastCGI no tiene la culpa de esto.

Me encontré con exactamente el mismo problema usando nginx/gunicorn. Reducir el tamaño de respuesta a menos de 32k (en el caso específico usando la etiqueta spaceless en la plantilla) lo resolvió.

Como dice dwc, es probable que sea un límite difícil debido a la forma en que nginx usa el espacio de direcciones.

Cuestiones relacionadas