Развертывание приложения Django с Nginx, Apache, mod_wsgi


12

У меня есть приложение Django, которое может работать локально с использованием стандартной среды разработки. Теперь я хочу перенести это в EC2 для производства. Документация django предлагает работать с apache и mod_wsgi и использовать nginx для загрузки статических файлов.

Я использую Ubuntu 12.04 на коробке Ec2. Мое приложение Django, "ddt", содержит подкаталог "apache" с 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()

У меня установлен mod_wsgi из apt. Мой apache / httpd.conf содержит

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>

Под apache2 / sites-enabled

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

Если я прав, эти 3 файла выше должны правильно разрешить моему приложению django работать на порте 8080 .

У меня есть следующий файл 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;

Под nginx / sites-enabled

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

Если я прав, эти два файла должны настроить nginx для приема запросов через порт 80 HTTP, а затем направить запросы в apache, на котором запущено приложение django через порт 8080. Если я захожу на mysite.com, все, что я вижу, это Добро пожаловать в Nginx !

Любой совет, как отладить это?


Не могли бы вы опубликовать свой файл nginx.conf? есть некоторая проблема с nginx, который не включает ваш хост, возможно, строка include выглядит так: include /etc/nginx/conf.d/*.conf; и ваш конфигурационный файл не является .conf. В любом случае, если вы видите страницу приветствия nginx, это означает, что ваша конфигурация не применяется.
Андрей Михальцов

Для будущих пользователей я должен отметить, что с появлением mod_wsgi-express нам не нужно делать никаких настроек Apache, никаких определений VirtualHost, ничего в папках conf и sites. Все это сделано оптимизированным способом с помощью mod_wsgi-express автоматически. Подробности смотрите в блоге Грэма
Anupam

Ответы:


1

Пожалуйста , обратите внимание, что вы должны использовать www.mysite.com или mysite.com в запросах (как это определено в конфигурационном файле):

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

но, похоже, вы запрашиваете сайт по localhost или по IP-адресу


0

Прежде всего, пожалуйста, убедитесь, что вы можете получить доступ к своему приложению на 127.0.0.1:8080 и, пожалуйста, опубликуйте содержимое nginx_error.log. Попробуйте скопировать вставку после файла конфигурации nginx и убедитесь, что он работает. Я использую тот же конфиг для моего приложения на 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

В вашей конфигурации NGINX вы указали путь к файлу conf ( /etc/nginx/proxy.conf) внутри a location. Я считаю, что это принадлежит снаружи .


0

Во-первых, пожалуйста, ради любви ко всему святому, не используйте ни nginx, ни httpd. Это будет болью в заднице для отладки.

Во-вторых, нигде в документации я не видел, чтобы они рекомендовали такую ​​настройку.

Используйте apache или nginx, это устранит половину ваших проблем.

Также проверьте ваш nginx.conf, если он не включает файлы из других каталогов, которые могут иметь глобальный vhost, который переопределяет ваш.

Вам также следует отредактировать ваше сообщение, чтобы удалить домен в конфигурации apache рядом с параметрами WSGI, поскольку в данный момент вы производите утечку своих производственных настроек.

Удалить другие сайты с включенных сайтов.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.