LINUX.ORG.RU

uWSGI+django

 ,


1

1

нужна помощь в осмыслении связки uwsgi и django, nginx оставил на потом. в общем, джанга-приложение, если его стартовать так: python manage.py runserver 0.0.0.0:8000 - работает и отображает всё включая статику. если же включать uwsgi в связку, возвращает соединение сброшено. запускаю так: uwsgi --ini app_uwsgi.ini

[uwsgi]

module          = wsgi

# Настройки, связанные с Django
# Корневая папка проекта (полный путь)
chdir           = /home/vagrant/app/app-devel/app/setup_templates
# Django wsgi файл
file            = django.wsgi
# полный путь к виртуальному окружению
#home            = /home/vagrant/app/bin
pythonpath      = /home/vagrant/app/lib/python2.7/site-packages
#wsgi-file      = /home/vagrant/app/app-devel/app/setup_templates/django.wsgi
buffer-size     = 32768
# общие настройки
# master
master          = true
# максимальное количество процессов
processes       = 5
# полный путь к файлу сокета
#socket          = app.sock
socket         = 127.0.0.1:8081
#uid            = nginx
#gid            = nginx
# права доступа к файлу сокета
chmod-socket    = 666
#chown-socket   = nginx:nginx
# очищать окружение от служебных файлов uwsgi по завершению
vacuum          = true
die-on-term     = true

что упустил?

как вообще uwsgi дёргает джанго-приложение?

midnight ()

Лови рабочий uwsgi-конфиг. Просто, пропиши туда свои пути.

[uwsgi]
        plugins = python27
        home = /path/to/proj/venv
        chdir = /path/to/proj/venv/proj
        pythonpath = .. 
        module = proj.wsgi:application
        master = true
        processes = 2 # equals numbers of cpu + 1
        socket = /tmp/proj.sock
        harakiri = 20
        max-requests = 1000
        env LANG='en_US.UTF-8'
        env LC_ALL='en_US.UTF-8'
        env DJANGO_SETTINGS_MODULE=proj.settings
        vacuum = true
        daemonize=/var/log/uwsgi/app/proj.log

В корне проекта: wsgi.py

import os, sys, site

sys.path.insert(0, os.path.dirname(__file__))
site.addsitedir('/abs/path/to/proj/venv/lib/python2.7/site-packages')

os.environ["DJANGO_SETTINGS_MODULE"] = "proj.settings"

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

KernelPanic ()
Последнее исправление: KernelPanic (всего исправлений: 1)
Ответ на: комментарий от KernelPanic

зачем wsgi.py ? у меня в проекте есть django.wsgi с содержимым

import os
import sys
import time
import traceback
import signal

current_directory = os.path.dirname(__file__)
parent_directory = os.path.dirname(current_directory)
module_name = os.path.basename(current_directory)

sys.path.append(parent_directory)
sys.path.append(current_directory)
os.environ['DJANGO_SETTINGS_MODULE'] = '%s.settings' % module_name

from django.core.wsgi import get_wsgi_application
try:
    application = get_wsgi_application()
    print 'WSGI without exception'
except Exception:
    print 'handling WSGI exception'
    # Error loading applications
    if 'mod_wsgi' in sys.modules:
        traceback.print_exc()
        os.kill(os.getpid(), signal.SIGINT)
        time.sleep(2.5)
midnight ()

чуть больше вводных данных. хочу запустить джанго-приложуху в virtualenv через uwsgi, все зависимости установлены, проблема в том что не получается создать адекватный app.ini для запуска uwsgi. когда запускаю руками

uwsgi --socket :3031 --chdir ~/askbot/askbot-devel/ --wsgi-file /home/vagrant/askbot/askbot-devel/django.wsgi --master --processes 4 --threads 2 --module "django.core.wsgi:get_wsgi_application()"
ругается, но работает
Traceback (most recent call last):
  File "/home/vagrant/askbot/lib/python2.7/site-packages/Django-1.8.18-py2.7.egg/django/core/wsgi.py", line 14, in get_wsgi_application
    django.setup()
  File "/home/vagrant/askbot/lib/python2.7/site-packages/Django-1.8.18-py2.7.egg/django/__init__.py", line 17, in setup
    configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
  File "/home/vagrant/askbot/lib/python2.7/site-packages/Django-1.8.18-py2.7.egg/django/conf/__init__.py", line 48, in __getattr__
    self._setup(name)
  File "/home/vagrant/askbot/lib/python2.7/site-packages/Django-1.8.18-py2.7.egg/django/conf/__init__.py", line 42, in _setup
    % (desc, ENVIRONMENT_VARIABLE))
