Настраиваем веб-сервер для Django (nginx + supervisor + gunicorn)
23 декабря 2016 г.
postgresql django debianТема довольно избитая и наверное ничего нового я здесь не напишу. Этот материал будет своего рода обобщением информации, взятой из разных источников (ссылки на них в конце статьи). Опять же, этот вариант установки не единственный и не претендует на какую-либо исключительность. Еще в этой статье немного коснемся подключеня PostgreSQL и настройки виртуального окружения.
Итак, схема будет такая:
Запрос поступает nginx, который через gunicorn (WSGI HTTP сервер на Python для UNIX систем) взаимодействует с django. Gunicorn запущен в supervisor (это менеджер процессов). Так же в nginx настраивается доступ к статике сайта.
1. Устанавливаем необходимые пакеты:
2. Настраиваем бд (если используется другая бд, то смотрите к ней документацию):
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. Устанавливаем виртуальное окружение:
$ echo "export WORKON_HOME=~/Env" >> ~/.bashrc
$ echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.bashrc
$ source ~/.bashrc
В домашнем каталоге должна появиться папка /Env.
4. На сервере может размещаться несколько сайтов, поэтому сразу покажу как их ставить. Cоздаем виртуальное окружения для первого сайта:
Чтобы удалить виртуалку - rmvirtualenv 'название'
для запуска виртуального окружения:
для остановки:
5. Устанавливаем необходимые пакеты в окружении firstsite:
django - сам фреймворк
gunicorn - сервер для python
psucopg2 - драйвер для PostgreSQL
6. Запускаем проект django и можно сразу поправить некоторые настройки:
$ nano myproject/settings.py
туда записываем (ваши настройки могут отличаться):
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/')
сохраняем все и далее:
$ ./manage.py makemigrations
$ ./manage.py migrate
$ ./manage.py createsuperuser
$ ./manage.py collectstatic
7. Для проверки:
в браузере по вашему ip должен быть доступен сайт (например 46.36.222.56:8000) с приветствием django
тоже самое, но через gunicorn сервер в браузере по вашему ip должен быть доступен сайт (например 46.36.222.56:8000) с приветствием django.
ЕСЛИ НА ЭТОМ ЭТАПЕ ВСЕ ОК, ПОВТОРЯЕМ ПУНКТЫ 4-7 ДЛЯ ЕЩЕ ОДНОГО САЙТА (secondsite) И ПЕРЕХОДИМ К НАСТРОЙКЕ СЕРВЕРА.
8. Настроим nginx:
и записываем туда:
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 nano /etc/nginx/sites-available/secondsite
и записываем туда:
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/secondsite /etc/nginx/sites-enabled
проверяем конфиги и перезагружаем nginx:
$ sudo service nginx restart
9. Настроим supervisor для наших сайтов.
Сначала создадимм конфиги для gunicorn для каждого сайта отдельно, создадим их именно в каталоге проекта с settings.py:
$ sudo nano gunicorn.conf.py
записываем туда:
workers = 3
user = "nobody"
проверяем связку nginx и gunicorn:
$ (firstsite)$ cd firstsite/
$ (firstsite)$ gunicorn firstsite.wsgi:application
в браузере должен открываться ваш сайт, если все ок, идем дальше:
$ nano firstsite.conf
записываем туда:
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 update
$ sudo supervisorctl status firstsite
$ sudo supervisorctl restart firstsite
$ sudo supervisorctl status secondsite
$ sudo supervisorctl restart secondsite
Перезагружаем nginx:
На этом всё, сайты должны работать).
Источники: 1-я ссылка, 2-я ссылка, 3-я ссылка.
Просмотров - 1433
Комментарий будет размещен на сайте после прохождения модерации.