Debian 7 Wheezy + NGINX + UWSGI + Viartualenv + Django

15970 12

Давно хотел попробовать конфигурацию "nginx + uwsgi + virtualenv + django на базе Debian 7 Wheezy", чтобы понять за что так хвалят и в чем преимущество.

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

Если результат понравится, буду развивать успех и доведу до полноценного "боевого сервера".


21.01.2014 Результатами в целом доволен. Перевел свой хостинг от FirstVDS на такую конфигурацию.

                 Как делал читайте тут: Статья

11.06.2014 На FirsVDS раздают сервера по цене бутылки пива! (60 руб.)

Подробнее тут: http://firstvds.ru...

---
ПОШАГОВАЯ УСТАНОВКА

---

1. Ставим Debian 7 Wheezy c помощью образа дебиана (сетевая установка):

    http://mirror.yandex.ru/debian-cd/current/i386/iso-cd/debian-7.1.0-i386-netinst.iso

    Процедуру установки описывать не буду там все просто.

    Так как сеть не настроена получим "голую" систему, об этом нас вежливо предупредит установщик.

2. Настраиваем сетевой интерфейс для подключения к сети.

    Для начала смотрим какое устройство будем использовать:

root$ lspci

    Получаем список устройств в котором выбираем то которое будет работать в интернет. Например eth0.

    Далее правим настройки интерфейсов:

root$ nano /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1 

     Рестартуем сетевые интерфейсы:

root$ /etc/init.d/networking restart

 

3. Устанавливаем nginx.

root$ apt-get install mc nginx

4. Создаем папку для наших будущих проектов:

user$ mkdir -p /home/user/web/
# Здесь и далее файлы и директории в папке проекта делаем из под своего user.
# Для простоты, я обозначил пользователей root$ и user$ соответственно.

5. Для проверки работы nginx делаем default страницу и привязываем к виртуальному хосту default.

    Для этого создаем папу:

user$ mkdir -p /home/user/web/default/

    В созданной папке делаем файлы настроек виртуального хостинга default.nginx:

server {
    listen   80;
 	root /home/user/web/default;
 	index index.html index.htm;
 
 	server_name localhost;
 
 	location / {
 		try_files $uri $uri/ /index.html;
 	}
}

     и файл index.html с приветствием от nginx. Например так:

<html><head></head><body>This is default Nginx vhost</body></html>

6. Создаем симлинки на default.nginx в папках настроек nginx:

root$ ln -s /home/user/web/default/default.nginx /etc/nginx/sites-available/default.nginx
root$ ln -s /home/user/web/default/default.nginx /etc/nginx/sites-enabled/default.nginx 

7. Перегружаем nginx:

root$ /etc/init.d/nginx restart

8. Стучимся на наш сервер из браузера по адресу: http:\\*IP адрес нашего сервера*

    Если nginx работает, то в ответ должны получить наше приветствие:

This is default Nginx vhost

9. Ставим и проверяем uWSGI. Если ваш nginx не включает в себя uwsgi (nginx-full включает в себя uwsgi), то:

root$ apt-get install python-dev uwsgi 

10. Ставим плагин uwsgi-plugin-python для работы uwsgi со скриптами python:

root$ apt-get install uwsgi-plugin-python 

11. Проверим работу uwsgi, для этого:

   В /home/user/web/ пишем файл следующей командой:

echo """
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return 'Hello World'
""" > testwsgi_hello.py

   Запускаем uwsgi командой:

uwsgi --http :9090 --wsgi-file /home/user/web/testwsgi_hello.py

   и проверяем есть ли что нибудь по адресу http://*IP адрес нашего сервера*:9090

 

12. Ставим и настраиваем virtualenv для нашего проекта:

root$ apt-get install python-virtualenv

13. Настраиваем виртуальное окружение проекта. Для этого создаем папку окружения:

user$ mkdir -p /home/user/web/testprj_env/ 

     Переходим в папку окружения:

user$ cd /home/user/web/testprj_env/

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

user$ virtualenv -p python2.7 env  #Указываем необходимую версию питона

14. Активируем питон в виртуальном окружении нашего проекта:

user$ source env/bin/activate #для деактивации: user$ deactivate

 

15. Устанавливаем Django указав необходимую версию:

(env)...user$ pip install django==1.5

   Проверяем

(env)...user$ python
          >>> import django
          >>> django.VERSION
(1, 5, 0, 'final', 0) #Ответ который мы должны получить

16. Создаем проект testprj в папке виртуального окружения:

