Django: установка NGINX + uWSGI + Django на CentOS

Автор: | 01/28/2015
 

django_logo_2В дополнение к этому, этому и этому – решил собрать всё в одном месте, что бы упростить процесс.

Установка выполняется на:

# cat /etc/redhat-release
CentOS release 6.6 (Final)

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

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

Устанавливаем сам Django.

Пытался ставить из PyPI – но не зря я его не люблю – получил кучу ошибок при сборке, поэтмоу – ставим из репозитория:

# yum install django
...
Installed:
  python-django.noarch 0:1.2.3-2.el6.rf

Dependency Installed:
  MySQL-python.i686 0:1.2.3-0.3.c1.1.el6                 postgresql-libs.i686 0:8.4.20-1.el6_5                 python-psycopg2.i686 0:2.0.14-2.el6                 python-sqlite2.i686 1:2.3.5-2.el6

Complete!

При установке из репозитория – создаётся директория /var/www/django/:

# cd /var/www/django/

Создаём проект:

# django-admin.py startproject testing_setevoy_org_ua

Проверяем директории и файлы:

# ls -l
total 4
drwxr-xr-x 2 root root 4096 Jan 28 18:12 testing_setevoy_org_ua
# ls -l testing_setevoy_org_ua/
total 12
-rw-r--r-- 1 root root 0 Jan 28 18:12 __init__.py
-rw-r--r-- 1 root root 546 Jan 28 18:12 manage.py
-rw-r--r-- 1 root root 3418 Jan 28 18:12 settings.py
-rw-r--r-- 1 root root 514 Jan 28 18:12 urls.py

Проверяем Django:

# cd testing_setevoy_org_ua/
# python manage.py runserver 77.120.103.20:8081
Validating models...
0 errors found

Django version 1.2.3, using settings 'testing_setevoy_org_ua.settings'
Development server is running at http://77.120.103.20:8081/
Quit the server with CONTROL-C.

Открываем на фаерволе порт (временно):

iptables -I INPUT 2 -p tcp --dport 8081 -j ACCEPT

Заходим браузером на http://77.***.***.20:8081:

django_2

 

ОК, Django работает.

Устанавливаем uWSGI, тут либо качать исходники – либо из PyPI:

# pip install uwsgi
...
    ############## end of uWSGI configuration #############
    total build time: 6 seconds
    *** uWSGI is ready, launch it with /usr/bin/uwsgi ***
Successfully installed uwsgi
Cleaning up...

Проверяем uWSGI:

# uwsgi --version
2.0.8

Создаём файл test.py:

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return ["uWSGI works!"]

Запускаем:

# uwsgi --http :8081 --wsgi-file test.py

Проверяем:

# curl http://localhost:8081
uWSGI works

Всё работает.

Создаём файл лога:

# touch /var/log/uwsgi/testing.setevoy.org.ua.log

Создаём директорию для конфигураций uWSGI:

# mkdir /etc/uwsgi/

Создаём в ней файл настроек сайта /etc/uwsgi/testing.setevoy.org.ua.ini:

[uwsgi]
socket = 127.0.0.1:9090
chdir = /var/www/django/testing_setevoy_org_ua/
pythonpath = ..
module = django.core.handlers.wsgi:WSGIHandler()
env = DJANGO_SETTINGS_MODULE=settings
master = True
pidfile = /tmp/project-master.pid
daemonize=/var/log/uwsgi/testing.setevoy.org.ua.log
uid = setevoy
gid = setevoy

Меняем пользователя директории сайта:

# chown -R setevoy:setevoy /var/www/django/testing_setevoy_org_ua/

Сам NGINX уже установлен и настроен для других сайтов, пример – тут>>>.

Создаём файл настроек NGINX – /etc/nginx/conf.d/testing.setevoy.kiev.ua.conf:

server {
    server_name testing.setevoy.org.ua;
    access_log /var/log/nginx/testing.setevoy.org.ua-access.log;
    error_log /var/log/nginx/testing.setevoy.org.ua-error.log;
    root /var/www/django/testing_setevoy_org_ua/;

    location /
    {

        index index.py;

        uwsgi_pass 127.0.0.1:9090;
        include uwsgi_params;
   }
}

