uwsgi + nginx + django (Ubuntu 11.04 — 12.04)

Дата публикации: 18-04-2013 | Автор: MelfisFettel | Рубрика: Django, Ubuntu Server

uwsgi + nginx +django Ubuntu ServerПересел я на разработку под Django. Замечательная вещь должен я заметить. Ну вот, по окончании проекта, понадобилось его попробовать на доменном имени запустить. Мало ли там со статикой что не так, или накосячил вообще где. Понятно что на сервере разработки работало все отлично. Просто установив lamp запустить проекты на Django не получится. Так как большую часть времени провожу с семейством Ubuntu server то решил поднимать все на нем. Все написанное проверялось на чистых свежеустановленных Ubuntu Server 10.04-11.04 и Ubuntu server 12.04. Говорю сразу, картинок не будет :) .

Справедливо для Django 1.4.5 / Ubuntu 10.04-11.04 (12.04)

Для начала, почему Django 1.4.5, пробовал поднимать на Django 1.5.2, т что то там не завелось у меня со статическими файлами, как оказалось позднее, нужно было просто до установить один модуль. Все далее описанное, я произвожу от имени пользователя root.

1
2
3
4
5
6
7
apt-get install gcc python python-dev python-pip python-mysqldb build-essential
#(Вместо python-mysqldb может быть python-mysql)
#Возможно пригодится apt-get install python-django
apt-get install  libxml2 libxml2-dev libpcre3 libpcre3-dev libpcrecpp0 libssl-dev zlib1g-dev
apt-get install make
apt-get install nginx
apt-get install mysql-server  
apt-get install gcc python python-dev python-pip python-mysqldb build-essential
#(Вместо python-mysqldb может быть python-mysql)
#Возможно пригодится apt-get install python-django
apt-get install  libxml2 libxml2-dev libpcre3 libpcre3-dev libpcrecpp0 libssl-dev zlib1g-dev
apt-get install make
apt-get install nginx
apt-get install mysql-server  

В принципе Вы можете собрать вручную nginx и подключить при сборке uwsgi, хотя на сколько я понял, его поддержка уже встроена с версии вроде как 0.8……или как то так.

1
pip install Django==1.4.5 #Да, я устанавливаю именно версию 1.4.5
pip install Django==1.4.5 #Да, я устанавливаю именно версию 1.4.5

Проверим что Django установилась:

1
2
3
python
>>>import django
>>>django.VERSION
python
>>>import django
>>>django.VERSION

Установка uwsgi
Uwsgi я установлю версии 1.9.6, в каталог /var/uwsgi. Если Вы, измените каталог установки uwsgi, то далее по этой статье, не забудьте поменять путь к исполняемому файлу uwsgi.

1
2
3
4
5
6
cd $home
wget http://projects.unbit.it/downloads/uwsgi-1.9.6.tar.gz #Скачиваем
tar -xzf uwsgi-1.9.6.tar.gz #Распаковываем
mv /uwsgi-1.9.6 /var/uwsgi #Переносим по новому пути
cd /var/uwsgi
make -f Makefile
cd $home
wget http://projects.unbit.it/downloads/uwsgi-1.9.6.tar.gz #Скачиваем
tar -xzf uwsgi-1.9.6.tar.gz #Распаковываем
mv /uwsgi-1.9.6 /var/uwsgi #Переносим по новому пути
cd /var/uwsgi
make -f Makefile

Возможно, последняя команда будет не make -f Makefile, а:

1
python uwsgiconfig.py
python uwsgiconfig.py

Настройка uwsgi

Создадим скрипт запуска

1
2
touch /etc/init.d/uwsgi
nano /etc/init.d/uwsgi
touch /etc/init.d/uwsgi
nano /etc/init.d/uwsgi

