Pregunta

Me gustaría ejecutar varios hosts virtuales a través de nginx, cada uno con una aplicación django diferente a través de fcgi. es posible? Si es así, ¿alguien tiene buenos recursos sobre dónde / cómo comenzar? Los documentos nginx parecen ser en su mayoría ejemplos, pero ninguna de las configuraciones particulares que estoy intentando ...

¿Fue útil?

Solución

Últimamente ha habido dos publicaciones de blog bastante buenas sobre la configuración de nginx, pero ambas están usando nginx para servir contenido estático (o en caché) y apache + mod_wsgi para servir Django. Yo prefiero esto porque mod_wsgi hace que la gestión de procesos sea mucho más fácil que fcgi (entre otras ventajas).

De todos modos, aquí están las publicaciones:

EDITAR: ok saqué un viejo archivo tar con mis archivos de configuración de host virtual nginx + django + de hace un año antes de cambiarme a apache + mod_wsgi. Esta era una máquina de desarrollo, por lo que querrá ajustar el número de trabajadores, conexiones, etc.

nginx.conf:

user nginx nginx;
worker_processes 2;

error_log /var/log/nginx/error_log info;

events {
    worker_connections  1024;
    use epoll;
}

http {
    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;

gzip on;
gzip_min_length 1100;
gzip_buffers    4 32k;
gzip_types      text/plain text/html application/x-javascript text/xml text/css;

output_buffers  4 32k;
postpone_output 1460;

sendfile        on;
tcp_nopush      on;
tcp_nodelay     on;

keepalive_timeout       75 20;

ignore_invalid_headers  on;

include vhosts.d/*.conf;
}

Entonces, el nginx.conf principal incluye todos los archivos en el subdirectorio vhosts.d /. Uno de mis archivos era para servir PHP en localhost (probablemente ejecutaba phpMyAdmin) de esta manera:

vhosts.d/00_localhost:

server {

  listen 127.0.0.1:80;
  server_name localhost;

  access_log /var/log/nginx/localhost.access_log main;
  error_log /var/log/nginx/localhost.error_log info;

  root /var/www/localhost/htdocs;
  index index.php index.html index.htm;

    location ~ .php$ {
        fastcgi_pass   127.0.0.1:8888;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/localhost/htdocs$fastcgi_script_name;
        fastcgi_param  QUERY_STRING     $query_string;
        fastcgi_param  REQUEST_METHOD   $request_method;
        fastcgi_param  CONTENT_TYPE     $content_type;
        fastcgi_param  CONTENT_LENGTH   $content_length;
  }
}

Y luego un servidor de desarrollo local de Django como este:

50_django.local:

server {

  listen  80;
  server_name django.local;

  access_log /var/log/nginx/django.access.log main;
  error_log /var/log/nginx/django.error.log info;

  root /var/www/django.local;

  location ~* ^.+\.(mpg|avi|mp3|swf|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|txt|tar|mid|midi|wav|rtf|mpeg)$ {
    access_log off;
    break;
  }

  location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|bmp|js)$ {
    expires 30d;
    break;
  }

  location / {
    fastcgi_pass unix:/var/www/django.local/server.sock;
    include fastcgi.conf;
  }

  location ^~ /admin/ {
    fastcgi_pass unix:/var/www/django.local/server.sock;
    include fastcgi.conf;
    access_log off;
    auth_basic "Welcome to admin";
  }
}

Finalmente, cada uno de los servidores virtuales incluyó un fastcgi.conf para cada ubicación.

fastcgi.conf:

fastcgi_pass_header Authorization;
fastcgi_intercept_errors off;

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_param SERVER_PORT       $server_port;
fastcgi_param SERVER_PROTOCOL   $server_protocol;
fastcgi_param SERVER_NAME       $server_name;

fastcgi_param REQUEST_URI       $request_uri;
fastcgi_param DOCUMENT_URI      $document_uri;
fastcgi_param DOCUMENT_ROOT     $document_root;
fastcgi_param SERVER_ADDR       $server_addr;
fastcgi_param REMOTE_USER       $remote_user;
fastcgi_param REMOTE_ADDR       $remote_addr;
fastcgi_param REMOTE_PORT       $remote_port;
fastcgi_param SERVER_SOFTWARE   "nginx";
fastcgi_param GATEWAY_INTERFACE "CGI/1.1";

fastcgi_param UID_SET           $uid_set;
fastcgi_param UID_GOT           $uid_got;

No estoy seguro de que todo lo anterior fuera necesario, pero esa fue otra de las razones por las que cambié a mod_wsgi ... soporte y documentación superiores :)

Otros consejos

Dado que se hizo esta pregunta, alguien creó un paquete django instalable pip que generará un archivo vhost apache o nginx para usted desde su settings.py

pip install django-vhost

Échale un vistazo aquí: https://bitbucket.org/djangostars/django-vhost

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top