Настройка вебсервиса Django на Nginx через UWSGI

Допустим, у вас есть проект на Django, который вы хотите запустить на отдельном сервере и сделать его доступным извне. Существует не один способ сделать это. В этой статье речь пойдёт о том, как запустить простейший Django проект с минимальными конфигурациями как Django, так и Nginx через UWSGI.

Шаг 0. Установка Django и Nginx.

Предполагается, что Python у вас уже установлен. Для установки Django необходимо выполнить:

$ sudo pip install django

Устанавливаем Nginx:

$ sudo apt-get install nginx

Устанавливаем UWSGI:

$ sudo apt-get install uwsgi
$ sudo pip install uwsgi

Шаг 1. Создание проекта.

Допустим, наш проект должен называться djangoexample1. Чтобы его создать, необходимо выполнить команду:

$ django-admin startproject djangoexample1

После этого будет создана папка djangoexample1 с файлами проекта. Чтобы проверить, что проект работает, запускаем:

$ python manage.py runserver

После чего в браузере вводим адрес http://127.0.0.1:8000/ и проверяем, что там отображается приятная надпись "It worked! Congratulations on your first Django-powered page.".

После этого заливаем этот проект на сервер. Все дальнейшие действия осуществляются на сервере.

Если всё получилось, переходим ко второму шагу.

Шаг 2. Конфигурирование Nginx.

Заходим на сервер через SSH. Не забываем, что Django также должен быть установлен на сервере либо глобально, либо в виртуальной среде.

Все файлы конфигурации Nginx находятся в /etc/nginx/. Для того, чтобы добавить конфигурацию сервера, необходимо создать новый файл в папке /etc/nginx/sites-available:

$ sudo nano /etc/nginx/sites-available/djangoexample1

Записываем в этот файл минимальную работающую конфигурацию:

upstream djangoexample1 {
    server unix:///tmp/djangoexample1.sock;
}

server {
    listen      8081;
    server_name djangoexample1;
    charset     utf-8;

    location / {
        uwsgi_pass  djangoexample1;
        include     /home/alexander/websites/djangoexample1/uwsgi_params;
    }
}

Обратим внимание, что в конфигурации указан порт 8081. Именно по этому порту и будет осуществляться внешнее соединение с сервером. /tmp/djangoexample1.sock - это путь к сокету для работы с UWSGI. /home/alexander/websites/djangoexample1/uwsgi_params - это файл с параметрами UWSGI (у вас будет какой-то другой, свой путь к этому файлу), который должен содержать следующее:

uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

Добавьте этот файл в ваш проект.

Для того, чтобы сделать созданную конфигурацию активной, необходимо создать ссылку в папке /etc/nginx/sites-enabled с помощью команды:

$ sudo ln -s /etc/nginx/sites-available/djangoexample1 /etc/nginx/sites-enabled/djangoexample1

Перезапускаем Nginx:

$ sudo service nginx restart

Шаг 3. Установка и запуск UWSGI.

Запускаем UWSGI демон:

$ uwsgi --socket /tmp/djangoexample1.sock --wsgi-file djangoexample1/wsgi.py --chmod-socket=666 --daemonize djangoexample1.log

Если всё сделано правильно, то запрос в браузере http://:8081 выдаст надпись "It worked! Congratulations on your first Django-powered page.", что означает, что ваш проект доступен через Nginx извне.