coding

Настраиваем веб-сервер для Django (nginx + supervisor + gunicorn)

23 декабря 2016 г.

Тема довольно избитая и наверное ничего нового я здесь не напишу. Этот материал будет своего рода обобщением информации, взятой из разных источников (ссылки на них в конце статьи). Опять же, этот вариант установки не единственный и не претендует на какую-либо исключительность. Еще в этой статье немного коснемся подключеня PostgreSQL и настройки виртуального окружения.

Итак, схема будет такая:

 

Запрос поступает nginx, который через gunicorn (WSGI HTTP сервер на Python для UNIX систем) взаимодействует с django. Gunicorn запущен в supervisor (это менеджер процессов). Так же в nginx настраивается доступ к статике сайта.

1. Устанавливаем необходимые пакеты:

$ sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx supervisor

2. Настраиваем бд (если используется другая бд, то смотрите к ней документацию):

$ sudo -u postgres psql 
CREATE DATABASE myproject;
CREATE USER myprojectuser WITH PASSWORD 'password';
ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE myprojectuser SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;
\q 

3. Устанавливаем виртуальное окружение:

$ sudo pip3 install virtualenv virtualenvwrapper 
$ echo "export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3" >> ~/.bashrc
$ echo "export WORKON_HOME=~/Env" >> ~/.bashrc
$ echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.bashrc
$ source ~/.bashrc 

В домашнем каталоге должна появиться папка /Env.

4. На сервере может размещаться несколько сайтов, поэтому сразу покажу как их ставить. Cоздаем виртуальное окружения для первого сайта:

$ mkvirtualenv firstsite

Чтобы удалить виртуалку - rmvirtualenv 'название'

для запуска виртуального окружения:

$ workon firstsite

для остановки:

 $ deactivate

5. Устанавливаем необходимые пакеты в окружении firstsite:

(firstsite)$ pip install django gunicorn psycopg2

django - сам фреймворк
gunicorn - сервер для python
psucopg2 - драйвер для PostgreSQL

6. Запускаем проект django и можно сразу поправить некоторые настройки:

$ django-admin.py startproject myproject
$ nano myproject/settings.py

туда записываем (ваши настройки могут отличаться):

ALLOWED_HOSTS = ['ваш хост']
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'myproject',
        'USER': 'myprojectuser',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}
LANGUAGE_CODE = 'ru-RU'
TIME_ZONE = 'Europe/Moscow'
USE_I18N = True
USE_L10N = True
USE_TZ = True
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
LOGIN_REDIRECT_URL = '/'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

сохраняем все и далее:

$ cd ~/myproject
$ ./manage.py makemigrations
$ ./manage.py migrate
$ ./manage.py createsuperuser
$ ./manage.py collectstatic

7. Для проверки:

$ ./manage.py runserver 0.0.0.0:8000

в браузере по вашему ip должен быть доступен сайт (например 46.36.222.56:8000) с приветствием django

 $ gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application

тоже самое, но через gunicorn сервер в браузере по вашему ip должен быть доступен сайт (например 46.36.222.56:8000) с приветствием django.

ЕСЛИ НА ЭТОМ ЭТАПЕ ВСЕ ОК, ПОВТОРЯЕМ ПУНКТЫ 4-7 ДЛЯ ЕЩЕ ОДНОГО САЙТА (secondsite) И ПЕРЕХОДИМ К НАСТРОЙКЕ СЕРВЕРА.

8. Настроим nginx:

$ sudo nano /etc/nginx/sites-available/firstsite

и записываем туда:

 server {
    listen 80;
    server_name первый_сайт.ru www.первый_сайт.ru;
    access_log  /var/log/nginx/firstsite.log;
    location /static/ {
        root /home/ваше_имя/firstsite;
        expires 30d;
    }
    location / {
        proxy_pass http://127.0.0.1:8001;
        proxy_set_header Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }

это для первого сайта, а для второго:

$ sudo cp /etc/nginx/sites-available/firstsite /etc/nginx/sites-available/secondsite
$ sudo nano /etc/nginx/sites-available/secondsite 

 и записываем туда:

server {
    listen 80;
    server_name второй_сайт.ru www.второй_сайт.ru;
    access_log  /var/log/nginx/secondsite.log;
    location /static/ {
        root /home/ваше_имя/secondsite;
        expires 30d;
    }
    location / {
        proxy_pass http://127.0.0.1:8002;
        proxy_set_header Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }

включаем их:

$ sudo ln -s /etc/nginx/sites-available/firstsite /etc/nginx/sites-enabled
$ sudo ln -s /etc/nginx/sites-available/secondsite /etc/nginx/sites-enabled

проверяем конфиги и перезагружаем nginx:

$ sudo service nginx configtest
$ sudo service nginx restart

9. Настроим supervisor для наших сайтов.

Сначала создадимм конфиги для gunicorn для каждого сайта отдельно, создадим их именно в каталоге проекта с settings.py:

$ cd firtsite/firstsite
$ sudo nano gunicorn.conf.py

записываем туда:

bind = '127.0.0.1:8001' (bind = '127.0.0.1:8002' - для второго сайта)
workers = 3
user = "nobody" 

проверяем связку nginx и gunicorn:

$ workon firstsite
$ (firstsite)$ cd firstsite/
$ (firstsite)$ gunicorn firstsite.wsgi:application

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

$ cd /etc/supervisor/conf.d/
$ nano firstsite.conf

записываем туда:

[program:firstsite]
command=/home/ваше_имя/Env/firstsite/bin/gunicorn firstsite.wsgi:application -c /home/ваше_имя/firstsite/firstsite/gunicorn.conf.py
directory=/home/ваше_имя/firstsite
user=nobody
autorestart=true
redirect_stderr=true 

проделываем весь этот пункт для второго сайта.

Запускаем  supervisor:

$ sudo supervisorctl reread
$ sudo supervisorctl update
$ sudo supervisorctl status firstsite
$ sudo supervisorctl restart firstsite
$ sudo supervisorctl status secondsite
$ sudo supervisorctl restart secondsite

Перезагружаем nginx:

$ sudo service nginx restart

На этом всё, сайты должны работать).

Источники: 1-я ссылка, 2-я ссылка, 3-я ссылка.

Просмотров - 1433

Оставить комментарий

Комментарий будет размещен на сайте после прохождения модерации.

Комментарии

Еще не оставлено ни одного комментария.