Запишем в него вот такие строки:
(Скрипт запуска полностью рабочий. По желанию, можете допилить условия проверки при попытке запуска сервера:
Запущен ли сервер, При попытке перезапуска сервера: запущен ли он.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/bin/sh
 
###########################################
#                Работает при помощи нанотехнологий!  #
#                                  http://melfis.ru/                     #
#                                            2013                             #
###########################################
 
#Конфиг для uwsgi
UWSGI_CONFIG="/var/www/django/webapp.xml"
  
#Лог файл для uwsgi. (Крайне полезная штука.)
UWSGI_LOG="/var/log/uwsgi.log"
 
#pid процесса(ов) для его/их аннигиляции при команде stop
KillPid="$(pidof /var/uwsgi/uwsgi)"
 
case $1 in
start)
    echo "Запуск uWsgi..."
    /var/uwsgi/uwsgi --xml ${UWSGI_CONFIG} -d ${UWSGI_LOG} #Запуск uwsgi.
        # Если Вы изменили папку установки uwsgi, то и в этом скрипте, ам необходимо поменять "/var/uwsgi/uwsgi"
    ;;
stop)
    echo "Завершение uWsgi..."
    #kill pidof uwsgi &> /dev/null
    kill -9 ${KillPid};
    echo "Аннигиляции pid:" ${KillPid};
    ;;
restart)
    echo "Презапуск uWsgi..."
    kill pidof uwsgi &> /dev/null
    sleep 5
    /var/uwsgi/uwsgi --xml ${UWSGI_CONFIG} -d ${UWSGI_LOG}
    ;;
help)
    echo "Используйте (start|stop|restart|help). Заходите в гости на http://melfis.ru/"
    ;;
exit 0
;;
*) echo "Используйте (start|stop|restart|help)"
esac
 
exit 0
#!/bin/sh

###########################################
#                Работает при помощи нанотехнологий!  #
#                                  http://melfis.ru/                     #
#                                            2013                             #
###########################################

#Конфиг для uwsgi
UWSGI_CONFIG="/var/www/django/webapp.xml"
  
#Лог файл для uwsgi. (Крайне полезная штука.)
UWSGI_LOG="/var/log/uwsgi.log"

#pid процесса(ов) для его/их аннигиляции при команде stop
KillPid="$(pidof /var/uwsgi/uwsgi)"

case $1 in
start)
	echo "Запуск uWsgi..."
	/var/uwsgi/uwsgi --xml ${UWSGI_CONFIG} -d ${UWSGI_LOG} #Запуск uwsgi.
        # Если Вы изменили папку установки uwsgi, то и в этом скрипте, ам необходимо поменять "/var/uwsgi/uwsgi"
	;;
stop)
	echo "Завершение uWsgi..."
	#kill pidof uwsgi &> /dev/null
	kill -9 ${KillPid};
	echo "Аннигиляции pid:" ${KillPid};
	;;
restart)
	echo "Презапуск uWsgi..."
	kill pidof uwsgi &> /dev/null
	sleep 5
	/var/uwsgi/uwsgi --xml ${UWSGI_CONFIG} -d ${UWSGI_LOG}
	;;
help)
	echo "Используйте (start|stop|restart|help). Заходите в гости на http://melfis.ru/"
	;;
exit 0
;;
*) echo "Используйте (start|stop|restart|help)"
esac

exit 0

Сделаем исполняемым:

1
chmod +x /etc/init.d/uwsgi
chmod +x /etc/init.d/uwsgi

Создаем папку /var/www/django
(Если хотите, то можете изменить папку, но в дальнейшем, вам прийдется изменить пути и в следующих шагах.)

1
2
3
mkdir /var/www/
mkdir /var/www/django
cd /var/www/django
mkdir /var/www/
mkdir /var/www/django
cd /var/www/django

Создадим конфиг uwsgi

1
touch webapp.xml
touch webapp.xml

Записываем в этот файл:

1
2
3
4
5
6
7
8
9
<uwsgi>
    <socket>/tmp/uwsgi.sock</socket>
    <process>1</process> #Количество процессов. говорят, должно быть как количество ядер сервера, но я не думаю что стоит так делать. Пусть лучше 1.
    <master/>
    <enable-threads/>
    <uid>101</uid>  #С этим параметром, я слегка не разобрался, ясно что это пользователь от которого работает uwsgi, но вот что там должно быть. 
    <gid>1000</gid> #С этим параметром, я слегка не разобрался, ясно что это группа, но вот что там должно быть. Но все же работает.
    <pidfile>/var/run/uwsgi.pid</pidfile>
