Настройка веб-сервера для Django с nginx и uWSGI

Для запуска Django сервера можно использовать любой веб-сервер с поддержкой WSGI. В данной статье мы по шагам разберем процесс настройки веб-сервера для Django с использованием nginx и uWSGI. Те же принципы можно применить и при использовании другого веб-сервера.

Шаги для запуска веб-сервера для хостинга Django:

  • Приобрести сервер
  • Установить системные пакеты
  • Подготовить виртуальное окружение
  • Создать каталог и залить проект
  • Установить необходимые зависимости
  • Настроить веб-сервер и uWSGI

Если вы хотите разобраться в деталях настройки сервера для хостинга Python (Django) проекта — то я рекомендую прочесть статью  http://itman.in/uwsgi-python-hosting/

Здесь же собраны только необходимые действия для запуска Django проекта на пустом Ubuntu сервере с использованием uWSGI.

Выбор сервера для хостинга сайта

Приобретение сервера сейчас не составляет сложности. Для хостинга простого сайта подойдет любой виртуальный сервер (VPS), для более сложных могут понадобится собственные сервера.

В этой статье рассмотрен вариант настройки сервера с операционной системой Ubuntu,

Установите нужные системные пакеты

В начале нужно обновить установленные на сервере системные пакеты. В Ubuntu для этого нужно выполнить две команды:

apt-get update
apt-get upgrade

Теперь можно установить необходимые для настройки сервера пакеты

apt-get install python-dev python-virtualenv git nginx

Создайте каталог и загрузите код проекта

Если ваш сервер используется для хостинга нескольких сайтов, то лучше выделить отдельный каталог для каждого проекта. Я использую каталог /data, в котором будут находится каталоги проектов.

mkdir -p /data/mysite; cd /data/mysite

Загрузка кода проекта на сервер

Если ваш проект в системе контроля версий GIT — это идеальный вариант — то достаточно выполнить git clone. Я использую для хранения исходного кода проекта Bitbucket:

git clone git@bitbucket.org:sharmazan/project.git

Если программный код у вас в виде архива файлов, то загрузите его на сервер с помощью scp. Под WIndows можно использовать программу WinSCP для подключения к Ubuntu серверу и загрузки файлов.

В дальнейшем предполагается следующая структура:

/data                     # Общий каталог для проектов на сервере
-------- mysite           # Каталог для сайта mysite
-------- -------- conf    # Конфигурационные файлы для веб-сервера
-------- -------- project # Код проекта
-------- -------- venv    # Каталог для виртуального окружения

Подготовить виртуальное окружение

Сперва создадим каталог, в котором будет находится виртуальное окружение:

mkdir venv; cd venv

Теперь создадим виртуальное окружение командой  virtualenv mysite:

virtualenv mysite

New python executable in mysite/bin/python
Installing distribute.............................................................................................................................................................................................done.
Installing pip...............done.

Теперь в каталоге venv появился каталог mysite, в котором будут хранится версия Python и все установленные в виртуальное окружение приложения.

Для активации виртуального окружения нужно выполнить команду:

source /data/mysite/venv/mysite/bin/activate

После этого все Python приложения будут устанавливаться внутрь виртуального окружения, и не будут конфликтовать с системными версиями.

Если ваш сервер используется для хостинга только одного сайта, то можно обойтись без создания виртуального окружения.

Чтобы деактивировать виртуальное окружения и работать с системными библиотеками, выполните команду

deactivate

Установить необходимые зависимости

После активации виртуального окружения можно установить приложения, которые необходимы для запуска и работы сайта. Как правило их список приведен в файле requiments.txt в корневом каталоге проекта.

Для установки используйте

pip install -r requiments.txt

или установите приложения по одному:

pip install django

Настройка NGINX и uWSGI

Для запуска python приложения в качестве сайта нужен любой веб-сервер с поддержкой WSGI. В состав Django входит простой веб-сервер, который позволяет сразу просмотреть работу сайта в процессе разработки.

Но для работы на хостинге нужно более серьезное решение. Nginx — возможно лучший веб-сервер на момент написания статьи, уже установлен. Также нужно установить uWSGI. Перед установкой деактивируйте виртуальное окружение, чтобы пакет был установлен в системные каталоги и выполните:

