/ django

Настройка сервера для Django. Gunicorn + Nginx + Ubuntu

В этой заметке я хочу описать процесс настройки боевого сервера для хостинга Django проектов. И так нам потребуется 30 минут времени и сервер на Ubuntu 12.*.

Для начала необходимо создать пользователя и запретить автоизацию из под root

adduser django
adduser django sudo

теперь необходимо зайти на сервер из под root'а

nano /etc/ssh/sshd_config

и выставляем PermitRootLogin no

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

service ssh restart

Теперь нужно перезайти на сервер под пользователем django и с этого момента мы будем использовать команду sudo

Для удобной работой с файловой системой предлагаю поставить Midnight Commander

sudo apt-get install mc
sudo mc

Для удобной работы с репозиториями ставим python-software-properties

sudo apt-get install python-software-properties

Дабавляем репозитории Nginx

sudo add-apt-repository ppa:nginx/stable
sudo apt-get update

Ставим необходимые пакеты

sudo apt-get install nginx mysql-server mysql-client libmysqlclient-dev python-mysqldb python-pip python-virtualenv supervisor git-core redis-server gunicorn make g++ python-dev

Можно еще установить postfix для отправки email, но я чаще пользуюсь smtp

sudo apt-get install postfix

Структура проектов

Для структуризации файлов в проекте мы будем пользоваться вот этой моей заметкой.

А по поводу хранения самих проектов могу сказать следующее, в домашней папке создадим 3 директории

cd ~/
mkdir projects #папка с проектами
mkdir logs #папка с логами
mkdir .envs #папка с виртуальными окружениями

Виртуальные окружения

Теперь давайте подготовим виртуальные окружения для старта, как я писал в заметке о структуре проектов мы будем называть окружение также как называется проект в нашем случае это prjct

cd ~/
virtualenv —prompt="prjct" .envs/prjct

И теперь мы можем использовать наше виртуальное окружение для проекта

source ~/.envs/prjct/bin/activate

Создание БД в MySQL

Заходим в mysql под пользователем root и с паролем который мы указали когда ставили пакет

mysql -u root -p PASSWORD
#создаем БД
prjctmysql> CREATE DATABASE IF NOT EXISTS `prjct` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
#создаем пользователя prjct
mysql> CREATE USER 'prjct'@'localhost' IDENTIFIED BY '$password’; # укажите пароль вместо $password
#Даем пользователю права на БД
mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `prjct`.* TO 'prjct'@'localhost’;
mysql> exit;

Теперь вносим эти настройки в свой settings.py (лучше конечно настройки БД вынести в отдельный файл settings_local.py, чтобы было проще при разработке)

Перенос проекта

Теперь копируем проект в директорию ~/projects/prjct/. Вы можете перенести файлы использую sftp или же скопировать из своего репозитория, если вы используете git. После того как вы скопировали все файлы проекта, нужно выполнить установку всех зависимостей (они должны быть записаны в файле requirements.txt)

pip install -r requirements.txt

Дальше проверим все ли работает и выполним все служебные команды

python manage.py validate #если все хорошо продолжаем
python manage.py syncdb
python manage.py migrate
python manage.py collectstatic —noinput

Теперь нужно создать директорию в которой мы будем хранить все логи проекта:

mkdir ~/logs/prjct

Настройка supervisor и gunicorn

Теперь установим настройки нашего проекта в supervisor. В директории с проетом у нас должна быть создана директория conf и в ней директория supervisor в которой лежит файл prjct.conf. Я всегда храню их в директории с проектом, чтобы их содержимое можно было контолировать и при переносе с сервера на сервер просто копировать.

Содержимое файла

[program:prjct]

command=sh /home/django/projects/prjct/run/run.sh
directory=/home/django/projects/prjct
user=django
autostart=true
autorestart=true
stderr_logfile=/home/django/logs/prjct/errors.log
stdout_logfile=/home/django/logs/prjct/access.log

Теперь отдаем файл настроек supervisor’у

cd ~/projects/prjct/conf/supervisor
sudo ln prjct.conf /etc/supervisor/conf.d/prjct.conf
sudo supervisorctl update
sudo supervisorctl status

После последней команды мы должны увидеть наш проект в списке и то что он не работает. А не работает он потому что у нас нет файла для запуска gunicorn /home/django/projects/prjct/run/run.sh, собственно его нужно создать и его содержимое будет таково:

#!/bin/sh

NAME=prjc
SRCDIR=prjc

GUNICORN=/usr/bin/gunicorn_django
HOMEDIR=/home/django

VIRTUALENV=${HOMEDIR}/.virtualenvs/${NAME}
PROJECTDIR=${HOMEDIR}/projects/${NAME}
SOCKFILE=/tmp/${NAME}.sock
MANAGE=${PROJECTDIR}/manage.py

. ${VIRTUALENV}/bin/activate
python ${MANAGE} run_gunicorn --bind unix:${SOCKFILE}

Теперь перезапускаем наше приложение и смотрим статус:

sudo supervisorctl restart prjct
sudo supervisorctl status

Поидее все должно работать (:

Настройка NGINX

В директории conf у нас должна быть директория nginx где мы будем хранить конфигурационный файл для nginx. Собственно вот создержимое файла ~/projects/prjct/conf/nginx/prjct.conf:

upstream prjct_server{

server unix:/tmp/prjct.sock fail_timeout=0;
}

server {
listen 80;
server_name prjct_domain;
if ($http_host = www.prjct_domain) {
rewrite (.*) http://prjct_domain$1 permanent;
}

location / {
client_max_body_size 20m;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://prjct_server;
autoindex on;
}

location /media {
root /home/django/projects/prjct;
autoindex off;
expires max;
access_log off;
}

location /static {
root /home/django/projects/prjct;
autoindex off;
expires max;
access_log off;
}

access_log /var/log/nginx/prjct.access.log;
error_log /var/log/nginx/prjct.error.log;

Этот файл необходимо скопировать к конфигам nginx

cd ~/projects/prjct/conf/nginx
sudo ln prjct.conf /etc/nginx/sites-enabled/prjct.conf 

И последнее что осталось это перезапустить nginx

sudo service nginx restart

И теперь все должно работать

P.S. По поводу выбора vps я пользуюсь linode, до этого был на amazone, azure и hetzner. Недавно думал переехать digitalocean, но как то не пошло с ними, выигрыша в производительности я особо не заметил, хоть в linode и нет ssd, но зато 8-ми поточные процы. В общем рекомендую, ну и вот моя реф.ссылка для тех кто захочет пользоваться linode