python > Установка uWSGI + Nginx для Django на Ubuntu 16.04 LTS
28.04.2018 14:07:07
Наиболее часто встречающиеся слова в статье:
[приложение] [который] [Пользователь] [измените] [системы] [проекта] [Веб-сервер] [работать] [install] [адресу yourserver]
Статья:
Установка uWSGI + Nginx для Django на Ubuntu 16.04 LTS
Перед вами руководство по настройке production окружения для Django. Здесь будут описаны необходимые шаги по настройке Django, uWSGI и nginx. Руководство охватывает все три компонента — полный стек серверного ПО для веб-приложений.Подразумевается, что вы используете Unix-подобную операционную систему и менеджер пакетов, эквивалентный aptitude. Найти эквивалент aptitude почти для любой операционной системы, в том числе и для Mac OS X, для вас не составит никакого труда.
Руководство написно для версий Django 1.4 или выше. Если вы используете более раннюю версию, то вам придется самостоятельно найти wsgi модуль для нее. Также вы заметите, что файловая структура проекта будет немного отличаться от представленной здесь.
Общая идея
Веб-сервер может по запросу отдавать пользователям файлы из своей файловой системы, однако он не может напрямую работать с Djangо приложениями. Веб-серверу нужен интерфейс, который будет запускать Django приложение, передавать ему запрос от пользователя и возвращать ответ.
Для выполнения этих задач был разработан Web Server Gateway Interface — WSGI — стандарт взаимодействия Python программ и веб-сервра.
uWSGI — одна из реализаций WSGI. В этом руководстве мы установим и настроим uWSGI для создания Unix сокета и взаимодействия с веб-сервером по протоколу WSGI.
Полный стек компонентов будет выглядеть следующим образом:
Устанавливаем все, что нам понадобится:
sudo apt-get install build-essential python-dev libpcre3 libpcre3-dev nginx
Далее, устанавливаем виртуальное окружение куда вам удобно привычно и удобно. В последнее время стало популярно пользоваться virtualenvwrapper, чье название говорит само за себя. Я попробовал, но мне не очень понравилось. Что ни говорите, а быстрее и привычнее работать непосредственно с virtualenv, это, скорее, дело вкуса и привычки.
sudo pip3 install uwsgi
Все новые проекты в последнее время я стараюсь (если в требованиях не указано
иное) разрабатывать на Python 3. Однако в Ubuntu 16.04 по умолчанию все еще
используется Python, поэтому uwsgi устанавливаем
с помощью pip3
.
Но если третий Python не нужен, тогда, как обычно, ставим с помощью pip
.
Проверка
Создаем файл test.py:
Запускаем uWSGI:
Опции:
-
http: 8000
: используется протокол http и порт 8000
-
wsgi-file test.py
: uwsgi загрузит определенный файл (в нашем случае test.py)
В браузере переходим по адресу
yourserver.com:8000
.Видим: «Hello, world», значит, мы все сделали правильно и следующие компоненты работают:
Проверка работы Django приложения
Создадим django приложение
mkdir django_test
cd django_test
django-admin startproject
mysite
cd
mysite
Теперь сделаем так, чтобы uWSGI работал с Django приложением, а не с файлом test.py.
Проверим, что только что созданный проект mysite запускается на сервере для разработки:
Если проект запустился, останавливаем сервер для разработки и запускаем uWSGI следующим образом:
-
module mysite.wsgi
: uwsgi загрузит модуль mysite.wsgi
В браузере переходим по адресу
yourserver.com:8002
.Видим стартовую страницу Djangо, значит, мы все сделали правильно и следующие компоненты работают:
если появится ошибка
Exception Type: | DisallowedHost |
---|
То править settings.py
,
there is a list called ALLOWED_HOSTS
.
IP Или название хоста на котором крутится приложение
ALLOWED_HOSTS = [''XX.XX.XX.XX'']
Запускаем через сокет, так и будем к нему конектиться через nginx uwsgi --socket mysite.sock --module mysite.wsgi
Установка и запуск nginx
Чтобы проверить, что nginx установлен и запущен, перейдите по адресу
yourserver.com:80
.
Если вы видите сообщение “Welcome to nginx!”, значит, все окей и следующие
компоненты работают:Если у вас занят восьмидесятый порт, измените конфигурацию nginx так, чтобы он использовал какой-нибудь другой
Если стоит уже apache то поднастроим nginx на другом порту - у меня была проблема: у меня был Apache, работающий на Ubuntu 14.04, и мне пришлось установить nginx вместе с Apache, поэтому после установки nginx я изменил порт прослушивания ngnix-сервера по умолчанию от 80 до 81, и он сделал магию после ниже инструкции для его достижения
cd /etc/nginx/sites-available
sudo cp default default.bak
sudo nano default
измените порт здесь.
server {
listen 81 default_server;
listen [::]:81 default_server ipv6only=on;
сохранить его и выйти из нано затем перезапустите ngnix с помощью
sudo service nginx restart
и в браузере http://localhost:81
ваш
сервер встал
Конфигурация nginx для работы с Django
Нам понадобится файл uwsgi_params, который можно взять здесь: github.com/nginx/nginx/blob/master/conf/uwsgi_params.
Скачиваем его в корневую папку нашего проекта.
Создаем файл mysite_nginx.conf:
Если будет ругаться unknown directive "
upstream django {
server unix:///path/to/your/mysite/mysite.sock;
}
Этот конфигурационный файл указывает nginx, что он должен отдавать пользователям медиа и статик файлы из файловой системы, а все остальные запросы перенаправлять в Django приложение. В больших проектах лучше использовать два сервера: один для обслуживания статик и медиа файлов, а другой для Django приложения. С небольшими, и тем более с учебными проектами, справится и один сервер.
В папке
/etc/nginx/sites-enabled
создаем
ссылку на файл mysite_nginx.conf
,
чтобы nginx увидел его:service nginx restart . если какие проблемы - смотрим :
See "systemctl status nginx.service" and "journalctl -xe"
для того, чтобы Nginx смог работать с файлом uWSGI-сокета добавим его в группу вашего проекта, в Ubuntu это можно сделать так
sudo usermod -a -G <usergroup> www-data
Устанавливаем uWSGI глобально
До сих пор uWSGI был установлен в виртуальном окружении. Чтобы была возможность автоматически запускать uWSGI при старте операционной системы, мы установим его глобально.
Деактивируем виртуальное окружение:
Устанавливаем uwsgi:
На вики странице uWSGI описано несколько вариантов установки. Перед тем, как установить uWSGI глобально, вам не помешает определиться с выбором версии и методом установки.
Запусить uWSGI можно той же командой, что и раньше:
Режим Emperor
Если сервер обслуживает несколько проектов, каждый из которых использует uWSGI, то нужно исползовать режим Emperor. В этом режиме uWSGI просматривает папку с конфигурационными файлами и для каждого файла запускает отдельный процесс (вассал).
Если один из конфигурационных файлов будет изменен, uWSGI перезапустит соответствующего вассала.
Создаем папку для конфигурационных файлов:
Создаем в ней ссылку на mysite_uwsgi.ini:
Запускаем uWSGI в режиме Emperor:
Опции:
-
emperor
: папка с конфигурациолнными файлами -
uid
: id пользователя, от имени которого будет запущен процесс
-
gid
: id группы, от имени которой будет запущен процесс
Проверяем.
yourserver.com:8000/
Автоматичесеий запуск uWSGI после загрузки операционной системы
В файл
/etc/rc.local
,
перед строкой “exit
0
”
добавляем: