come nginx server virtuali + fcgi per django?
Domanda
Vorrei eseguire diversi host virtuali tramite nginx, ognuno con un'app django diversa tramite fcgi. È possibile? In tal caso, qualcuno ha buone risorse su dove / come iniziare? I documenti nginx sembrano essere principalmente esempi, ma nessuna delle configurazioni particolari che sto tentando ...
Soluzione
Di recente ci sono stati due post di blog piuttosto buoni sulla configurazione di nginx, ma entrambi utilizzano nginx per pubblicare contenuti statici (o memorizzati nella cache) e apache + mod_wsgi per servire Django. Lo preferisco io stesso perché mod_wsgi rende la gestione dei processi molto più semplice di fcgi (tra gli altri vantaggi).
Comunque, ecco i post:
EDIT: ok Ho estratto un vecchio file tar con i miei file nginx + django + virtual host config di un anno fa prima di passare ad apache + mod_wsgi. Questa era una macchina di sviluppo, quindi ti consigliamo di regolare # di lavoratori, 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;
}
Quindi, il nginx.conf principale include tutti i file nella sottodirectory vhosts.d /. Uno dei miei file era per servire PHP su localhost (probabilmente stava eseguendo phpMyAdmin) in questo modo:
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 come questo:
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, ciascuno dei server virtuali includeva 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 di aver richiesto tutto quanto sopra, ma questo era un altro dei motivi per cui sono passato a mod_wsgi ... supporto e documentazione superiori :)
Altri suggerimenti
Da quando questa domanda è stata posta qualcuno ha creato un pacchetto django installabile pip che genererà un file vhost apache o nginx per te dalle tue impostazioni.py
pip installa django-vhost
Dai un'occhiata qui: https://bitbucket.org/djangostars/django-vhost