Debian 7 Wheezy + NGINX + UWSGI + Viartualenv + Django

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

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

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


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

                 Как делал читайте тут: FirstVDS: Debian 7 Wheezy + NGINX + Django и другие

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

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

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

---

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.09.2013 10:01  Ключевые словаdebian , django , nginx , uWSGI

Автор блога создает, продвигает и поддерживает сайты для бизнеса

  • Быстрая и качественная разработка сайтов/приложений
  • Качественная и продуманная SEO подготовка
  • Продвижение через Яндекс.Директ и Гугл.Адвордс


Комментарии: [12]

9:48 18.10.2014  Альберт

п. 17.2 там опечатка, если первая строчка название файла.
Вижу
#testprg.nginx
Должно быть
#testprj.nginx

8:26 29.09.2014  owlman

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

1:44 28.09.2014  zulman

Спасибо. Дело в том что wheezy 32bit в дефолтных репозиториях имеет только 1.2.3 uwsgi, который не понимает опцию '--wsgi-file'. https://packages.debian.org/source/wheezy/uwsgi

Чтобы читатели, в будущем, не боролись с проблемами - добавьте, пожалуйста, какие ссылки добавить в список репозиториев deb пакетов или что ставить uwsgi нужно через pip (или прочими способами).

11:37 14.06.2014  owlman

Спасибо за дополнение!
Пост обрастает полезными подробностями. :)

11:13 14.06.2014  Альберт

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

А здесь проблему решил дополнительным параметром "--plugin python"

11:09 14.06.2014  Альберт

Тоже были проблемы в настройкой, решил ее установкой uwsgi версии 1.4

pip install uwsgi==1.4

13:37 04.06.2014  owlman

Николай, вывод uwsgi не информативен в данном случае. Проверьте все ли шаги Вы выполнили и смотрите логи в /var/log/
Могу только предположить, что пустой экран у Вас потому что не работает связка NGINX+uWSGI+Django. Отрабатывает только uWSGI, но это гадание на кофейной гуще.

13:12 04.06.2014  Николай

Работает только вот не показывает 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)

15:39 03.06.2014  owlman

Версию uWSGI более позднюю берите.
У меня 1.9.16 на момент написания статьи работала нормально.

15:04 03.06.2014  Николай

Статья хорошая вот только не работает у меня
При вводе в консоль
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

14:30 29.05.2014  owlman

Спасибо!
Хорошо, что без вопросов.

4:12 29.05.2014  Алексей

Отличная статья!
Все завелось без вопросов.


Добавить комментарий

Внимание! HTML код и ссылки в комментариях отключены.
Комментарии содержащие ссылки, публикуются после модерации.
Имя:


e-mail:



Комментарий:
 

  
   
Λ