django.core.exceptions.ImproperlyConfigured: Requested setting LOGGING_CONFIG, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
unable to load app 0 (mountpoint='') (callable not found or import error)

приложуха взлетает и отдает 302, как надо, но при запуске uwsgi app.ini ошибка «ImportError: No module named site»

гуглеж намекает на некорректные пути pythonpath, но понять не могу что не так.

app.ini

[uwsgi]
socket = 127.0.0.1:3031
chdir = /home/vagrant/askbot/askbot-devel
wsgi-file = /home/vagrant/askbot/askbot-devel/django.wsgi
processes = 4
module = django.core.wsgi:get_wsgi_application()
virtualenv = /home/vagrant/askbot/bin
master = true
pythonpath = /home/vagrant/askbot/
pythonpath = /home/vagrant/askbot/lib/python2.7/site-packages

midnight ()
Ответ на: комментарий от provaton

вывод uwsgi:

[uWSGI] getting INI configuration from askbot_uwsgi.ini
open("./python27_plugin.so"): No such file or directory [core/utils.c line 3686]
!!! UNABLE to load uWSGI plugin: ./python27_plugin.so: cannot open shared object file: No such file or directory !!!
*** Starting uWSGI 2.0.15 (64bit) on [Wed Aug  9 10:22:50 2017] ***
compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-11) on 07 August 2017 13:44:33
os: Linux-3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 2017
nodename: localhost.localdomain
machine: x86_64
clock source: unix
detected number of CPU cores: 2
current working directory: /home/vagrant/askbot/askbot-devel
detected binary path: /home/vagrant/askbot/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
chdir() to /home/vagrant/askbot/askbot-devel
your processes number limit is 3901
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)
uwsgi socket 0 bound to TCP address 127.0.0.1:3031 fd 3
Python version: 2.7.5 (default, Nov  6 2016, 00:28:07)  [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
Set PythonHome to /home/vagrant/askbot/bin
ImportError: No module named site

app.ini

[uwsgi]
socket = 127.0.0.1:3031
chdir = /home/vagrant/askbot/askbot-devel
wsgi-file = /home/vagrant/askbot/askbot-devel/django.wsgi
processes = 4
module = django.core.wsgi:get_wsgi_application()
virtualenv = /home/vagrant/askbot/bin
master = true
#pythonpath = /home/vagrant/askbot/
pythonpath = /home/vagrant/askbot/lib/python2.7/site-packages
plugins = python27
home = /home/vagrant/askbot/bin
vacuum = true
env = DJANGO_SETTINGS_MODULE=application_name.settings
midnight ()
Ответ на: комментарий от midnight

application_name нужно заменить на то, как у тебя называется директория в которой сеттингсы лежат.

Еще скорей всего путь к виртуалэнву нужно указывать без /bin, просто /home/vagrant/askbot.

provaton ★★★★★ ()
Ответ на: комментарий от midnight

Ну и вот это вот

!!! UNABLE to load uWSGI plugin: ./python27_plugin.so: cannot open shared object file: No such file or directory !!!

Явно надо как-то пофиксить (возможно исправлением пути к виртуалэнву, хотя хз)

provaton ★★★★★ ()
Ответ на: комментарий от provaton

помогло, спасибо за помощь. ошибку с !!! UNABLE решил исключением параметра plugins из app.ini

midnight ()
Ответ на: комментарий от provaton

uwsgi сервисом заработал, слушает нужный порт, теперь как запустить приложуху джанго? вопрос как uwsgi дергает джангу остается открытым. напомню что запускаю руками приложение так: python manage.py runserver 0.0.0.0:3031

midnight ()
Ответ на: комментарий от midnight

Про manage.py runserver в продакшене забудь вообще, это только для девелопмента. С такими настройками, как у тебя, uwsgi должен сам хостить джангу, дополнительно ничего запускать не нужно.

Проблема в том, что uwsgi работает через свой собственный протокол, не http. Так что напрямую подключиться к порту 3031 броузером ты не можешь. Нужно сделать что-то из следующих двух вариантов:

1. Запустить nginx с модулем uwsgi - https://www.nginx.com/resources/admin-guide/gateway-uwsgi-django/

2. Изменить socket на http_socket, тогда uwsgi будет работать по протоколу http.

Первый вариант гораздо более предпочтителен по многим соображениям.

provaton ★★★★★ ()
Ответ на: комментарий от provaton

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

midnight ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.