/ django

Django + nginx + uWSGI + supervisor

Думаю не нужно объяснять что пользователь под которым вы зашли не должен именоваться root. Ну если с этим проблем не замечено давайте начнем, для начала давайте поставим nginx:

sudo apt-get install python-software-properties
sudo add-apt-repository ppa:nginx/stable
sudo apt-get update
sudo apt-get install nginx

Теперь нам нужно установить pip

sudo apt-get install python-pip

И собственно установка нашего виртуального окружения

sudo apt-get install python-virtualenv

Теперь давайте определимся со структурой нашего сферического проекта в вакууме

/ - за корень возьмем папку нашего проекта
-app
--app2
--app3
--static
--media
--settings.py
--urls.py
--wsgi.py
-manage.py
-env
-logs
-pids
-uwsgi.ini

По строению дерева как мне кажется все понятно, давайте приступим в первую очередь нужно создать виртуальное окружение.

virtualenv --prompt="project" ./env

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

source ~/project/env/bin/activate

(Для деактивации нужное ввести deactivate)

Теперь мы можем поставить необходимые пакеты, для начала нам хватит 2-х

pip install django
pip install uwsgi

Теперь давайте создадим конфигурационный файл uwsgi.ini

nano ~/project/uwsgi.ini

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

[uwsgi]
home=/home/project/env
chdir=/home/project
master=True
disable-logging=True
vacuum=True
pidfile=/home/project/pids/project.pid
max-requests=5000
socket=127.0.0.1:49001
processes=2

pythonpath=/home/project
env=DJANGO_SETTINGS_MODULE=app.settings
module = django.core.handlers.wsgi:WSGIHandler()
touch-reload=/tmp/project.txt

Теперь давайте создадим конфиг для supervisor, он позволит нам управлять проектом и вообще будет следить, чтобы все работало

sudo nano /etc/supervisor/conf.d/project.conf 

И добавляем туда следующий код

[program:project]
command=/home/project/env/bin/uwsgi /home/project/uwsgi.ini
stdout_logfile=/home/project/logs/wsgi.log
stderr_logfile=/home/project/logs/wsgi_err.log
autostart=true
autorestart=true
redirect_stderr=true
stopwaitsecs = 60
stopsignal=INT

Обновляем supervisor

sudo supervisorctl update

Пеперь мы можем проверить статус приложения командой

sudo supervisorctl status

и перезапустить

sudo supervisorctl restart project

Теперь осталось настроить nginx для работы со всеми этими чудесами Сейчас нужно создать конфигурационный файл для nginx

sudo nano /etc/nginx/sites-available/project.conf

его содержимое

server {
        listen       80;
        server_name site.com;
        access_log  /var/log/nginx/access.log  main;
        error_log   /var/log/nginx/error.log info;


       location / {
                uwsgi_pass 127.0.0.1:49001;
                include uwsgi_params;
       }

        location /media/ {
                alias /home/project/app/media/;
                expires 30d;
        }

        location /static/ {
                alias /home/project/app/static/;
                expires 30d;
        }
}

и нужно его активировать

ln -s /etc/nginx/sites-available/project.conf  /etc/nginx/sites-enabled/project.conf

Теперь перезапускаем nginx и все должно работать

sudo service nginx restart