Давно хотел попробовать конфигурацию "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
Комментарии
В пост добавлять не буду, так как нет универсального способа решения всех проблем, для всех случаев и конфигураций.
В комментариях таким добавлениям самое место.
Чтобы читатели, в будущем, не боролись с проблемами - добавьте, пожалуйста, какие ссылки добавить в список репозиториев deb пакетов или что ставить uwsgi нужно через pip (или прочими способами).
Пост обрастает полезными подробностями. :)
>>uwsgi: unrecognized option '--wsgi-file'
>>getopt_long() error
А здесь проблему решил дополнительным параметром "--plugin python"
pip install uwsgi==1.4
Могу только предположить, что пустой экран у Вас потому что не работает связка NGINX+uWSGI+Django. Отрабатывает только uWSGI, но это гадание на кофейной гуще.
Выводится просто пустая страница
Может я чего-то не догоняю
Вот на всякий случай вывод консоли
*** 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)
У меня 1.9.16 на момент написания статьи работала нормально.
При вводе в консоль
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
Хорошо, что без вопросов.
Все завелось без вопросов.
Вижу
#testprg.nginx
Должно быть
#testprj.nginx