Невозможно запустить Gunicorn на EC2 - PullRequest
0 голосов
/ 07 ноября 2018

Я следую этому учебнику , чтобы настроить сервер Django-gunicorn-nginx в AWS EC2. После установки всех зависимостей и внесения изменений в wsgi.py, выполните следующие действия

import os, sys
# add the hellodjango project path into the sys.path
sys.path.append('/home/ubuntu/project/ToDo-application/')

# add the virtualenv site-packages path to the sys.path
sys.path.append('/home/ubuntu/.local/lib/python3.6/site-packages')

# poiting to the project settings
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "todo_app.settings")

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

Я запускаю gunicorn todo_app.wsgi и получаю следующую ошибку:

ubuntu@ip-172-31-61-163:~/project/ToDo-application$ gunicorn todo_app.wsgi
[2018-11-07 11:25:35 +0000] [8211] [INFO] Starting gunicorn 19.7.1
[2018-11-07 11:25:35 +0000] [8211] [INFO] Listening at: http://127.0.0.1:8000 (8211)
[2018-11-07 11:25:35 +0000] [8211] [INFO] Using worker: sync
[2018-11-07 11:25:35 +0000] [8215] [INFO] Booting worker with pid: 8215
[2018-11-07 11:25:35 +0000] [8215] [ERROR] Exception in worker process
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/gunicorn/arbiter.py", line 578, in spawn_worker
    worker.init_process()
  File "/usr/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 126, in init_process
    self.load_wsgi()
  File "/usr/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 135, in load_wsgi
    self.wsgi = self.app.wsgi()
  File "/usr/lib/python2.7/dist-packages/gunicorn/app/base.py", line 67, in wsgi
    self.callable = self.load()
  File "/usr/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 65, in load
    return self.load_wsgiapp()
  File "/usr/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/usr/lib/python2.7/dist-packages/gunicorn/util.py", line 377, in import_app
    __import__(module)
  File "/home/ubuntu/urbanpiper/ToDo-application/todo_app/wsgi.py", line 20, in <module>
    from django.core.wsgi import get_wsgi_application
  File "/home/ubuntu/.local/lib/python3.6/site-packages/django/__init__.py", line 1, in <module>
    from django.utils.version import get_version
  File "/home/ubuntu/.local/lib/python3.6/site-packages/django/utils/version.py", line 71, in <module>
    @functools.lru_cache()
AttributeError: 'module' object has no attribute 'lru_cache'

Это из-за того, что у gunicorn были зависимости от python2 и Django был на python3? Я попытался удалить gunicorn и повторить попытку, но это не сработало.

1 Ответ

0 голосов
/ 07 ноября 2018
# WRONG:
# add the virtualenv site-packages path to the sys.path
sys.path.append('/home/ubuntu/.local/lib/python3.6/site-packages')

Вы должны создать virutalenv для каждого приложения uwsgi, которое вы хотите разместить на сервере, вместо того, чтобы устанавливать virtualenv для указанного выше пути. Если вы следовали по ссылке слово за словом, то это часть, которая нуждается в дополнительном объяснении:

Сделайте virtualenv и установите свои требования к пунктам

По существу:

# install virtualenv3
sudo apt-get install virtualenv3
# create the virtual environment, specifically for the stated python version
virtualenv -p python3.6 TITLE_OF_VENV

# You now have a directory called TITLE_OF_VENV (You may wish to replace this 
# with something more subtle).

# Activate the virtualenv for your current shell session
. TITLE_OF_VENV/bin/activate
# The dot above is intentional and is a quick way to write source, which 
# imports the environment vars

Ваше приглашение оболочки теперь должно выглядеть следующим образом: (TITLE_OF_VENV) ubuntu@ip-172-31-61-163:~/project/ToDo-application$, указывающее, что venv активен. Чтобы выйти из venv, выполните команду deactivate.

Все, что вы устанавливаете с помощью pip здесь, будет затем находиться в каталоге TITLE_OF_VENV/python3.6/site-packages (пока эта виртуальная среда активна). Преимущество заключается в том, что отдельные требования к проекту разделены.

Проверка версии Python (с активным venv):

(TITLE_OF_VENV)$ python --version
Python 3.6

Теперь установите gunicorn в эту виртуальную среду вместе с любыми другими требованиями проекта:

(TITLE_OF_VENV)$ pip install gunicorn
(TITLE_OF_VENV)$ pip install -r requirements.txt 

Обновите свой uwsgi.py:

import os
# poiting to the project settings
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "todo_app.settings")

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

А затем запустите его из виртуальной среды:

(TITLE_OF_VENV)$ gunicorn todo_app.wsgi:application

Вы также можете добавить флаг -D к команде gunicorn, что заставит его работать в фоновом режиме. Также не делайте этот сервер общедоступным. Если это производственная коробка, вам нужно запустить ее за nginx!

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