Закрыть

Для эффективной работы на сайте используются cookie и обработка персональных данных. Пользуясь этим сайтом, вы соглашаетесь с правилами использования сайта. Подробнее

Цитата дня

Vivazzi.ru

Личный сайт Мальцева Артема

Если человек стремится к чему-то всем своим сердцем, он обязательно сумеет добиться того, чего хочет, даже если это кажется невозможным, даже если все окружающие открыто заявляют ему, что это невозможно.

Чак Норрис

3. Настройка DNS, конфигураций для связки uwsgi, nginx и supervisor. Запуск проекта

Цикл статей по развёртыванию сайтов на боевом сервере с нуля по шагам с использованием python + django + uwsgi + nginx + supervisor:

Итак, на предыдущем шаге мы подали заявку на регистрацию доменного имени, и пока идёт обработка запроса, переходим к третьему шагу. Мы научимся запускать простейшее python приложение, а затем попробуем запустить и django приложение.

Сейчас произведём первоначальную настройку Linux, а также установку необходимых библиотек для запуска python приложений. Для этого подключаемся к серверу через putty/терминал (как подключаться описано в шаге 1).

Если Вам интересно знать сколько свободного места на диске на начальный момент, т. е. до всех наших будущих настроек и закачек библиотек, то можете воспользоваться командой df или df -h, которая выводит информацию в более удобной форме.

У меня, например, выглядит так:

Потом сможем посмотреть сколько останется места после того, как мы всё настроим!

Первое что нам нужно сделать - это удалить всё ненужное из системы. Команда ps нам в помощь, она покажет количество запущенных процессов.

ps aux

Если видим что запущен apache, то его удаляем (вместо него мы используем nginx).


sudo apt-get purge apache2 apache2-utils apache2.2-bin apache2-common
sudo apt-get autoremove
whereis apache2
sudo rm -Rf /etc/apache

apt-get install пакет - установка пакета.

apt-get remove пакет - удаление пакета.

apt-get purge пакет - удаление пакета с конфигурационными файлами.

apt-get autoremove - удаление всех ненужных пакетов, которые не используются в системе.

apt-get update - обновление кэша доступных пакетов

apt-get upgrade - обновление всех пакетов.

apt-get clean - удаляет скаченные пакеты, которые сохраняются автоматически в директории /var/cache/apt/archives/

Сначала установим локаль системы:

root@viva-itstudio:~# dpkg-reconfigure locales

Находим в списке ru_RU.UTF-8 помечаем звёздочкой, нажав пробел, затем нажимаем enter.

И снова выбираем ru_RU.UTF-8

Далее нам нужно установить всякие приложения. Перед работой с менеджером установки приложений необходимо обновить информацию о доступных в дистрибутиве пакетах. Обновляем кеш менеджера пакетов apt:

apt-get update

И видим как загружаются пакеты. На это уходит несколько минут - можно за это время сходить за печенюшкой (предполагается, что чай/кофе уже налито с прошлого поста) :)

Ставим mc и nano:

apt-get install mc nano

mc (midnight commander) - визуальный файловый менеджер.

nano - простой, но распространённый текстовый редактор.

Теперь нам нужно настроить DNS-сервер. Для этого устанавливаем bind

apt-get install bind9

BIND (Berkeley Internet Name Domain, до этого: Berkeley Internet Name Daemon) — открытая и наиболее распространённая реализация DNS-сервера, обеспечивающая выполнение преобразования DNS-имени в IP-адрес и наоборот.

Иногда пакет bind уже установлен в системе изначально. Настраиваем DNS конфиг:

nano /etc/bind/named.conf

В конце файла после всех инклюдов (include) вписываем следующее:

zone "viva-itstudio.ru" {
        type master;
        file "/etc/bind/viva-itstudio.ru";
};

где вместо моего адреса viva-itstudio.ru нужно указать свой.

Вставляем в следующий текст файл /etc/bind/viva-itstudio.ru:

nano /etc/bind/viva-itstudio.ru
# содержимое файла viva-itstudio.ru
$TTL 3600
@  IN     SOA     ns1.viva-itstudio.ru. root.viva-itstudio.ru. (2012000001 10800 3600 604800 86400)

@  IN     NS      ns1
@  IN     NS      ns2

ns1    IN    A    188.120.250.15
ns2    IN    A    188.120.253.50

@      IN    A    188.120.250.15
www    IN    A    188.120.250.15

