Сейчас правильная настройка продакшена и выбор технологий для каждого разработчика, это как выбор религии. Вариантов настройки 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
Если статья была вам полезна просьба щелкнуть по рекламе. Спасибо!