</uwsgi>
<uwsgi>
    <socket>/tmp/uwsgi.sock</socket>
    <process>1</process> #Количество процессов. говорят, должно быть как количество ядер сервера, но я не думаю что стоит так делать. Пусть лучше 1.
    <master/>
    <enable-threads/>
    <uid>101</uid>  #С этим параметром, я слегка не разобрался, ясно что это пользователь от которого работает uwsgi, но вот что там должно быть. 
    <gid>1000</gid> #С этим параметром, я слегка не разобрался, ясно что это группа, но вот что там должно быть. Но все же работает.
    <pidfile>/var/run/uwsgi.pid</pidfile>
</uwsgi>

Настроим Nginx

1
2
3
cd /etc/nginx/sites-available/
cp default default.old
touch site_name.conf
cd /etc/nginx/sites-available/
cp default default.old
touch site_name.conf

И запишем туда следующее:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
    listen   80;  #Порт на котором nginx принимает подключение
    server_name www.pixel-hd.ru pixel-hd.ru; #имя домена
    root /var/www/django/pixel/pixel_hd_py; #Работает без этого параметра, но на всякий я его добавил
 
    location / {  # Расположение корня сайта
    uwsgi_pass unix:///tmp/uwsgi.sock;  #Сокет uwsgi
    include uwsgi_params;        #Включаем параметры uwsgi
    uwsgi_param SCRIPT_NAME http://pixel-hd.ru;  #полное доменное имя сайта без конечного / например http://pixel-hd.ru
    uwsgi_param UWSGI_CHDIR /var/www/django/pixel/;  #Корень где хранится Ваш проект (не папка с settings.py, а папка с manage.py)
    uwsgi_param UWSGI_PYHOME /var/www/django; #Верхняя директория всех проектов на Django
    uwsgi_param UWSGI_SCRIPT django_wsgi;  # O_o, эээээээээ……..конфиг uwsgi для каждого сайта. (В каждой папке сайта создается отдельно)
    }
 
    location /media/ { #папка media Вашего Django проекта. Пишем именно так, иначе не будет правильно работать.
        alias /var/www/django/pixel/pixel_hd_py/; #Папка в которой лежит папка media.
        autoindex on;
    }
 
    location /static/ { #папка static Вашего Django проекта. Пишем именно так, иначе не будет правильно работать.
        root /var/www/django/pixel/pixel_hd_py/; #Папка в которой лежит папка static.
        autoindex on;
    }
}
server {
	listen   80;  #Порт на котором nginx принимает подключение
	server_name www.pixel-hd.ru pixel-hd.ru; #имя домена
	root /var/www/django/pixel/pixel_hd_py; #Работает без этого параметра, но на всякий я его добавил

	location / {  # Расположение корня сайта
	uwsgi_pass unix:///tmp/uwsgi.sock;  #Сокет uwsgi
	include uwsgi_params;        #Включаем параметры uwsgi
	uwsgi_param SCRIPT_NAME http://pixel-hd.ru;  #полное доменное имя сайта без конечного / например http://pixel-hd.ru
	uwsgi_param UWSGI_CHDIR /var/www/django/pixel/;  #Корень где хранится Ваш проект (не папка с settings.py, а папка с manage.py)
	uwsgi_param UWSGI_PYHOME /var/www/django; #Верхняя директория всех проектов на Django
	uwsgi_param UWSGI_SCRIPT django_wsgi;  # O_o, эээээээээ……..конфиг uwsgi для каждого сайта. (В каждой папке сайта создается отдельно)
	}

	location /media/ { #папка media Вашего Django проекта. Пишем именно так, иначе не будет правильно работать.
		alias /var/www/django/pixel/pixel_hd_py/; #Папка в которой лежит папка media.
		autoindex on;
	}

	location /static/ { #папка static Вашего Django проекта. Пишем именно так, иначе не будет правильно работать.
		root /var/www/django/pixel/pixel_hd_py/; #Папка в которой лежит папка static.
		autoindex on;
	}
}

Включаем сайт:

1
ln -s /etc/nginx/sites-available/site_name.conf /etc/nginx/sites-enabled/site_name.conf
ln -s /etc/nginx/sites-available/site_name.conf /etc/nginx/sites-enabled/site_name.conf

