2016-01-27 3 views
0

Я пытаюсь запустить проект Django на сервере Debian с помощью Supervisor и Gunicorn. Когда я запускаю команду «SUDO supervisorctl начать gunicorn», я получаю следующее сообщение об ошибке:Невозможно запустить Django/Gunicorn через Supervisor

Traceback (most recent call last): 
    File "/home/smith/venvs/hash1/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 507, in spawn_worker 
    worker.init_process() 
    File "/home/smith/venvs/hash1/local/lib/python2.7/site-packages/gunicorn/workers/base.py", line 118, in init_process 
    self.wsgi = self.app.wsgi() 
    File "/home/smith/venvs/hash1/local/lib/python2.7/site-packages/gunicorn/app/base.py", line 67, in wsgi 
    self.callable = self.load() 
    File "/home/smith/venvs/hash1/local/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 65, in load 
    return self.load_wsgiapp() 
    File "/home/smith/venvs/hash1/local/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp 
    return util.import_app(self.app_uri) 
    File "/home/smith/venvs/hash1/local/lib/python2.7/site-packages/gunicorn/util.py", line 355, in import_app 
    __import__(module) 
    File "/srv/http/example.com/repo/conf/wsgi.py", line 28, in <module> 
    application = get_wsgi_application() 
    File "/home/smith/venvs/hash1/local/lib/python2.7/site-packages/django/core/wsgi.py", line 14, in get_wsgi_application 
    django.setup() 
    File "/home/smith/venvs/hash1/local/lib/python2.7/site-packages/django/__init__.py", line 17, in setup 
    configure_logging(settings.LOGGING_CONFIG, settings.LOGGING) 
    File "/home/smith/venvs/hash1/local/lib/python2.7/site-packages/django/conf/__init__.py", line 48, in __getattr__ 
    self._setup(name) 
    File "/home/smith/venvs/hash1/local/lib/python2.7/site-packages/django/conf/__init__.py", line 44, in _setup 
    self._wrapped = Settings(settings_module) 
    File "/home/smith/venvs/hash1/local/lib/python2.7/site-packages/django/conf/__init__.py", line 92, in __init__ 
    mod = importlib.import_module(self.SETTINGS_MODULE) 
    File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
    File "/srv/http/example.com/repo/conf/settings/prod.py", line 2, in <module> 
    from conf.settings.base import * 
    File "/srv/http/example.com/repo/conf/settings/base.py", line 128, in <module> 
    MEDIA_ROOT = get_env_variable('MEDIA_ROOT') 
    File "/srv/http/example.com/repo/conf/settings/base.py", line 23, in get_env_variable 
    raise ImproperlyConfigured(error_msg) 
ImproperlyConfigured: Set the MEDIA_ROOT environment variable 
[2016-01-27 19:39:31 +0000] [30408] [INFO] Worker exiting (pid: 30408) 

Моих base.py настройка базовых файлов читают переменные окружения, которые я установил в моем «hash1» виртуальная среда в postactivate крючок:

# base.py 
def get_env_variable(var_name): 
    try: 
     return os.environ[var_name] 
    except KeyError: 
     error_msg = "Set the %s environment variable" % var_name 
     raise ImproperlyConfigured(error_msg) 
# The rest of my settings... 

Я подтвердил, что сообщение об ошибке «ImproperlyConfigured» генерируется с помощью этой функции в файле настроек.

Вот мой руководитель и gunicorn файлы:

# /etc/supervisor/conf.d/supervisor.conf 
[program:gunicorn] 
command=/srv/http/example.com/repo/bin/start-gunicorn 
directory=/srv/http/example.com/repo 
user=root 
environment=MEDIA_ROOT="/var/www/swing/media/" 

# start-gunicorn 
#!/bin/bash 
NAME=example 
DJANGODIR=/srv/http/example.com/repo 
USER=smith 
GROUP=smith 
WEBSITE=$NAME 
NUM_WORKERS=3 
DJANGO_SETTINGS_MODULE=conf.settings.prod 
DJANGO_WSGI_MODULE=conf.wsgi 

cd /home/smith/venvs/current/bin 
source activate 
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE 
export PYTHONPATH=$DJANGODIR:$PYTHONPATH 

exec gunicorn ${DJANGO_WSGI_MODULE}:application \ 
    --name $NAME \ 
    --workers $NUM_WORKERS \ 
    --user=$USER \ 
    --group=$GROUP \ 
    --bind=127.0.0.1:8000 \ 
    --access-logfile /var/log/gunicorn/access.log \ 
    --error-logfile /var/log/gunicorn/error.log \ 
    --pid /var/tmp/gunicorn.pid \ 
    --log-level=info 

Я использую wsgi.py по умолчанию и supervisord.conf файлы. Мои версии таковы:

Django 1.8.4 
Debian 8.2 
Supervisor 3.0r1-1 (Installed globally) 
Gunicorn 19.3.0  (Installed in virtual environment "hash1") 

Может ли кто-нибудь увидеть, что я делаю неправильно? Я бы не ожидал, что супервизор сможет увидеть переменные окружения, поэтому я установил переменную MEDIA_ROOT через параметр «среда» супервизора. Но руководитель все еще не видит этого. Я могу запустить пушки, когда запускаю сценарий запуска-пушки из командной строки. Я знаю, что делаю что-то глупое, но я не вижу этого.

Спасибо!

+0

Вы действительно хотите запустить приложение как пользователь root **? –

+0

Нет, но в этот момент я просто хотел бы, чтобы он запускался как * любой * пользователь. Если я смогу, по крайней мере, запустить его, то я могу посмотреть, как запустить его под моей учетной записью. Это всегда сбивает меня с толку, что означает, что вещи должны работать. Nginx и Apache довольно понятны для работы в качестве www-данных. Но стрелок и супервайзер? С ними я не уверен. – William

ответ

0

Я не уверен, но я думаю, что проблема в том, что вы определяете MEDIA_ROOT в корневой среде пользователя, а затем запустить программу, как кузнец пользователя и он не имеет MEDIA_ROOT определен в его среде. Может быть, вы можете попробовать редактирования base.py

def get_env_variable(var_name): 
    try: 
     return os.environ[var_name] 
    except KeyError: 
     error_msg = "Set the %s environment variable" % var_name 
     # For debugging process append username and environment vars to error_msg 
     user = os.environ['USER'] 
     env_vars = os.environ.keys() 
     error_msg += " current user: %s env_vars: %s" % (user, env_vars) 

     raise ImproperlyConfigured(error_msg) 

Затем начать Джанго и проверить сообщение об ошибке, чтобы проверить, имеет ли пользователь MEDIA_ROOT, определенный в его окружении.

+0

USER var отсутствовал и не был переменным среды. Это то, что я нашел: env_vars: ['LANG', 'VIRTUAL_ENV', 'SUPERVISOR_SERVER_URL', '_SYSTEMCTL_SKIP_REDIRECT', 'SHLVL', 'PYTHONPATH', 'SERVER_SOFTWARE', 'SUPERVISOR_ENABLED', 'SUPERVISOR_PROCESS_NAME', 'PWD', ' DJANGO_SETTINGS_MODULE ',' SUPERVISOR_GROUP_NAME ',' PATH ',' PS1 ']. Я получил тот же результат, когда заменил корень своей учетной записью. Когда я жестко закодировал e-vars в моих настройках, я * мог * запустить gunicorn через супервизора. Поскольку я перехожу к Ansible, я мог бы просто заменить эти e-vars настройками и хранилищем на чувствительные. – William

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