Если Вы в первый раз сталкиваетесь с настройкой bind, то для Вас текст выше будет загадочен и непонятен. Но не переживайте. Сейчас просто скопируйте текст и вставьте в созданный файл, изменяя доменное имя и свои ip-адреса. У вас вместо ns1.viva-itstudio.ru. будет ns1.ваш_сайт.ru. и обратите внимание, что обязательна точка на конце и т.д. С ip-адресами будет следующим образом:

# вместо
ns1    IN    A    188.120.250.15
ns2    IN    A    188.120.253.50

@      IN    A    188.120.250.15
www    IN    A    188.120.250.15
# будет
ns1    IN    A    ваш_ip-адрес_1
ns2    IN    A    ваш_ip-адрес_2

@      IN    A    ваш_ip-адрес_1
www    IN    A    ваш_ip-адрес_1

Запускаем службу bind и перечитываем конфигурацию DNS-сервера:

root@viva-itstudio:~# /etc/init.d/bind9 start
[ ok ] Starting domain name service...: bind9.
root@viva-itstudio:~# rndc reload
server reload successful

Ставим службу bind на автозапуск:

update-rc.d bind9 start 15 2 3 4 5 .  stop 70 0 1 6 .
Если после запуска команды update-rc.d система выдала сообщение: update-rc.d: using dependency based boot sequencing То не волнуйтесь, это не ошибка. Это информационное сообщение означает примерно следующее: It's telling you it's using new dependency based booting instead of old sequence-based booting. Я как ни старался, не смог нормально перевести его :)

Теперь нам нужно проверить работоспособность DNS-сервера, установив dnsutils пакеты:


root@viva-itstudio:~# apt-get install dnsutils
Чтение списков пакетов… 
...
Настраивается пакет dnsutils (1:9.8.4.dfsg.P1-6+nmu2+deb7u1) …

root@viva-itstudio:~# dig @188.120.250.15 viva-itstudio.ru

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @188.120.250.15 viva-itstudio.ru
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11642
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:
;viva-itstudio.ru.              IN      A

;; ANSWER SECTION:
viva-itstudio.ru.       3600    IN      A       188.120.250.15

;; AUTHORITY SECTION:
viva-itstudio.ru.       3600    IN      NS      ns2.viva-itstudio.ru.
viva-itstudio.ru.       3600    IN      NS      ns1.viva-itstudio.ru.

;; ADDITIONAL SECTION:
ns1.viva-itstudio.ru.   3600    IN      A       188.120.250.15
ns2.viva-itstudio.ru.   3600    IN      A       188.120.253.50

;; Query time: 0 msec
;; SERVER: 188.120.250.15#53(188.120.250.15)
;; WHEN: Wed Feb  5 00:52:44 2014
;; MSG SIZE  rcvd: 118

Отлично, ответ вызова команды dig говорит о том, что был найден один сервер (1 server found), и сообщаются dns записи.

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

mkdir - создаёт папку в указанном месте. А ключ -p нужен создания несуществующих папок в указанном пути. Имя пользователя нужно придумать.
root@viva-itstudio:/home# mkdir -p /home/<пользователь>/web/test_app
# root@viva-itstudio:/home# mkdir -p /home/vivazzi/web/test_app

Можете зайти в mc и убедиться, что папки созданы:

root@viva-itstudio:/home# mc Для запуска приложений на python используем связку python + Django + nginx + uWSGI + supervisor

python - язык программирования высокого уровня, на котором будет написан ваш сайт.

Django - фреймворк для построения веб-приложений на языке python.

nginx - это веб-сервер, который нужен для отдачи статических файлов (картинок, css стилей, js скриптов и т.д.) и проксирования запросов к uWSGI.

uWSGI - делает запросы к python приложению и получает от него ответы. Взаимодействие между приложением и веб-сервером происходит по протоколу WSGI.

supervisor - система по управлению процессами в операционной системе.

Создаём wsgi.py - первый тестовый проект на python:


root@viva-itstudio:/home/vivazzi/web/test_app# nano wsgi.py

# --- Содержимое файла wsgi.py ---
def application(environ, start_response):
    status = '200 OK'
    output = 'Hey, this is my project!'

    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
    return [output]

Создаём файл uwsgi.ini


root@viva-itstudio:/home/vivazzi/web/test_app# nano uwsgi.ini

# --- Содержимое файла uwsgi.ini ---
[uwsgi]
# Сокет для передачи данных
socket = /home/vivazzi/web/test_app/uwsgi.sock

# Путь к виртуальному окружению (пока его не используем)
# home = /home/vivazzi/web/test_app/env

# Нам понадобится включенный python плагин
plugins = python

