Установка uWSGI + Nginx для Django на Ubuntu 16.04 LTS

python > Установка uWSGI + Nginx для Django на Ubuntu 16.04 LTS
28.04.2018 14:07:07



Статья:

Установка 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.

Полный стек компонентов будет выглядеть следующим образом:
Пользователь <-> Веб-сервер <-> Сокет <-> uwsgi <-> Django

Устанавливаем все, что нам понадобится:

Bash
sudo apt-get install build-essential python-dev libpcre3 libpcre3-dev nginx

Далее, устанавливаем виртуальное окружение куда вам удобно привычно и удобно. В последнее время стало популярно пользоваться virtualenvwrapper, чье название говорит само за себя. Я попробовал, но мне не очень понравилось. Что ни говорите, а быстрее и привычнее работать непосредственно с virtualenv, это, скорее, дело вкуса и привычки.

Bash
sudo pip3 install uwsgi

Все новые проекты в последнее время я стараюсь (если в требованиях не указано иное) разрабатывать на Python 3. Однако в Ubuntu 16.04 по умолчанию все еще используется Python, поэтому uwsgi устанавливаем с помощью pip3. Но если третий Python не нужен, тогда, как обычно, ставим с помощью pip.

Проверка


Создаем файл test.py:
# test.py
def application(env, start_response):
    start_response(''200 OK'', [(''Content-Type'',''text/html'')])
    return [b"Hello World"] # python3
    #return ["Hello World"] # python2

Запускаем uWSGI:
uwsgi --http :8000 --wsgi-file test.py

Опции:
  • http: 8000: используется протокол http и порт 8000
  • wsgi-file test.py: uwsgi загрузит определенный файл (в нашем случае test.py)

В браузере переходим по адресу yourserver.com:8000.
Видим: «Hello, world», значит, мы все сделали правильно и следующие компоненты работают:
Пользователь <-> uWSGI <-> test.py

 

Проверка работы Django приложения

Создадим django приложение
mkdir django_test
cd django_test
django-admin startproject mysite
cd mysite


Теперь сделаем так, чтобы uWSGI работал с Django приложением, а не с файлом test.py.

Проверим, что только что созданный проект mysite запускается на сервере для разработки:
python3 manage.py runserver 0.0.0.0:8002

Если проект запустился, останавливаем сервер для разработки и запускаем uWSGI следующим образом:
uwsgi --http :8002 --module mysite.wsgi

  • module mysite.wsgi: uwsgi загрузит модуль mysite.wsgi

В браузере переходим по адресу yourserver.com:8002.
Видим стартовую страницу Djangо, значит, мы все сделали правильно и следующие компоненты работают:
Пользователь <-> uWSGI <-> Django

если появится  ошибка 

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


sudo apt-get install nginx-full
sudo service nginx start 
Чтобы проверить, что 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:
# mysite_nginx.conf

upstream django {
     server unix:///path/to/your/mysite/mysite.sock; # взаимодействие с uwsgi через Unix-сокет (мы воспользуемся этим вариантом 
}

# конфигурация веб-сервера
server {
    # порт, который будет слушать веб-сервер в ожидании запросов от пользователй
    listen      8000;
    # доменное имя
    server_name     yourserver.com; # замените на собственный домен или IP адрес
    charset     utf-8;

    # максимальный размер загружаемых на сервер данных
    client_max_body_size 75M;  

    # обслуживание медиа файлов и статики
    location /media  {
        alias /path/to/your/mysite/media;  # расположение медиафайлов (при необходимости измените)
    }

    location /static {
        alias /path/to/your/mysite/static;  # расположение статики (при необходимости измените)

    }

    # Остальные запросы перенаправляются в Django приложение
    location / {
        uwsgi_pass  django;
        include     /path/to/your/mysite/uwsgi_params; # файл uwsgi_params, который мы только что взяли с github
    }
}
Если будет ругаться  unknown directive "upstream"  то  секцию надо вынести в раздел http { файла   nginx.conf upstream django {
    server unix:///path/to/your/mysite/mysite.sock;
}

Этот конфигурационный файл указывает nginx, что он должен отдавать пользователям медиа и статик файлы из файловой системы, а все остальные запросы перенаправлять в Django приложение. В больших проектах лучше использовать два сервера: один для обслуживания статик и медиа файлов, а другой для Django приложения. С небольшими, и тем более с учебными проектами, справится и один сервер.

В папке /etc/nginx/sites-enabled создаем ссылку на файл mysite_nginx.conf, чтобы nginx увидел его:
sudo ln -s ~/path/to/your/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/

service nginx restart . если какие  проблемы  - смотрим :

See "systemctl status nginx.service" and "journalctl -xe"

для того, чтобы Nginx смог работать с файлом uWSGI-сокета добавим его в группу вашего проекта, в Ubuntu это можно сделать так

sudo usermod -a -G <usergroup> www-data

Устанавливаем uWSGI глобально


До сих пор uWSGI был установлен в виртуальном окружении. Чтобы была возможность автоматически запускать uWSGI при старте операционной системы, мы установим его глобально.

Деактивируем виртуальное окружение:
deactivate

Устанавливаем uwsgi:
sudo pip install uwsgi
# Или можно установить LTS (с долговременной поддержкой) версию
pip install http://projects.unbit.it/downloads/uwsgi-lts.tar.gz

На вики странице uWSGI описано несколько вариантов установки. Перед тем, как установить uWSGI глобально, вам не помешает определиться с выбором версии и методом установки.

Запусить uWSGI можно той же командой, что и раньше:
uwsgi --ini mysite_uwsgi.ini

Режим Emperor


Если сервер обслуживает несколько проектов, каждый из которых использует uWSGI, то нужно исползовать режим Emperor. В этом режиме uWSGI просматривает папку с конфигурационными файлами и для каждого файла запускает отдельный процесс (вассал).

Если один из конфигурационных файлов будет изменен, uWSGI перезапустит соответствующего вассала.

Создаем папку для конфигурационных файлов:
sudo mkdir /etc/uwsgi
sudo mkdir /etc/uwsgi/vassals

Создаем в ней ссылку на mysite_uwsgi.ini:
sudo ln -s /path/to/your/mysite/mysite_uwsgi.ini /etc/uwsgi/vassals/

Запускаем uWSGI в режиме Emperor:
sudo uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data

Опции:
  • emperor: папка с конфигурациолнными файлами
  • uid: id пользователя, от имени которого будет запущен процесс
  • gid: id группы, от имени которой будет запущен процесс

Проверяем. yourserver.com:8000/

Автоматичесеий запуск uWSGI после загрузки операционной системы


В файл /etc/rc.local, перед строкой “exit 0” добавляем:
/usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data