Блог Синявского
  • Разделы
  • Метки
  • Все статьи

Nginx Django fastcgi через unixsocket

1

Сейчас правильная настройка продакшена и выбор технологий для каждого разработчика, это как выбор религии. Вариантов настройки 100500 и каждый обладает теми или иными качествами, достоинствами и недостатками, и подходит для решения конкретных задач. Выбирают также по тому, что нравится знают. На ум приходит связка frontend nginx - backend apache2 mod_wsgi django - крайне стабильная связка, но требует большего количества памяти. Есть вариант от nginx, через TCP socket.

project_name - везде в тексте название проекта (или домена)

Описание

Многие используют стандартную директорию для того, чтобы развернуть web-приложение. В результате многочисленных установок проб и ошибок мною была выбрана следующая структура папок:

root - корень файловой системы на сервере

root/web - для проектов и репозиториев

root/web/<project_name> - директория проекта

root/web/<project_name>/env - виртуальное окружение

root/web/<project_name>/run - для хранения socket файлов и файлов идентификаторов процессов

root/web/<project_name>/logs - для хранения логов проекта

root/web/<project_name>/mysql - для хранения дампов

root/web/<project_name>/cron - для хранения cron скриптов

root/web/<project_name>/project - рабочая папка Django проекта

root/web/repository/ - репозитории проектов

root/web/repository/<project_name>.git - bare репозиторий проекта

для тех, кто хочет можно папки static и media вынести тоже на уровень выше из проекта

root/web/<project_name>/media - папка для загрузки файлов

root/web/<project_name>/static_production - папка collectstatic

root/web/<project_name>/statiс - папка статики

эти папки у меня всегда внутри проекта, media добавлена в .gitignore

Подготовка

Устанавливать будем все от суперпользователя: sudo su

Создаем структуру каталогов:

# mkdir -p /web/<project_name>/{run,logs,mysql}
# chmod 755 /web/ -R

Настраиваем виртуальное окружение:

# apt-get install python-virtualenv
# cd /web/<project_name>/
# virtualenv -p python2.7 env

Активируем виртуальное окружение source enb/bin/activate

Настраиваем сервер nginx

Устанавливаем nginx # apt-get install nginx

Переходим в директорию virtualhosts # cd /etc/nginx/sites-available/

Создаем новый virtualhost # nano <project_name>

#!lineos='inline' hl_lines='1 3 10'
server {
        listen   80;
        server_name <project_name>.<zone>; # zone - com ru etc ...

        access_log  /web/<project_name>/logs/access.log;
        error_log /web/<project_name>/logs/error.log info;

        location / {
                include fastcgi_params;
                fastcgi_pass unix:/web/<project_name>/run/django.sock;
                fastcgi_param PATH_INFO $fastcgi_script_name;
                fastcgi_param REQUEST_METHOD $request_method;
                fastcgi_param QUERY_STRING $query_string;
                fastcgi_param SERVER_NAME $server_name;
                fastcgi_param SERVER_PORT $server_port;
                fastcgi_param SERVER_PROTOCOL $server_protocol;
                fastcgi_param CONTENT_TYPE $content_type;
                fastcgi_param CONTENT_LENGTH $content_length;
                fastcgi_pass_header Authorization;
                fastcgi_intercept_errors off;
                proxy_redirect     off;
                proxy_set_header   Host             $host;
                proxy_set_header   X-Real-IP        $remote_addr;
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

        location ~* /(static_production|static|media)/ { 
                root /web/<project_name>/project/;
                gzip on;
                gzip_comp_level 6;
                gzip_proxied any;
                gzip_types text/css application/x-javascript text/javascript image/png image/svg+xml application/font-woff;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }

}

Активируем virtualhost, создаем символическую ссылку ln -s <project_name> /etc/nginx/sites-enabled/

Удаляем дефолный virtualhost rm ../sites-enabled/default

Идем nano ../fastcgi_params и комментим там слеудующу строчку иначе будут циклические редиректы

#fastcgi_param  SCRIPT_NAME             $fastcgi_script_name;

Перезапускаем nginx service nginx restart

Выставляем права chmod 755 /web/<project_name>/logs/ -R - сюда пишется логи nginx

Настраиваем Django приложение

Без python-flup сервер Django приложения не запустится в режиме fastcgi.

В активированном окружении устанавливаем python-flup: (env)# easy_install Flup или (env)# pip install python-flup

Создаем файлы идентификатора процесса и сокетный файл:

# touch /web/<project_name>/run/django.pid
# touch /web/<project_name>/run/django.sock
# chmod 644 /web/<project_name>/run/ -R
# chmod 755 /web/<project_name>/run/
# chown www-data:www-data /web/<project_name>/ -R

Пишем скрипт автозапуска django приложения

nano /etc/init.d/<project_name>

#!lineos='inline' hl_lines='1 3 10'
#!/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/web/<project_name>/env/bin/
SITENAME="<project_name>"
PROJDIR="/web/$SITENAME"
PIDFILE="$PROJDIR/run/django.pid"
SOCKET="$PROJDIR/run/django.sock"
APPDIR="$PROJDIR/project"
WEBOWN='www-data'

case "$1" in
    start)
        echo -n "Start ${SITENAME} fastcgi server"
        touch ${PIDFILE}
        chown ${WEBOWN}: ${PIDFILE} && chmod 666 ${PIDFILE}
        cd ${APPDIR}
        . ${PROJDIR}/env/bin/activate
        python ./manage.py runfcgi maxchildren=10 maxspare=5 minspare=2 method=prefork socket=${SOCKET} pidfile=${PIDFILE}
        chown ${WEBOWN}: ${SOCKET}
        RETVAL=$?
        echo
    ;;
    stop)
        echo -n "Stopping ${SITENAME} fastcgi server"
        cd $PROJDIR
        if [ -f $PIDFILE ]; then
            kill `cat -- $PIDFILE` || kill -9 `cat -- $PIDFILE`
            rm -f -- $PIDFILE
        else
            echo -n "Not found PID file"
        fi
        RETVAL=$?
        echo
    ;;
    restart|reload)
        $0 stop
        $0 start
        RETVAL=$?
    ;;
    status)
        echo -n "Server run with PID: "`cat -- $PIDFILE`
        RETVAL=$?
        echo
    ;;
    *)
        echo "Usage: back {start|stop|status|restart}"
        $0 restart
        exit 1
esac

Добавим прав нашему скрипту chmod +x /etc/init.d/<project_name>

Разворачиваем Django приложение из репозитория

# cd /web/<project_name>
# git clone /web/repository/<project_name>.git  project
# chmod 644 /web/<project_name>/project -R
# chmod 755 /web/<project_name>/project
# chown www-data:www-data /web/<project_name>/project -R

Если статья была вам полезна просьба щелкнуть по рекламе. Спасибо!



  • ← сюда
  • туда →

comments powered by Disqus

Опубликовано

19.03.2014

Обновление

05.05.2022

Категории

django

Тэги

  • bash 10
  • django 12
  • fastcgi 1
  • nginx 11
  • python 30
  • ubuntu 36

Всегда на связи

  • Блог Синявского - Ничего не переносить на завтра, это тоже проблема с прокастинацией?
  • © Алексей Синявский, по лицензии CC BY-SA если не указано иное.
  • С использованием Pelican. Тема: Elegant от Talha Mansoor