# Дополнительный python-путь (путь до корня проекта)
pythonpath = /home/vivazzi/web/test_app

# Модуль python с определением wsgi приложения
module = wsgi

# Количество процессов
processes = 2

# Максимальное количество соединений для каждого процесса
max-requests = 5000

# Максимальный размер запроса
buffer-size = 32768

# Убивать каждое соединение требующее больше 30 сек для обработки
harakiri = 30

# Включает опцию мастер-процесса uwsgi
master

# Автоматически прибивать воркеры, если умирает мастер-процесс
no-orphans

# Количество секунд, которое дается воркеру uwsgi для корректного перезапуска.
# Если воркер не успевает - по истечении этого времени его принудительно пришибает
reload-mercy = 8

Создаём файл supervisor.conf


root@viva-itstudio:/home/vivazzi/web/test_app# nano supervisor.conf

# --- Содержимое файла supervisor.conf ---
[program:test_app]
command=/usr/bin/uwsgi --ini /home/vivazzi/web/test_app/uwsgi.ini
user=www-data
stdout_logfile=/home/vivazzi/web/test_app/uwsgi.log
stderr_logfile=/home/vivazzi/web/test_app/uwsgi_err.log
directory=/home/vivazzi/web/test_app
autostart=true
autorestart=true
redirect_stderr=true
stopsignal=QUIT

Создаём файл nginx.conf


root@viva-itstudio:/home/vivazzi/web/test_app# nano nginx.conf

# --- Содержимое файла nginx.conf ---
server {

    listen      80;
    server_name viva-itstudio.ru www.viva-itstudio.ru;
    access_log  /home/vivazzi/web/test_app/nginx_access.log;
    error_log   /home/vivazzi/web/test_app/nginx_error.log;

    location / {
        uwsgi_pass  unix:///home/vivazzi/web/test_app/uwsgi.sock;
        include     uwsgi_params;
    }
}

Самое время установить нужные библиотеки:


root@viva-itstudio:/home/vivazzi/web/test_app# apt-get install nginx uwsgi uwsgi-plugin-python supervisor

Создадим симлинки (ссылки) на конфигурационные файлы:


# nginx
ln -s /home/vivazzi/web/test_app/nginx.conf /etc/nginx/sites-enabled/test_app.conf

# supervisor
ln -s /home/vivazzi/web/test_app/supervisor.conf /etc/supervisor/conf.d/test_app.conf

Для того, чтобы смогли логи писаться (и не только), нужно дать права некоторым пользователям на чтение и изменение папки. Но сейчас мы сделаем проще, а потом будем разбираться детальнее. Установим всем пользователям права на запись на папку test_app:


chmod a+w -R /home/vivazzi/web/test_app

Теперь перезапустим nginx и supervisor:


/etc/init.d/nginx restart
/etc/init.d/supervisor stop
/etc/init.d/supervisor start

После установки supervisor, он сам запускается, поэтому нам нужно только перечитать конфигурационные файлы supervisor без его перезапуска.


supervisorctl update

Если всё настроено правильно, то в результате мы должны получить «Hey, this is my project!»

Если у Вас возникает следующего рода ошибка:


Restarting nginx: nginx: [emerg] unknown directive "uwsgi_pass" in /etc/nginx/sites-enabled/test_app.conf:18

То исправить ситуацию может установка nginx из исходных файлов. Для этого выполним следующие действия:

Удалим установленный nginx


apt-get purge nginx
apt-get autoremove
whereis nginx
rm -Rf /etc/nginx

Командой rm удалите все файлы и папки, которые нашлись командой whereis.

Теперь создадим временную директорию /usr/src/nginx, в которую скачаем последнюю версию nginx.


mkdir -p /usr/src/nginx
cd /usr/src/nginx
wget http://nginx.org/download/nginx-1.8.0.tar.gz
tar -xvf nginx-1.8.0.tar.gz  # распакуем архив
rm nginx-1.8.0.tar.gz  # удаляем архив
cd nginx-1.8.0

Затем сконфигурируем nginx. Пока запишите опции те, что я здесь привожу, чтобы не отклоняться от рецепта, а потом можете поподробнее почитать, например, здесь: http://nginx.org/ru/docs/configure.html или в других источниках.


./configure --pid-path=/var/run/nginx.pid \
--conf-path=/etc/nginx/nginx.conf \
--sbin-path=/usr/local/sbin \
--user=www-data \
--group=www-data \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log \
--with-http_stub_status_module \
--with-ipv6 \
--with-http_ssl_module \
--with-http_realip_module \
--with-sha1-asm \
--with-sha1=/usr/lib \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--with-http_geoip_module \
--with-http_gzip_static_module \
--with-http_sub_module \
--with-http_addition_module \
--with-file-aio \
--without-mail_smtp_module