(env)...user$ django-admin.py startproject testprj

 

17. Подключаем Django к NGINX через uWSGI.

17.1. Для этого создаем папку:

user$ mkdir -p /home/user/web/testprj_env/testprj/deploy

17.2. В созданной папке делаем конфиг виртуального хоста:

#testprj.nginx
server {
       listen 80;
       server_name localhost;
       access_log /var/log/nginx/nginx-testprj-access.log;
       error_log /var/log/nginx/nginx-testprj-error.log;

       root /home/user/web/testprj_env/testprj/;

       location / {
             	try_files $uri /static/$uri
        @django_uwsgi;
       		}

       location @django_uwsgi {
     	 uwsgi_pass 127.0.0.1:3031;
     	 include uwsgi_params;
     	 }
}

17.3. Делаем симлинки на созданный конфиг в директориях nginx`са и удаляем симлинк сайта default:

root$ ln -s /home/user/web/testprj_env/testprj/deploy/testprj.nginx \
/etc/nginx/sites-available/testprj root$ ln -s /home/user/web/testprj_env/testprj/deploy/testprj.nginx \
/etc/nginx/sites-enabled/testprj
root$ rm /etc/nginx/sites-enabled/default.nginx

   Перегружаем nginx, заходим на localhost браузером. Должны получить - 502 Bad Gateway.

17.4. Создаем конфиги для uwsgi.

   /home/user/web/testprj_env/testprj/deploy/django_wsgi.py: 
import os, sys
 
# Python/Django location
sys.path.insert(0,'/home/user/web/testprj_env/env/')
sys.path.insert(0, '/home/user/web/testprj_env/env/lib/python2.7/site-packages')
# Project Location
sys.path.insert(0,'/home/user/web/testprj_env/testprj/')
sys.path.insert(0,'/home/user/web/')
 
# Project configuration file
os.environ['DJANGO_SETTINGS_MODULE'] = 'testprj.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
   /home/user/web/testprj_env/testprj/deploy/django_nginx.xml:
<uwsgi>
  <socket>127.0.0.1:3031</socket>
  <pythonpath>/home/user/web/testprj_env/testprj/deploy/</pythonpath>
  <module>django_wsgi</module>
</uwsgi>

17.5. Запускаем uwsgi с нашим конфигом:

(env)...user$ uwsgi -x /home/user/web/testprj_env/testprj/deploy/django_nginx.xml

    В браузере по localhost должны получить знакомое приветствие джанги:

    It worked!
    Congratulations on your first Django-powered page.
    ...

 

18. Устанавливаем и настраиваем Supervisor для автозагрузки нашего проекта:

 

18.1. Как и у автора источника на основе которого я писал этот пост supervisor с ходу ставиться не захотел. 

    Перед установкой необходимо установить библиотеку python-meld3. Для этого:

root$ apt-get install python-meld3
root$ pip install meld3==0.6.7

    После этого ставим supervisor:

root$ apt-get install supervisor

18.2. Настраиваем supervisor. Для этого делаем конфиг 

/etc/supervisor/conf.d/uwsgi_testprj.conf:
[program:uwsgi_testprj]
command=/home/user/web/testprj_env/testprj/deploy/uwsgi_testprj.sh
directory=/home/user/web/testprj_env/
user=user
autostart=true
autorestart=true
redirect_stderr=true

 

18.3. Делаем статовый скрипт

/home/user/web/testprj_env/testprj/deploy/uwsgi_testprj.sh:
#! /bin/bash
source /home/user/web/testprj_env/env/bin/activate
exec uwsgi -x /home/user/web/testprj_env/testprj/deploy/django_nginx.xml

   В правах владельца файла не забываем добавить права на запуск. Иначе supervisor будет ругаться на то, что файл "незапускаемый".

 

18.4. Обновляем настройки supervisor. Для этого:

root$ supervisorctl reread
root$ supervisorctl update

  И наконец запускаем наш проект под supervisor`ом:

root$ supervisorctl start all

  Если мы сделали все правильно, то supervisor не ругнется, а по адресу нашего проекта в браузере все также будет доступно приветствие джанги, даже после перезагрузки сервера.

 

 

Написано на основе рецепта на blog.swlogic.eu и ряда других источников.

 

Другие статьи об установке Django:

Debian 8 + Python 3.5 + PostgreSQL + NGINX + virtualenv + Django
FirstVDS: Debian 7 Wheezy + NGINX + Django и другие
Django + Apache2 + Nginx + mod_wsgi на FirstVDS
Django + WAMP без суеты
Ставим LAMP для разработки на рабочей станции Ubuntu 11.04