Настройка MySql сервера

Откроем на редактирование файл /etc/mysql/my.cnf.
В конец секции [client] добавим строку:

1
default-character-set=utf8
default-character-set=utf8

В конец секции [mysqld] добавим строки:

1
2
default-character-set=utf8
collation_server=utf8_unicode_ci
default-character-set=utf8
collation_server=utf8_unicode_ci

Важно!
Может получится так, что с такими настройками mysql не заведется. Используйте character_set_server = utf8 в секции [mysqld] вместо default-character-set=utf8

Проверим:

1
2
mysql -u root -p
mysql> show variables like 'coll%';
mysql -u root -p
mysql> show variables like 'coll%';

Должно быть:

+———————-+——————+
| Variable_name | Value |
+———————-+——————+
| collation_connection | utf8_general_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+———————-+——————+

И еще:

1
mysql> show variables like 'char%';
mysql> show variables like 'char%';

Должно быть:

+—————————+—————————-+
| Variable_name | Value |
+—————————+—————————-+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+—————————+—————————-+

Загружаем проект в Вашу папку в каталоге /var/www/django/PROJECT-X
И в ней создаем файл django_wsgi.py

1
touch django_wsgi.py
touch django_wsgi.py

Записываем туда:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import sys
import site
import os
 
envpath = '/var/www/django/pixel/pixel_hd_py/' #Путь к папке проекта. Именно проекта, папка которая содержит urls.py
 
# we add currently directory to path and change to it
pwd = os.path.dirname(os.path.abspath(__file__))
os.chdir(pwd)
sys.path = [pwd] + sys.path
 
# Append paths
site.addsitedir(envpath)
 
# now start django
from django.core.handlers.wsgi import WSGIHandler
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' #Файл настроек. В случае ошибки, можете посмотреть в чем загвоздка в /var/log/uwsgi.log Если указали так же как у меня при старте uwsgi
application = WSGIHandler()
import sys
import site
import os

envpath = '/var/www/django/pixel/pixel_hd_py/' #Путь к папке проекта. Именно проекта, папка которая содержит urls.py

# we add currently directory to path and change to it
pwd = os.path.dirname(os.path.abspath(__file__))
os.chdir(pwd)
sys.path = [pwd] + sys.path

# Append paths
site.addsitedir(envpath)

# now start django
from django.core.handlers.wsgi import WSGIHandler
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' #Файл настроек. В случае ошибки, можете посмотреть в чем загвоздка в /var/log/uwsgi.log Если указали так же как у меня при старте uwsgi
application = WSGIHandler()

Пробуем запустить все это «счастье»:

1
2
/etc/init.d/nginx restart
/etc/init.d/uwsgi start
/etc/init.d/nginx restart
/etc/init.d/uwsgi start

«Заводим» админку Django
Админка в Django, крайне удобная штука, и ее наличие лично меня очень радует. Так вот, для того что бы завести админку в Django, необходимо сделать сим линк на статические файлы админки в вашу папку static путь к которой указан в настройках nginx. Этот путь в Вашей системе, может быть другим, просто поищите место установки Вашей Django. У меня, команда будет выглядеть так:

1
ln -s /usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/admin/ /var/www/django/pixel/pixel_hd_py/static/admin
ln -s /usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/admin/ /var/www/django/pixel/pixel_hd_py/static/admin

После чего, вся статика админки django успешно подключается.

Все ошибки смотрим в /var/log/uwsgi.log
Не забудьте заменить ALLOWED_HOSTS = [] на ALLOWED_HOSTS = ['*'] в settings.py Вашего проекта при переключении DEBUG = false, иначе будете получать Ошибку 500 при обращении к любой странице Вашего Django проекта. !Обратите внимание, на конечном хостинге ALLOWED_HOSTS не деолжен быть ['*']
Не забудьте прописать путь к шаблонам в вашем settings django проекта.
Не забудьте создать базу данных Вашего проекта.
Не забудьте выполнить python manage.py validate / syncdb
По идее на этом все. Все это проделано на Ubuntu 10.04-11.04 — (Ubuntu 12.04-12.04.2)

Понравилась статья? Расскажи друзьям:


Комментариев (1)

не работает нехрена

Обсудить