Скорее всего, конфигурирование не осуществиться, и покажется ошибка об отсутствии библиотек. Тогда нужно поставить следующий список пакетов:


apt-get install libpcre3 libpcre3-dev openssl libssl-dev  libgeoip-dev libgeoip1

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


make
make install

Создаём папку, куда nginx будет писать временные файлы.


mkdir /var/tmp/nginx

И даём соответственные права пользователя www-data:


chown www-data /var/tmp/nginx

Поздравляю с установкой nginx. Теперь его нужно запустить. Исполняемый файл лежит в /usr/local/sbin (месторасположение определили опцией --sbin-path при конфигурировании nginx):

/usr/local/sbin/nginx

Теперь можно убедиться, что nginx запущен:


ps aux | grep nginx
root      1695  0.0  0.2  33104  1068 ?        Ss   00:14   0:00 nginx: master process ./nginx
www-data  1696  0.0  0.3  33512  1992 ?        S    00:14   0:00 nginx: worker process

Теперь добавим nginx на автозагрузку.

sudo nano /etc/init.d/local  # создаём файл в /etc/init.d/

Добавляем в скрипт:

#! /bin/sh
/usr/local/sbin/nginx

Далее выполняем следующие команды

sudo chmod +x /etc/init.d/local  # делаем файл исполняемым
sudo update-rc.d local defaults 80  # добавляем скрипт /etc/init.d/local в автозагрузку

Этого достаточно, чтобы запускать nginx автоматически при загрузки системы. Если Вы хотите ещё какие-нибудь скрипты запускать, то допишите команды (каждая с новой строки) в файл /etc/init.d/local.

Теперь можно проверить работоспособность сайта.

Как видите, настройка сайта django nginx uwsgi не является простым занятием, но научившись этому, Вы будете сделаете большой шаг на пути к профессиональному развитию

Оцените статью

0 из 5 (всего 0 оценок)

Поля, отмеченные звёздочкой ( * ) , являются обязательными.

Спасибо за ваш отзыв!

Автор статьи

Права на использование данной статьи, расположенной на настоящей странице http://vivazzi.ru/deploy-django-site/dns-uwsgi-nginx-supervisor-configs/:

Разрешается копировать статью с указанием её автора и ссылки на оригинал без использования параметра rel="nofollow" в теге <a>. Использование:

Автор статьи: Мальцев Артём
Ссылка на статью: <a href="http://vivazzi.ru/deploy-django-site/dns-uwsgi-nginx-supervisor-configs/">http://vivazzi.ru/deploy-django-site/dns-uwsgi-nginx-supervisor-configs/</a>

Подробнее: Правила использования сайта

Вам нужно саморазвиваться или вы хотите зарабатывать деньги?

Или вы ищите хорошие IT сервисы или книги? Сохраните свое время и взгляните на мою подборку рекомендаций, которыми постоянно пользуюсь.
Посмотреть рекомендации

Комментариев: 4

Александр Б.
Александр Б.

05.02.2018 12:26 #

uwsgi.ini

Дополнительный python-путь

pythonpath = /home/vivazzi/web/test_app

имеется ввиду путь до компилятора? название переменной мне навеивает эту мысль))

Ответить

Артём Мальцев
Артём Мальцев автор

05.02.2018 20:48 #

Александр, pythonpath - путь до корня проекта. Статью подправил.
Хотя да, можно подумать, что до компилятора :)

Ответить

Александр Б.
Александр Б.

05.02.2018 12:54 #

Добавляем в скрипт:

! /bin/sh

/usr/local/sbin/nginx

можно ли использовать вместо "/usr/local/sbin/nginx", "service nginx start" в скрипте?

Ответить

Артём Мальцев
Артём Мальцев автор

05.02.2018 20:43 #

С ходу не могу сказать, попробуйте: протестировать это не долго.

Ответить

Вы можете оставить комментарий как незарегистрированный пользователь. Но, зарегистрировавшись, вы сможете получать оповещения об ответах, а также иметь доступ к своему личному аккаунту для просмотра своих комментариев.

Чтобы оставить комментарий от своего имени войдите или зарегистрируйтесь обычным способом или через социальные сети:

Отправить

На данный момент нет специального поиска, поэтому я предлагаю воспользоваться обычной поисковой системой, например, Google, добавив "vivazzi" после своего запроса.

Попробуйте