Проверяем NGINX:

# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

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

 # service nginx restart
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]

Что бы упростить работу с uWSGI – создаём скрипт /etc/init.d/uwsgi:

#!/bin/bash

### BEGIN INIT INFO
# Provides:          uwsgi
# Required-Start:    $syslog $remote_fs
# Should-Start:      $time ypbind smtp
# Required-Stop:     $syslog $remote_fs
# Should-Stop:       ypbind smtp
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

# Check for missing binaries (stale symlinks should not happen)
UWSGI_BIN=`which uwsgi`
test -x $UWSGI_BIN || { echo "$UWSGI_BIN not installed";
        if [ "$1" = "stop" ]; then exit 0;
        else exit 5; fi; }

UWSGI_EMPEROR_MODE=true
UWSGI_VASSALS="/etc/uwsgi/"
UWSGI_OPTIONS="--enable-threads --logto /var/log/uwsgi.log"
lockfile=/var/lock/subsys/uwsgi

UWSGI_OPTIONS="$UWSGI_OPTIONS --autoload"

if [ "$UWSGI_EMPEROR_MODE" = "true" ] ; then
    UWSGI_OPTIONS="$UWSGI_OPTIONS --emperor $UWSGI_VASSALS"
fi

case "$1" in
    start)
        echo "Starting uWSGI "
        daemon $UWSGI_BIN $UWSGI_OPTIONS &
        ;;
    stop)
        echo "Shutting down uWSGI "
        killproc $UWSGI_BIN
        ;;
    restart)
        $0 stop
        $0 start
        ;;
    status)
        echo "Checking for service uWSGI "
        status $UWSGI_BIN
        ;;
    *)
        echo "Usage: $0 {start|stop|status|restart}"
        exit 1
        ;;
esac
exit 0

Запускаем uWSGI:

# service uwsgi status
Checking for service uWSGI
uwsgi is stopped
# service uwsgi start
Starting uWSGI

Проверяем логи:

# tail /var/log/uwsgi/testing.setevoy.org.ua.log
Python main interpreter initialized at 0x17d81c0
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 145536 bytes (142 KB) for 1 cores
*** Operational MODE: single process ***
added ../ to pythonpath.
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x17d81c0 pid: 5919 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 5919)
spawned uWSGI worker 1 (pid: 5920, cores: 1)
 # tail /var/log/uwsgi.log
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 7803
your memory page size is 4096 bytes
detected max file descriptor number: 1024
*** starting uWSGI Emperor ***
*** has_emperor mode detected (fd: 6) ***
[uWSGI] getting INI configuration from testing.setevoy.org.ua.ini
Wed Jan 28 18:18:54 2015 - [emperor] vassal testing.setevoy.org.ua.ini has been spawned
Wed Jan 28 18:18:54 2015 - [emperor] vassal testing.setevoy.org.ua.ini is ready to accept requests

Открываем в браузере http://testing.setevoy.org.ua:

django_3

И проверим процессы и файлы:

 # ps aux | grep uwsgi | grep -v grep
root      6200  0.0  0.0 100944   636 pts/2    S+   18:42   0:00 tail -f /var/log/uwsgi/testing.setevoy.org.ua.log
root      6279  0.0  0.1 108432  1156 pts/3    S    18:43   0:00 /bin/bash /etc/init.d/uwsgi start
root      6281  0.0  0.1 108164  1384 pts/3    S    18:43   0:00 /bin/bash -c ulimit -S -c 0 >/dev/null 2>&1 ; /usr/bin/uwsgi --enable-threads --logto /var/log/uwsgi.log --autoload --emperor /etc/uwsgi/
root      6282  0.0  0.3  56668  3408 pts/3    S    18:43   0:00 /usr/bin/uwsgi --enable-threads --logto /var/log/uwsgi.log --autoload --emperor /etc/uwsgi/
setevoy   6283  0.0  1.2 200808 13124 pts/3    S    18:43   0:00 /usr/bin/uwsgi --ini testing.setevoy.org.ua.ini
setevoy   6284  0.1  1.6 212352 16424 pts/3    S    18:43   0:00 /usr/bin/uwsgi --ini testing.setevoy.org.ua.ini

Готово.