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 записи.

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

root@viva-itstudio:/home# mkdir -p /home/<пользователь>/web/test_app
# root@viva-itstudio:/home# mkdir -p /home/vivazzi/web/test_app

mkdir - создаёт папку в указанном месте. А ключ -p нужен создания несуществующих папок в указанном пути. Имя пользователя нужно придумать.

Можете зайти в 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, но скорее всего, конфигурирование не осуществится и покажется ошибка об отсутствии библиотек. Поставим следующий список пакетов:

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

Затем сконфигурируем 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

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

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 на автозагрузку.

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

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

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

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

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

Если у вас появляется сообщение:

insserv: warning: script 'local' missing LSB tags and overrides

То это не ошибка, а предупреждающее сообщение, которое сообщает о том, что формат записи не соответствует LSB спецификации (Подробнее: https://ru.stackoverflow.com/questions/612736/%D0%9E%D1%88%D0%B8%D0%B1%D0%BA%D0%B0-debian-8-6-insserv-warning).

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

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

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

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

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

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

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

После нажатия кнопки "Отправить" ваше сообщение будет доставлено мне на почту.

Автор статьи

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

Веб-разработчик, владеющий знаниями языка программирования Python, фреймворка Django, системы управления содержимым сайта Django CMS, платформы для создания интернет-магазина Django Shop и многих различных приложений, использующих эти технологии.

Права на использование материала, расположенного на этой странице https://vivazzi.pro/ru/deploy-django-site/dns-uwsgi-nginx-supervisor-configs/:

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

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

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

Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.

Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.

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

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

05.02.2018 17:26 #

uwsgi.in i

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

pythonpath = /home/vivazzi/web/test_ap p

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

Ответить

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

06.02.2018 1:48 #

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

Ответить

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

05.02.2018 17:54 #

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

! /bin/s h

/usr/local/sbin/ngin x

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

Ответить

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

06.02.2018 1:43 #

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

Ответить

Вы можете оставить комментарий как незарегистрированный пользователь.

Но зарегистрировавшись, вы сможете:

  • получать оповещения об ответах
  • просматривать свои комментарии
  • иметь возможность использовать все функции разработанных сервисов

Для комментирования от своего имени войдите или зарегистрируйтесь на сайте Vuspace

Отправить

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

Попробуйте

Выберите валюту для отображения денежных единиц