Комментарии

18 октября 2014 г. 9:48 Альберт
п. 17.2 там опечатка, если первая строчка название файла.
Вижу
#testprg.nginx
Должно быть
#testprj.nginx
29 сентября 2014 г. 8:26 owlman
Спасибо за дополнение.
В пост добавлять не буду, так как нет универсального способа решения всех проблем, для всех случаев и конфигураций.
В комментариях таким добавлениям самое место.
28 сентября 2014 г. 1:44 zulman
Спасибо. Дело в том что wheezy 32bit в дефолтных репозиториях имеет только 1.2.3 uwsgi, который не понимает опцию '--wsgi-file'. https://packages.debian.org/source/wheezy/uwsgi

Чтобы читатели, в будущем, не боролись с проблемами - добавьте, пожалуйста, какие ссылки добавить в список репозиториев deb пакетов или что ставить uwsgi нужно через pip (или прочими способами).
14 июня 2014 г. 11:37 owlman
Спасибо за дополнение!
Пост обрастает полезными подробностями. :)
14 июня 2014 г. 11:13 Альберт
>>Выдает ошибку
>>uwsgi: unrecognized option '--wsgi-file'
>>getopt_long() error

А здесь проблему решил дополнительным параметром "--plugin python"
14 июня 2014 г. 11:09 Альберт
Тоже были проблемы в настройкой, решил ее установкой uwsgi версии 1.4

pip install uwsgi==1.4
4 июня 2014 г. 13:37 owlman
Николай, вывод uwsgi не информативен в данном случае. Проверьте все ли шаги Вы выполнили и смотрите логи в /var/log/
Могу только предположить, что пустой экран у Вас потому что не работает связка NGINX+uWSGI+Django. Отрабатывает только uWSGI, но это гадание на кофейной гуще.
4 июня 2014 г. 13:12 Николай
Работает только вот не показывает Hello World
Выводится просто пустая страница
Может я чего-то не догоняю
Вот на всякий случай вывод консоли

*** Starting uWSGI 2.0.5.1 (64bit) on [Wed Jun 4 12:08:02 2014] ***
compiled with version: 4.7.2 on 04 June 2014 10:34:05
os: Linux-3.2.0-4-amd64 #1 SMP Debian 3.2.57-3+deb7u1
nodename: HP-ProBook
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 4
current working directory: /home/lol
detected binary path: /usr/local/bin/uwsgi
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 30671
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uWSGI http bound on :9090 fd 4
spawned uWSGI http 1 (pid: 4178)
uwsgi socket 0 bound to TCP address 127.0.0.1:41352 (port auto-assigned) fd 3
Python version: 3.2.3 (default, Feb 20 2013, 14:49:46) [GCC 4.7.2]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0xa80ca0
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 72768 bytes (71 KB) for 1 cores
*** Operational MODE: single process ***
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0xa80ca0 pid: 4177 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI worker 1 (and the only) (pid: 4177, cores: 1)
[pid: 4177|app: 0|req: 1/1] 127.0.0.1 () {36 vars in 561 bytes} [Wed Jun 4 12:08:16 2014] GET / => generated 0 bytes in 0 msecs (HTTP/1.1 200) 1 headers in 44 bytes (11 switches on core 0)
[pid: 4177|app: 0|req: 2/2] 127.0.0.1 () {36 vars in 561 bytes} [Wed Jun 4 12:10:23 2014] GET / => generated 0 bytes in 0 msecs (HTTP/1.1 200) 1 headers in 44 bytes (11 switches on core 0)

3 июня 2014 г. 15:39 owlman
Версию uWSGI более позднюю берите.
У меня 1.9.16 на момент написания статьи работала нормально.
3 июня 2014 г. 15:04 Николай
Статья хорошая вот только не работает у меня
При вводе в консоль
uwsgi --http :9090 --wsgi-file /home/use/web/testwsgi_hello.py

Выдает ошибку
uwsgi: unrecognized option '--wsgi-file'
getopt_long() error

Как я понял то здесь что-то с -wsgi-file, пробовал написать --plugin, но тогда тоже ошибка только другая
Версия uWSGI 1.2.3-debian
29 мая 2014 г. 14:30 owlman
Спасибо!
Хорошо, что без вопросов.
29 мая 2014 г. 4:12 Алексей
Отличная статья!
Все завелось без вопросов.

Контактные данные

 Россия, г. Москва