пятница, 14 октября 2016 г.

Запуск NGINX Django python3 на сервере Centos 7


Что и где будет располагаться


Название сайта: 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 отображается без статики, но пока об этом не стоит беспокоится, настроится позже.

!!! Внимание. В некоторых инструкциях написано использование ключа --home, --virtualenv, -H или --venv, который, якобы, используется для пути к python в виртуальном окружении, так работает только если и в системе и виртуально окружении стоит python2! В моем случае используется python3, который установлен в виртуальном окружении, поэтому нужно использовать ключ --pythonpath путь_до_виртуального_окружения/lib/python3.5/site-packages


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 через браузер
Все работает

Комментариев нет:

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

django-oscar tinymce 4 filebrowser

Задача: в дашборде django-oscar загружать изображения 1. Установка django-filebrowser-no-grappelli - Открываем проект, загружаем виртуа...