Назад | Перейти на главную страницу

почему проект django не удалось развернуть? - джанго + nginx + uwsgi

Я пытаюсь развернуть проект Django через Nginx и uWSGI. Если я запустил проект вручную, python manage.py runserver :8000 он работает нормально, так что я думаю, проблема не в самом проекте.

Я установил Django и зависимости внутри выделенного виртуального окружения и поместил в него проект. Я также установил nginx и uwsgi ВНЕ виртуального окружения и начал создавать файлы конфигурации:

/etc/nginx/sites-available/myproject (символическая ссылка на сайтах с поддержкой):

upstream uwsgi_myproject {
    server 127.0.0.1:5678;
}

server {
    listen 80;
    server_name my.url.net;
    set $home /path/to/myvirtualenv;
    access_log /path/to/myvirtualenv/log/access_uwsgi.log;
    error_log /path/to/myvirtualenv/log/error_uwsgi.log;

    client_max_body_size 10m;
    keepalive_timeout 120;

    location / {
        uwsgi_pass uwsgi_myproject;
        include uwsgi_params;
        gzip on;
        uwsgi_param UWSGI_CHDIR $home/path/to/myproject;
        uwsgi_param UWSGI_SCRIPT uwsgi;
        uwsgi_param UWSGI_PYHOME $home;
        root $home;
    }
    location /static/  {
        alias /path/to/myvirtualenv/path/to/myproject/static/;
        expires max;
        autoindex off;
    }
    location /media_adm/  {
        alias /path/to/myvirtualenv/lib/python2.7/site-packages/grappelli/static/;
        autoindex off;
    }
}

/etc/init/uwsgi_myproject.conf:

description "uWSGI starter for myproject"

start on (local-filesystems and runlevel [2345])
stop on runlevel [016]

respawn

exec /path/to/myvirtualenv/bin/uwsgi \
--uid venvowner \
--home /path/to/myvirtualenv \
--pythonpath /path/to/myvirtualenv/path/to/myproject/ \
--socket 127.0.0.1:5678 \
--chmod-socket \
--module wsgi \
-b 8192 \
--logdate \
--optimize 2 \
--processes 2 \
--master \
--logto /path/to/myvirtualenv/log/uwsgi.log

/path/to/myvirtualenv/path/to/myproject/wsgi.py:

import os, sys, site

site.addsitedir('/path/to/myvirtualenv/lib/python2.7/site-packages')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

Затем я перезагрузил компьютер и попытался подключиться к my.url.net, но ответа нет (когда я установил nginx перед импортом myproject, он ответил: «Добро пожаловать в Nginx!»). Я заметил с lsof | grep LISTEN что восходящий сокет не был создан. Журналы не выводят ничего важного, поэтому я попытался выполнить uwsgi вручную с теми же параметрами, что и uwsgi_myproject.conf и получил этот результат:

current working directory: /etc/init
detected binary path: /path/to/myvirtualenv/bin/uwsgi
uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 6674
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
The -s/--socket option is missing and stdin is not a socket.

РЕДАКТИРОВАТЬ: Итак, последнее, что я пробовал, - это переупорядочивать параметры. Теперь параметр --socket успешно обработан, но я все еще получаю это сообщение в строках вывода:

*** no app loaded. going in full dynamic mode ***

Некоторые документы, которые я читал:

Есть идеи о том, что я упускаю или упускаю из виду?

ПРОДОЛЖАТЬ: Я еще раз просмотрел документацию и попробовал другой подход: использовать файл .ini и запустить его вручную, чтобы посмотреть, что произойдет:

Это немного некрасиво, но вот что:

[uwsgi]
socket = 127.0.0.1:5678
uid = venvowner
chdir = /path/to/myvirtualenv
home = /path/to/myvirtualenv
virtualenv = /path/to/myvirtualenv
pythonpath = /path/to/myvirtualenv/path/to/myproject
module = wsgi
master = true
optimize = 2
processes = 2
logto = /path/to/myvirtualenv/log/uwsgi.log

Я получил несколько полезных логов:

*** Python threads support is disabled. You can enable it with --enable-threads ***
*** Operational MODE: preforking ***
ImportError: No module named wsgi
unable to load app 0 (mountpoint='') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***
*** uWSGI is running in multiple interpreter mode ***

Рабочие создаются, но стек явно не работает. Я возьму это в другой день.

Наконец, я заставил это работать. Спасибо @DhirajThakur за его комментарий, который помог мне посмотреть в правильном направлении.

/etc/init/uwsgi_myproject.conf:

description "uWSGI starter for myproject"

start on (local-filesystems and runlevel [2345])
stop on runlevel [016]

respawn

exec /usr/local/bin/uwsgi /etc/init/myproject.ini

/etc/init/myproject.ini:

[uwsgi]
master = true
socket = 127.0.0.1:5678
uid = venvowner
chdir = /path/to/myvirtualenv
home = /path/to/myvirtualenv
virtualenv = /path/to/myvirtualenv
pythonpath = /path/to/myvirtualenv/path/to/myproject
wsgi-file = /path/to/myvirtualenv/path/to/myproject/wsgi.py
optimize = 2
processes = 2
logto = /path/to/myvirtualenv/log/uwsgi.log

Почему-то у меня возникло ощущение, что способ, которым я решил проблему, был немного уродливым.