sudo pip install uwsgi

Настройка вашего сайта в nginx

Создайте каталог /data/mysite/conf для хранение файлов конфигурации и разместите в нем файл mysite_nginx.conf следующего содержания:

# mysite_nginx.conf

# the upstream component nginx needs to connect to
# Если будете настраивать несколько django сайтов - измените название upstream
upstream django {
    server unix:///data/mysite/mysite.sock; # for a file socket
}

# configuration of the server
server {
    listen      80;           # порт на котором будет доступен ваш сайт
    server_name .example.com; # доменное имя сайта
    charset     utf-8;

    client_max_body_size 75M; # max upload size  

    # Django media
    location /media  {
        alias /data/mysite/project/media;  
    }

    location /static {
        alias /data/mysite/project/static; 
    }

    location / {
        uwsgi_pass  django;
        include     uwsgi_params; 
        }
    }

Если файла /etc/nginx/uwsgi_params не существует, загрузите его с сайта https://github.com/nginx/nginx/blob/master/conf/uwsgi_params

Эта конфигурация сообщает nginx, что он должен сам отдать браузеру статические и загруженные пользователем файлы, доступные по адресу: www.example.com/static/filename.jpg или www.example.com/media/filename.jpg

Затем запрос будет передан для дальнейшей обработки Python программе через  uWSGI, используя файл-сокет /data/mysite/mysite.sock.

Чтобы nginx использовал новый файл конфигурации, добавьте ссылку на него в каталог /etc/nginx/sites-enabled/

cd /etc/nginx/sites-enabled/
ln -s /data/mysite/conf/mysite_nginx.conf

Теперь нужно перезагрузить nginx командой

service nginx restart

или

/etc/init.d/nginx restart

Чтобы убедится, что ваш сайт работает, загрузите в каталог /data/mysite/project/media файл media.png и откройте в браузере http://mysite.com/media/media.png

Если картинка отобразится, значит nginx настроен корректно.

Настройка uWSGI

Создайте в каталоге /data/mysite/conf файл `mysite_uwsgi.ini`:

# mysite_uwsgi.ini file
[uwsgi]

# Django-related settings
# the base directory (full path)
chdir           = /data/mysite/project
# Django's wsgi file
module          = project.wsgi
# the virtualenv (full path)
home            = /data/mysite/env/virtualenv

# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 10
# the socket
socket          = /data/mysite/mysite.sock
# ... with appropriate permissions - may be needed
chmod-socket    = 664
# clear environment on exit
vacuum          = true
# account to start process
uid             = www-data
gid             = www-data
# Output messages to log
daemonize=/var/log/uwsgi/mysite.log

uWSGI будет выводить сообщения в файл /var/log/uwsgi/mysite.log. Для просмотра логов uwsgi можно использовать команду

tail -f /var/log/uwsgi/mysite.log

Чтобы uWSGI запускался при старте сервера, добавьте в файл /etc/rc.local строку

/usr/local/bin/uwsgi --ini /data/mysite/conf/mysite_uwsgi.ini

Перезагрузите сервер. После старта зайдя по адресу http://example.com — вы должны увидеть свой сайт.

Настройка веб-сервера для Django с nginx и uWSGI: 6 комментариев

      1. У меня тоже.
        Ошибка возникала почти после каждого действия, но это из-за моей криворукости.
        На последнем этапе не понял что делать, и тупо засунул весь свой проект на Django в папке /data/mysite/project
        Сейчас ошибка 502…
        Опишите по подробнее: как начать сам проект Django после всех действий?

        1. Я бы не рекомендовал начинать проект на сервере.

          Обычно проект создается у себя на локальном компьютере, а затем его код переносится на сервер, как правило через систему контроля версий.

          Если вам интересно подробнее узнать про старт проекта на Django, рекомендую посмотреть:

          раздел по размещению проекта в курсе Djangogirls
          http://tutorial.djangogirls.org/ru/deploy/index.html

          уроки по Django:
          http://itman.in/uroki-django/

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *