Distribuire l'app Django con Nginx, Apache, mod_wsgi


12

Ho un'app django che può essere eseguita localmente utilizzando l'ambiente di sviluppo standard. Voglio ora spostarlo su EC2 per la produzione. La documentazione di django suggerisce di eseguire con apache e mod_wsgi e di utilizzare nginx per caricare file statici.

Sto eseguendo Ubuntu 12.04 su una scatola Ec2. La mia app Django, "ddt", contiene una sottodirectory "apache" con ddt.wsgi

import os, sys
apache_configuration= os.path.dirname(__file__)
project = os.path.dirname(apache_configuration)
workspace = os.path.dirname(project)
sys.path.append(workspace)
sys.path.append('/usr/lib/python2.7/site-packages/django/')
sys.path.append('/home/jeffrey/www/ddt/')
os.environ['DJANGO_SETTINGS_MODULE'] = 'ddt.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

Ho mod_wsgi installato da apt. Il mio apache / httpd.conf contiene

NameVirtualHost *:8080

WSGIScriptAlias / /home/jeffrey/www/ddt/apache/ddt.wsgi
WSGIPythonPath /home/jeffrey/www/ddt

<Directory /home/jeffrey/www/ddt/apache/>
<Files ddt.wsgi>
Order deny,allow
Allow from all
</Files>
</Directory>

Sotto apache2 / siti abilitato

<VirtualHost *:8080>
ServerName www.mysite.com
ServerAlias mysite.com
<Directory /home/jeffrey/www/ddt/apache/>
    Order deny,allow
    Allow from all
</Directory>
LogLevel warn
ErrorLog  /home/jeffrey/www/ddt/logs/apache_error.log
CustomLog /home/jeffrey/www/ddt/logs/apache_access.log combined
WSGIDaemonProcess datadriventrading.com user=www-data group=www-data threads=25
WSGIProcessGroup datadriventrading.com
WSGIScriptAlias / /home/jeffrey/www/ddt/apache/ddt.wsgi
</VirtualHost>

Se ho ragione, questi 3 file sopra dovrebbero consentire alla mia app django di funzionare sulla porta 8080 .

Ho il seguente file nginx / proxy.conf

proxy_redirect              off;
proxy_set_header            Host $host;
proxy_set_header            X-Real-IP $remote_addr;
proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size        10m;
client_body_buffer_size     128k;
proxy_connect_timeout       90;
proxy_send_timeout          90;
proxy_read_timeout          90;
proxy_buffer_size           4k;
proxy_buffers               4 32k;
proxy_busy_buffers_size     64k;
proxy_temp_file_write_size  64k;

In nginx / siti abilitato

server {
  listen 80;
  server_name www.mysite.com mysite.com;
  access_log /home/jeffrey/www/ddt/logs/nginx_access.log;
  error_log /home/jeffrey/www/ddt/logs/nginx_error.log;
  location / {
    proxy_pass http://127.0.0.1:8080;
    include     /etc/nginx/proxy.conf;
  }
  location  /media/ {
   root /home/jeffrey/www/ddt/;
  }
}      

Se ho ragione, questi due file dovrebbero configurare nginx per accettare le richieste sulla porta HTTP 80, ma quindi indirizzare le richieste ad apache che esegue l'app django sulla porta 8080. Se vado a mysite.com, tutto ciò che vedo è benvenuto in Nginx !

Qualche consiglio su come eseguire il debug di questo?


Potresti pubblicare il tuo file nginx.conf? c'è qualche problema con nginx che non abilita il tuo host, forse include line è come include /etc/nginx/conf.d/*.conf; e il tuo file di configurazione non è .conf. Ad ogni modo se vedi la pagina di benvenuto di nginx significa che la tua configurazione non è applicata.
Andrei Mikhaltsov,

Per i futuri utenti, dovrei menzionare che con l'avvento di mod_wsgi-express, non abbiamo bisogno di fare alcuna configurazione di Apache, nessuna definizione di VirtualHost, niente nelle cartelle conf e siti. È tutto fatto in modo ben ottimizzato da mod_wsgi-express automaticamente. Vedi i post sul blog di Graham per i dettagli
Anupam

Risposte:


1

si noti che è necessario utilizzare www.mysite.com o mysite.com nelle richieste (come definito nel file di configurazione):

server {
  listen 80;
  server_name www.mysite.com mysite.com;

ma sembra che stai richiedendo il sito per localhost o per indirizzo IP


0

Prima di tutto assicurati di poter accedere alla tua applicazione su 127.0.0.1:8080 e pubblica il contenuto di nginx_error.log. Prova a Copia incolla seguendo il file conf di nginx e verifica che funzioni. Sto usando la stessa configurazione per la mia applicazione Python.

user www-data;
worker_processes 4;
pid /var/run/nginx.pid;

events {
    worker_connections 768;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";


    ##
    # Virtual Host Configs
    ##

    server {
        listen 80;

        location / {
            proxy_pass_header Server;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Scheme $scheme;
            proxy_pass http://127.0.0.1:8080;
        }

    location /static {
        root /home/ubuntu/www/myproject/webapp;
    }

    }


    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

}

0

Nella tua configurazione NGINX, hai incluso il percorso del file conf ( /etc/nginx/proxy.conf) all'interno di a location. Credo che appartenga all'esterno .


0

In primo luogo, per favore, per l'amore di tutto ciò che è santo, non usare sia nginx che httpd. Questo sarà un dolore nel culo per il debug.

In secondo luogo, in nessun documento ho visto che raccomandano questo tipo di installazione.

Usa apache o nginx, questo eliminerà la metà dei tuoi problemi.

Controlla anche il tuo nginx.conf se non include file da altre directory, che potrebbero avere un vhost globale che sovrascrive il tuo.

Dovresti anche modificare il tuo post per rimuovere il dominio in apache config vicino ai parametri WSGI, poiché stai perdendo la tua configurazione di produzione.

Rimuovere altri siti da siti abilitati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.