2009-03-03 2 views
17

Я хотел бы запустить несколько виртуальных хостов через nginx, каждый из которых обслуживает другое приложение django через fcgi. Это возможно? Если да, у кого-нибудь есть хорошие ресурсы, где/как начать? Документы nginx, по-видимому, в основном являются примерами, но ни одна конкретная конфигурация, которую я пытаюсь ...Как виртуальные серверы nginx + fcgi для django?

ответ

30

В последнее время в настройке nginx появилось два довольно хороших сообщения в блоге, но оба используют nginx для обслуживания статических (или кешированный) и apache + mod_wsgi для обслуживания Django. Я предпочитаю это сам, потому что mod_wsgi делает управление процессами намного проще, чем fcgi (среди других преимуществ).

Во всяком случае, вот посты:

EDIT: хорошо, я откопал старый архивный файл с моими Nginx + Джанго + файлов виртуальных хост-конфигурации из год назад, прежде чем я переключился на apache + mod_wsgi. Это была машина разработки, так что вы хотите, чтобы настроить # рабочих, соединений и т.д.

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

Итак, основной nginx.conf включает в себя каждый файл в vhosts.d /. Один из моих файлов был для сервировки PHP на локальном хосте (вероятно работает PhpMyAdmin), как это:

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

А затем локальный сервер разработки Django, как это:

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

Наконец, каждый о f виртуальные серверы включали fastcgi.conf для каждого местоположения.

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; 

Я не уверен, что все вышеперечисленное требовалось, но это был еще один из причин, почему я перешел на mod_wsgi ... превосходную поддержку и документацию :)

+2

Я никогда не касался такого рода работы, но человек, что ответ. –

0

Поскольку этот вопрос был задан кто-то создали пип устанавливаемой Джанго пакет, который будет генерировать файл Apache или Nginx для вас виртуального хоста с вашего settings.py

pip install django-vhost

Проверьте это здесь: https://bitbucket.org/djangostars/django-vhost

Смежные вопросы