Что и где будет располагаться
Название сайта: example.com
Корень сайта: /home/example/Projects/example.com
Статика сайта (css, js и т.п): /home/example/Projects/example.com/static
Медиа файлы сайта: /home/example/Projects/example.com/media
Django проект для сайта: /home/example/Projects/example.com/back
Пользовательский каталог: /home/example/
Виртуальное окружение (python3) для Django проекта: /home/exam/virtualenv/example.com/
Конфигурация NGINX для сайта: /etc/nginx/conf.d/example.com.conf
Конфигурация uWSGI сервиса в режиме императора: /etc/systemd/system/uwsgi.service, смотрит конфигурации вассалов в каталоге /etc/uwsgi/vassals/enabled/
Вассал uWSGI для запуска Django проекта: /etc/uwsgi/vassals/enabled/example.ini
Сокет uWSGI, создается при удачном запуске вассала: /run/uwsgi/example.sock
Перезапуск вассала uWSGI, когда нужно внести изменения на сайте после внесения изменений в Django проекте: нужно переместить /etc/uwsgi/vassals/enabled/example.ini /etc/uwsgi/vassals/disabled/ для отключения. Для запуска, переместить обратно в /etc/uwsgi/vassals/enabled/.
Сервисы NGINX и uWSGI запускаются под пользователем nginx.
!Если будут проблемы при запуске сервисов с правами доступа к пользовательскому каталогу, то можно временно отключить SELINUX:
# setenforce 0
1. Виртуальное окружение для Django проекта
- все виртуальные окружения у меня храняться в ~/virtualenv- в пользовательском каталоге установлен из исходников ~/python3, его я буду использовать в виртуально окружении
- я взял за правило создавать виртуальное окружение для каждого нового Django проекта (для разных проектов используются разные версии Python, Django и другие python библиотеки)
- создаю виртуальное окружение example.com в директории /home/exam/virtualenv , использую python 3 версии
$ cd ~/virtualenv/
$ virtualenv -p ~/python3/bin/python3 example.com
- запускаю созданное виртуальное окружение
$ source ~/virtualenv/example.com/bin/activate
- проверяю версию python для созданного виртуального окружения
$ python -V
Python 3.5.1
все как и задумывалось
- Устанавливаю django в виртуальном окружении example.com
$ pip install django
2. Создание Django проекта
Все веб проекты у меня лежат в ~/Projects$ source ~/virtualenv/example.com/bin/activate
$ cd ~/Projects/
- создаю каталог в котором у меня будет размещаться сайт
$ mkdir example.com
- перехожу в каталог проекта и создаю каталоги для медиа и статики
$ cd example.com/
$ mkdir media
$ mkdir static
- создаю django проект (Django проекты я создаю с названием back, от слова backend, а frontend размещаю в каталоге front)
$ django-admin startproject back
- редактирую пути для статики и медиа в созданном Django проекте
$ vi ~/Projects/example.com/back/back/settings.py
STATIC_URL = '/static/'
STATIC_ROOT = '/home/example/Projects/example.com/static'
MEDIA_URL = '/media/'
MEDIA_ROOT = '/home/example/Projects/example.com/media'
- проверяю работу созданного Django проекта, предварительно делаю миграцию, собираю статику и создаю суперпользователя
$ cd ~/Projects/example.com/back/
$ python manage.py migrate
$ python manage.py collectstatic
$ python manage.py createsuperuser
$ python manage.py runserver
Смотрю в браузере http://127.0.0.1:8000 и http://127.0.0.1:8000/admin/
Все работает, мой Django проект запустился
- деактивирую виртуальное окружение
$ deactivate
3. Запуск uWSGI для Django проекта
- Устанавливаю в системе uwsgi
$ sudo pip install uwsgi
- Создаю файл /home/example/Projects/example.com/back/back.wsgi
import os
#back - это название проекта откуда будут грузится настройки !!!
os.environ['DJANGO_SETTINGS_MODULE'] = 'back.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
- Запускаю тест uwsgi на порту 8080 с --pythonpath /home/example/virtualenv/example.com/lib/python3.5/site-packages и с указанием проекта --chdir /home/example/Projects/example.com/back. Ключи, с которыми сейчас запистится uwsgi я буду использовать в настройках.
$ uwsgi --http :8080 --pythonpath /home/example/virtualenv/example.com/lib/python3.5/site-packages --chdir /home/example/Projects/example.com/back --module back.wsgi
В браузере, по адресу http://127.0.0.1:8080/, снова вижу страницу созданного Django проекта
http://127.0.0.1:8080/admin отображается без статики, но пока об этом не стоит беспокоится, настроится позже.
4. Запуск uWSGI в режиме императора
Когда имеется несколько сайтов с uwsgi, то лучше запускать uwsgi в режиме императора. Хотя, у меня пока только один сайт, но лучше сразу сделаю настройки для нескольких сайтов, чтобы не возращаться к этой теме.- Настройки для запуска wsgi сайтов будут храниться в /etc/uwsgi/vassals, создаю эту папку
$ sudo mkdir -p /etc/uwsgi/vassals
- Запущенные вассалы будут распологаться в директории enabled, а отключенные я буду размещать в disabled. Создаю для них папки
$ sudo mkdir /etc/uwsgi/vassals/enabled
$ sudo mkdir /etc/uwsgi/vassals/disabled
- Создаю uwsgi ini файл с настройками для моего Django проекта
$ sudo vi /etc/uwsgi/vassals/disabled/example.ini
[uwsgi]
chdir = /home/example/Projects/example.com/back
pythonpath = /home/example/virtualenv/example.com/lib/python3.5/site-packages
socket = /run/uwsgi/example.sock
module = back.wsgi
chown-socket = nginx:nginx
chmod-socket = 660
master = true
processes = 2
threads = 2
vacuum = true
- Для проверки созданных настроек, запускаю uwsgi c настройками /etc/uwsgi/vassals/disabled/example.ini
$ uwsgi --ini /etc/uwsgi/vassals/disabled/example.ini
Чтобы пользователь nginx мог читать настройки из каталога проектов /home/example/Projects,
- добавляю пользователя nginx в группу example
$ usermod -a -G example nginx
-и изменяю права доступа на домашнюю директорию пользователя (именно на домашнюю, а не только на каталог корня сайта)
$ chmod 710 /home/example
- Создаю сервис для запуска uwsgi, для императора указываю смотреть каталог /etc/uwsgi/vassals/enabled (uwsgi будет запускаться под пользователем nginx, запущенные сервисы будут размещаться в /run/uwsgi
$ vi /etc/systemd/system/uwsgi.service
[Unit]
Description=uWSGI Emperor service
[Service]
ExecStartPre=/usr/bin/bash -c 'mkdir -p /run/uwsgi; chown nginx:nginx /run/uwsgi'
ExecStart=/usr/bin/uwsgi --emperor /etc/uwsgi/vassals/enabled --uid nginx --gid nginx
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all
[Install]
WantedBy=multi-user.target
- Запускаю сервис uwsgi
$ sudo systemctl start uwsgi
- Перемещаю вассал example.ini в enabled для запуска (вассалы, согласно настройкам /etc/systemd/system/uwsgi.service просматриваются в каталоге enabled)
$ mv /etc/uwsgi/vassals/disabled/example.ini /etc/uwsgi/vassals/enabled/
Теперь вассал должен быть обнаружен в этом каталоге и обработан.
Если в дальнейшем я захочу приостановить работу сайта, то просто перемещаю файл example.ini из enabled в disabled.
- Смотрю логи, запустился ли вассал для example.com
$ sudo cat /var/log/messages
Сервис uwsgi работает в режиме иператора и вассал example.ini ожидает запросов -
[emperor] vassal example.ini is ready to accept requests.
- Теперь можно добавить запуск uwsgi в запуск при загрузке системы.
$ sudo systemctl enable uwsgi
5. Настраиваю nginx для работы Django сайта
У меня уже установлен NGINX. Если нужны подробности установки, то можно посмотреть http://hairetdin.blogspot.ru/2016/10/nginx-kerberos-centos-7.html
Конфигурационные файлы для сайтов, согласно настройкам /etc/nginx/nginx.conf (include /etc/nginx/conf.d/*.conf;), я размещаю в /etc/nginx/conf.d/
- Создаю конфигурацию nginx для сайта example.com
$ sudo vi /etc/nginx/conf.d/example.com.conf
server {
listen 80;
server_name example.com www.example.com;
location = favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/example/Projects/example.com;
}
location /media/ {
root /home/example/Projects/example.com;
}
location / {
include uwsgi_params;
uwsgi_pass unix:/run/uwsgi/example.sock;
}
}
В этом файле я указал где смотреть статику и медиа файлы для моего проекта, а также, где смотреть параметры uwsgi.
- Тестирую созданную конфигурацию:
$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Конфигурация в порядке.
- Перезапускаю сервис nginx
$ sudo systemctl restart nginx
- По умолчанию в Django проекте используется sqlite база данных. Ранее пользователя nginx (под которым запускается сервисы NGINX и uWSGI) я уже добавил в группу example, теперь добавлю права на запись группе для файла базы данных - db.sqlite3:
$ chmod 664 /home/example/Projects/example.com/back/db.sqlite3
- Добавляю в /etc/hosts домен example.com, чтобы можно было проверить работу локально
$ sudo /etc/hosts
192.168.1.3 example.com
- Смотрю сайт example.com через браузер
Все работает
Комментариев нет:
Отправить комментарий