Рассмотрим каким образом можно настроить связку 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
# pip3 install django
# django-admin startproject myapp
# cd myapp
# nano test.py
def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return ["Hello World"]
# uwsgi --http :9090 --wsgi-file hello.py
# curl http://localhost:9090 Hello World
Переходим к настройке 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 -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).
Все должно работать 🙂