2009-03-03 14 views
17

Vorrei eseguire diversi host virtuali tramite nginx, ognuno dei quali serve una diversa app django tramite fcgi. È possibile? Se sì, qualcuno ha buone risorse su dove/come iniziare? I documenti nginx sembrano essere per lo più esempi, ma nessuno della particolare configurazione che sto tentando ...come server virtuali nginx + fcgi per django?

risposta

30

Ultimamente ci sono stati due post di blog piuttosto buoni sull'impostazione di nginx, ma entrambi stanno utilizzando nginx per servire static (o contenuto nella cache) e apache + mod_wsgi per servire Django. Preferisco questo perché mod_wsgi rende la gestione dei processi molto più semplice di fcgi (tra gli altri vantaggi).

In ogni caso, qui i post:

EDIT: ok ho tirato fuori un vecchio file tar con i miei nginx + Django + virtuali file di configurazione host da un un anno fa sono passato ad apache + mod_wsgi. Questa è stata una macchina di sviluppo, per cui ti consigliamo di regolare # dei lavoratori, delle connessioni, ecc

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; 
} 

Così, il nginx.conf principale include ogni file nella vhosts.d/subdirectory. Uno dei miei file è stato per servire PHP su localhost (probabilmente in esecuzione phpMyAdmin) come questo:

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; 
    } 
} 

E poi un server di sviluppo Django locale, in questo modo:

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"; 
    } 
} 

Infine, ogni o f i server virtuali includevano un fastcgi.conf per ogni posizione.

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; 

Non sono sicuro che tutto quanto sopra dovevano, ma quello era un altro dei motivi per cui ho passato a mod_wsgi ... supporto superiore e la documentazione :)

+2

non ho mai toccato questo tipo di lavoro, ma l'uomo, quello che una risposta. –

0

dal momento che questa domanda è stato chiesto qualcuno ha creato un pacchetto installabile Django pip che genererà un file Apache o nginx vhost per voi dal vostro settings.py

pip install django-vhost

verificarlo qui: https://bitbucket.org/djangostars/django-vhost

Problemi correlati