Настройка nginx — uwsgi — Django на CentOS

Рассмотрим каким образом можно настроить связку nginx — uwsgi — Django на сервере с CentOS.

nginx (‘э́нгинкс или э́нжин-и́кс‘) — веб-сервер и почтовый прокси-сервер, работающий на Unix-подобных операционных системах. Более подробно в мануале.

 

 

uWSGI (Web Server Gateway Interface) — стандарт взаимодействия между Python-программой, выполняющейся на стороне сервера, и самим веб-сервером, в нашем случае — nginx.

 

Django (Джанго, [‘dʒæŋɡoʊ]) — свободный фреймворк для веб-приложений на языке Python, использующий шаблон проектирования MVC.

Т.е., в нашей схеме на «входе» будет принимать соединения NGINX, передавать их uWSGI, который в свою очередь будет вызывать Python-скрипты.

Устанавливаем необходимые пакеты:

# yum -y install python python-pip python-devel
libxml2 libxml2-devel python-setuptools zlib-devel wget openssl-devel
pcre pcre-devel gcc make autoconf automake

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

# pip3 install uwsgi
Устанавливаем django
# pip3 install django
Создаем проекта django с именем myapp (находимся в директории /home/username/)
# django-admin startproject myapp
Переходим в директорию проекта
# cd myapp
Создаем в директории тестовый файл test.py:
# nano test.py
Со следующим содержимым:
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return ["Hello World"]
Тестируем связку uWSGI — Python
# uwsgi --http :9090 --wsgi-file hello.py
Открываем в браузере
# curl http://localhost:9090 
Hello World
Отлично, uWSGI — работает.

Переходим к настройке nginx

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

# yum -y install nginx

Создаем файл настроек хоста:

# cd /etc/nginx/conf.d   # В ubuntu конфигурационный файл или ссылку на файл необходимо разместить в каталоге /etc/nginx/sites-enabled/
# mv default.conf default.conf.bkp
# nano myapp.conf

В конфигурационном файле прописываем следующие настройки:

# myapp_nginx.conf

upstream django {
    server unix:///home/username/myapp/myapp.sock;
    #server 127.0.0.1:8001; # взаимодействие с uwsgi через веб-порт
}

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

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

    # обслуживание медиа файлов и статики
    location /media {
    alias /home/username/myapp/files/media; # расположение медиафайлов (при необходимости измените)
    }

location /static {
    alias /home/username/myapp/files/static; # расположение статики (при необходимости измените)

    }

# Остальные запросы перенаправляются в Django приложение
location / {
    uwsgi_pass django;
    include /home/username/myapp/uwsgi_params;
    }
}
Проверяем и стартуем nginx
# nginx -t # service nginx start

Проверяем связку nginx — uWSGI — python

Переходим в каталог, где лежит файл test.py. (/home/username/myapp/).

$ uwsgi --socket 127.0.0.1:9090 --wsgi-file hello.py --master

Открываем в браузере 127.0.0.1:9090, результат скрипта — «Hello word».

Настраиваем связку nginx — uWSGI — Django

Создаем в директории с Django приложением файл uwsgi_params:

# nano /home/username/myapp/uwsgi_params

Со следующим содержимым

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;

Создаем конфигурационный файл myapp_uwsgi.ini

# nano myapp_uwsgi.ini

Со следующим содержимым

#myapp_uwsgi.ini
[uwsgi]

# Настройки, связанные с Django
# Корневая папка проекта (полный путь)
chdir = /home/username/myapp
# Django wsgi файл
module = scada_app.wsgi
# полный путь к виртуальному окружению - раскоментить если испольуется вируальное окружение
#home = /home/username/myapp

# общие настройки
# master
master = true
# максимальное количество процессов
processes = 10
# полный путь к файлу сокета
socket = /home/username/myapp/myapp.sock
# права доступа к файлу сокета
chmod-socket = 666
# очищать окружение от служебных файлов uwsgi по завершению
vacuum = true

Дерево каталогов в директории приложения имеет следующий вид:

myapp

--files (/statis/ - лежать все статические файлы приложения)
--manage.py
--myapp
--myapp_nginx.conf
--myapp.sock ( создается при запуске приложения)
--myapp_uwsgi.ini
--test.py
--uwsgi_params

Настройка статических файлов в myapp/settings.py:

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "files/static/") #For production

Запуск приложения Nginx — uWSGI — Django

Рестартуем nginx.

# sudo service nginx restart

Запускаем приложение из каталога /home/username/myapp/

# uwsgi --ini myapp_uwsgi.ini

Переходим в браузере по адресу 127.0.0.1:8000 (указали в файле myapp_nginx.conf).

Все должно работать 🙂