Руководство По Flask Mega, Часть 17. Развертывание В Linux (И Даже В Raspberry Pi!)

Это семнадцатая статья в серии, в которой я описываю свой опыт написания веб-приложения на Питон использование микрофреймворка Колба .

Целью этого урока является разработка достаточно функционального приложения для микроблогов, которое из-за полного отсутствия оригинальности я решил назвать микроблогом.

Оглавление Часть 1: Привет, мир! Часть 2: Шаблоны Часть 3: Формы Часть 4: База данных Часть 5: Вход пользователя Часть 6: Страница профиля и аватары Часть 7. Модульное тестирование Часть 8: Последователи, контакты и друзья Часть 9: Нумерация страниц Часть 10. Полнотекстовый поиск Часть 11. Поддержка по электронной почте Часть 12: Реконструкция Часть 13: Дата и время Часть 14: I18n и L10n Часть 15: Аякс Часть 16. Отладка, тестирование и профилирование Часть 17. Развертывание в Linux (и даже в Raspberry Pi!) (эта статья) Часть 18. Развертывание в облаке Heroku Сегодня знаменательное событие в жизни нашего приложения.

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

В этой статье я исследую традиционные способы размещения приложений в Интернете, в связи с чем остановлюсь на использовании серверов Linux, а также очень популярного миникомпьютера Raspberry Pi. Облачные сервисы мы рассмотрим в следующей статье.

Для начала мы рассмотрим, наверное, самый распространённый тип хостинга.

Мы установим наше приложение на выделенный хост с веб-сервером.

Где мы можем найти хостинг? Сегодня существует множество предложений недорогого хостинга.

Самый дешевый вариант — использовать VPS (виртуальный частный сервер) — виртуальную машину, которая выглядит для нас как выделенный сервер, но на самом деле разделяет физические ресурсы с другими пользователями хостинга.

Вы можете ознакомиться с предложениями на lowendbox.com , если вы хотите арендовать VPS для экспериментов (обратите внимание, ссылка не является реферальной, а значит я не получу ни цента с вашего перехода по ссылке).

Еще один простой способ заставить хост установить наше приложение — это установить виртуальную машину на свой домашний компьютер.

Если вы являетесь пользователем Windows или Mac и хотите получить опыт развертывания приложения на сервере под управлением Linux, не тратя ни копейки, то это ваш вариант. Установить ВиртуалБокс , скачайте ISO-образ выбранного вами дистрибутива Linux, создайте виртуальную машину (ВМ) и установите на нее ОС, используя ранее скачанный образ.

Поговорим немного о выборе ОС.

Я считаю, что в качестве платформы для размещения веб-сервера следует рассматривать следующие 4 операционные системы:

  • Линукс
  • БСД
  • ОС Х
  • Окна
Технически говоря, вы можете использовать любую из этих ОС для размещения вашего приложения Python, так как же вам выбрать? На мой взгляд, выбор сделать совсем не сложно.

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

Кроме того, нам бы хотелось иметь доступ к большому количеству программного обеспечения для установки, потому что если возникнут проблемы, в этом случае у нас будет больше шансов их решить.

Исходя из описанных выше критериев, я бы предпочел использовать сервер под управлением Linux или BSD, а не сервер под управлением Windows и OS X. Таким образом количество вариантов сократилось до двух.

Но выбор между Linux и BSD, как по мне, совершенно элементарен: нет разницы, что использовать.

Оба являются отличными вариантами для размещения веб-сервера.

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

Кроме того, существуют различные дистрибутивы Linux и BSD, как выбрать между ними? В основном это вопрос личных предпочтений, но если мы хотим использовать самый популярный дистрибутив, мы можем разбить все дистрибутивы на группы по их основным характеристикам, а затем выбрать самый популярный из выбранной группы:

  • построен на базе RPM (RedHat, CentOS, Fedora)
  • построен на Debian (Debian, Ubuntu, Mint)
  • построен на базе BSD (FreeBSD, NetBSD, OpenBSD)
  • другой
Конечно, моя очень упрощенная классификация распределений оставила некоторые распределения без внимания.

Я также уверен, что многие люди посчитают своим долгом напомнить вам, что Mac OS X также принадлежит к семейству BSD и ее следует добавить в мой список.

Помните, это моя собственная классификация, и я не ожидаю, что все с ней согласятся.

В качестве упражнения при подготовке этой статьи я протестировал несколько дистрибутивов Linux (дело в том, что на моем VPS нет возможности установки BSD).

Я пробовал Fedora, Ubuntu, Debian и CentOS. Ни один из этих дистрибутивов не был простым в установке, но из всех них установка и настройка CentOS прошла наиболее гладко, поэтому далее идет CentOS. Если вы никогда раньше не выполняли первоначальную настройку сервера, это может показаться вам довольно утомительным.

И вы будете правы.

Однако после настройки сервера поддержание его функциональности требует минимум усилий.

Готовый? Тогда начнем!

Хостинг на CentOS 6

Я предполагаю, что у нас есть новая установка CentOS 6 на выделенном сервере или VPS. Виртуальная машина на вашем ПК также будет работать, но прежде чем продолжить, установите ОС.



Настройка на стороне клиента
Мы будем управлять сервером удаленно с домашнего компьютера, поэтому нам нужен инструмент для входа в систему и запуска команд. Если ваш компьютер работает под управлением Linux или OS X, то у вас уже есть ОпенСШ .

Если вы пользователь ОС Microsoft, то у вас есть выбор из двух вариантов:

Cygwin — это нечто большее, чем просто SSH, он обеспечивает среду, подобную Linux, внутри Windows. С другой стороны, Putty — это просто SSH-клиент. Поскольку я планирую охватить самые основы, приведенные ниже инструкции предназначены для пользователей Linux, OS X и Cygwin. Если вы решите использовать Putty с Windows, то может потребоваться некоторая адаптация приведенных ниже инструкций.

Давайте начнем со входа на наш новый сервер CentOS 6. Откройте командную строку на своем ПК (или консоль Cygwin, если вы используете Windows) и выполните команду:

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
   

$ ssh root@<your-server>

Эта команда означает, что вы хотите войти на сервер под учетной записью пользователя root, системного администратора.

Вам следует заменить с IP-адресом или именем вашего сервера.

Обратите внимание, что не следует вводить символ $, это всего лишь приглашение командной строки.

Далее вам будет предложено ввести пароль пользователя root. Если это выделенный сервер или VPS, то пароль вы ввели в процессе установки.

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



Установка пакетов программного обеспечения
Теперь, когда мы вошли в систему, нам нужно установить все необходимое программное обеспечение, которое, скорее всего, будет включать Python и веб-сервер.

Кроме того, мы заменим sqlite на более надежную СУБД — MySQL. Команда, используемая для установки программного обеспечения в CentOS, называется yum. Мы можем установить все необходимые пакеты одной командой: $ yum install python python-devel httpd httpd-devel mysql-server mysql-devel git gcc sudo Некоторые пакеты могут уже быть установлены, и в этом случае yum пропустит их и установит только недостающие пакеты.

Мы только что установили следующие пакеты:

  • python и python-devel: интерпретатор Python и его инструменты разработчика (заголовочные файлы и статические библиотеки)
  • httpd и httpd-devel: веб-сервер Apache и его инструменты разработчика
  • mysql-server и mysql-devel: сервер СУБД MySQL и инструменты его разработки.

  • git: распределенная система управления версиями файлов (мы будем использовать ее для загрузки и обновления приложения)
  • gcc: компилятор C/C++ (необходим для компиляции расширений Python)
  • sudo: инструмент для запуска команд от имени другого пользователя.



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

Если причины этого не ясны, поясню - у пользователя root максимальные права, в т.ч.

мы можем легко удалить или повредить важные компоненты системы в результате ошибки.

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

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

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

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

Если вы не знакомы с системой прав пользователей Unix, краткое руководство можно найти в Википедия .

Команда для создания пользователя приложения в CentOS выглядит следующим образом:

$ adduser -g apache apps

Переключатель -g делает основную группу созданного пользователя группой Apache, которая в CentOS является группой пользователей Apache. Далее вам будет предложено ввести пароль для создаваемого пользователя.

Команда adduser создаст домашнюю папку для новой учетной записи, расположенную по адресу /home/apps. Однако если мы проверим права доступа к этой папке, то обнаружим, что она доступна только ее владельцу:

$ ls /home -l total 7 drwx------ 2 apps apache 4096 Apr 7 11:46 apps

Мы решили, что к этой папке должны иметь доступ пользователи группы apache, поэтому дадим им максимальные права:

$ chmod 775 /home/apps

Для получения более подробной информации обратитесь к документации по команде chmod. Разрешение 775 предоставляет полный доступ к папке владельцу и членам его группы, а всем остальным дает все права, кроме прав на запись.



Войти без пароля
Следующий шаг — разрешить этой учетной записи входить в систему с домашнего компьютера без использования пароля.

SSH поддерживает другой метод аутентификации: открытый ключ .

Если вы используете операционную систему, отличную от Windows, то весьма вероятно, что в вашей системе уже установлены ключи.

Теперь откройте терминал на своем ПК (пользователи Windows — консоль Bash Cygwin).

Чтобы проверить наличие ключей, выполните следующую команду:

$ ls ~/.

ssh id_rsa id_rsa.pub

Если в папке есть файлы id_rsa и id_rsa.pub, как показано выше, вы можете двигаться дальше.

Если этих файлов нет, то выполните следующую команду:

$ keygen -t rsa

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

Если вы хотите сделать что-то другое и уверены в том, что делаете, сделайте это.

После выполнения этой команды у вас появятся файлы, перечисленные выше.

Файл id_rsa.pub — это ваш открытый ключ, которым вы можете свободно делиться с другими пользователями, не подвергаясь угрозе безопасности.

Файл id_rsa — это ваш личный ключ, которым вы никогда не должны никому делиться.

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

В терминале нашего ПК мы отобразим содержимое открытого ключа:

$ cat ~/.

ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCjwaK4JVuY6PZAr8HocCIOszrLIzzCjO0Xlt9zkFNKvVpP1B92u3JvwwiagqR+k0kHih2SmYnycmXjAcE60tvu+sIDA/7tEJZh4kO4nUYM5PJ17E+qTqUleBXQM74eITydq/USkOqc5p++qUUgA60gUUuNum3igbZiNi71zK4m8g/IDywWYk+5vzNt2i7Sm8NEuauy/xWgnWhCBXZ/tXfkgWgC/4HzpmsfO+nniNh8VgTZp8Q+y+4psSE+p14qUg7KdDbf0Wo/D35wDkMvto96bIT8RF0np9dTkFj8TgNW8inP+6MC+4vCd8F/NpESCVt8hRlBVERMF8Xv4f/0+7WT miguel@miguelspc

Теперь мы должны скопировать эти данные в буфер обмена, а затем переключиться на CentOS, где запускаем следующую команду:

$ mkdir /home/apps/.

ssh $ echo <paste-your-key-here> > /home/apps/.

ssh/authorized_keys

Для моей комбинации сервера и открытого ключа требуются следующие команды:

$ mkdir /home/apps/.

ssh $ echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCjwaK4JVuY6PZAr8HocCIOszrLIzzCjO0Xlt9zkFNKvVpP1B92u3JvwwiagqR+k0kHih2SmYnycmXjAcE60tvu+sIDA/7tEJZh4kO4nUYM5PJ17E+qTqUleBXQM74eITydq/USkOqc5p++qUUgA60gUUuNum3igbZiNi71zK4m8g/IDywWYk+5vzNt2i7Sm8NEuauy/xWgnWhCBXZ/tXfkgWgC/4HzpmsfO+nniNh8VgTZp8Q+y+4psSE+p14qUg7KdDbf0Wo/D35wDkMvto96bIT8RF0np9dTkFj8TgNW8inP+6MC+4vCd8F/NpESCVt8hRlBVERMF8Xv4f/0+7WT miguel@miguelspc > /home/apps/.

ssh/authorized_keys

В результате выполнения этих команд ваш публичный ключ будет записан в файлauthorized_keys на сервере.

Таким образом, мы сделали наш открытый ключ известным OpenSSH на сервере.

Следующая задача — защитить папку .

ssh и файл авторизованных_ключей внутри нее:

$ chown -R apps:apache /home/apps/.

ssh $ chmod 700 /home/apps/.

ssh $ chmod 600 /home/apps/.

ssh/authorized_keys

Эти команды изменят владельца этих файлов на учетную запись приложения, а затем сделают папку и файл доступными только новому владельцу.

Вход без пароля уже должен работать.

Теперь мы выйдем из корневой учетной записи нашего сервера и снова войдем на сервер, но под учетной записью пользователя приложения:

$ ssh apps@<your-server>

Если все прошло гладко, вам не придется вводить пароль для получения доступа.



Установка приложения
Теперь мы используем git для загрузки и установки микроблога на сервер.

Если вы не знакомы с git, рекомендую прочитать руководство.

git для начинающих .

Приложение должно находиться на git-сервере, доступном с нашего сервера.

Я буду использовать свой репозиторий GitHub. Вы также можете использовать его или, если хотите, клонировать репозиторий и сделать его своим собственным.

Чтобы установить микроблог на наш сервер, нам понадобится всего лишь команда git clone:

$ git clone git://github.com/miguelgrinberg/microblog.git $ cd microblog

Последняя версия приложения содержит некоторые изменения по сравнению с тем, что мы видели в конце предыдущей статьи.

Во-первых, на верхнем уровне появилось несколько новых файлов — runp-sqlite.fcgi, runp-mysql.fcgi и killpython. Файлы *.

fcgi — это сценарии запуска, используемые веб-серверами, работающими с FastCGI протокол.

Скрипт killpython перезапустит приложение после обновлений.

Мы рассмотрим все это позже.

Еще одно заметное изменение произошло в файле config.py. До сих пор мы инициализировали нашу базу данных следующим образом:

SQLALCHEMY_DATABASE_URI = ' sqlite:/// ' + os.path.join(basedir, 'app.db')

Теперь мы сделаем это так:

if os.environ.get('DATABASE_URL') is None: SQLALCHEMY_DATABASE_URI = ' sqlite:/// ' + os.path.join(basedir, 'app.db') else: SQLALCHEMY_DATABASE_URI = os.environ['DATABASE_URL']

Это простое изменение позволит нам изменить базу данных приложения, просто установив переменную среды.

В следующем разделе вы увидите, как это можно использовать.

Еще одно изменение было внесено в файл setup.py, который использовался для настройки виртуальной среды.

Теперь этот скрипт также устанавливает пакет mysql-python, который необходим SQLAlchemy для работы с СУБД MySQL. Кроме того, пакет Flask-WhooshAlchemy теперь устанавливается из моего собственного форка, так как мне не удалось связаться с автором оригинального пакета и согласиться на включение моих исправлений в основной дистрибутив.



Настройка MySQL
База данных sqlite, которую мы использовали все это время, отлично подходит для простых приложений, но когда мы перейдем на полноценный сервер, способный обслуживать несколько одновременных запросов, лучше будет использовать более надежную СУБД.

Поэтому настроим MySQL для нашего микроблога.

Мы уже установили MySQL, поэтому все, что нам нужно сделать, это создать базу данных и пользователя с правами на эту базу данных.

Для управления сервером базы данных мы используем консоль MySQL:

$ mysql -u root -p Enter password: (enter the mysql root password, or empty if one is not defined) Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 11 Server version: 5.1.67 Source distribution Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>

И теперь в командной строке mysql создадим базу данных приложений и пользователя с таким же именем:

mysql> create database apps character set utf8 collate utf8_bin; mysql> create user 'apps'@'localhost' identified by 'apps'; mysql> grant all privileges on apps.* to 'apps'@'localhost'; mysql> flush privileges; mysql> quit;

Обратите внимание, что вы должны указать пароль пользователя приложения в разделе «Идентифицировано».

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

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



Инициализация приложения
Теперь, когда база данных готова, мы можем инициализировать наш микроблог.

Сначала давайте создадим виртуальную среду:

$ .

/setup.py

Затем создаем базу данных:

$ DATABASE_URL= mysql://apps:apps@localhost/apps .

/db_create.py

Обратите внимание, как мы устанавливаем переменную среды DATABASE_URL. Теперь приложение будет использовать базу данных MySQL вместо sqlite. Далее компилируем все сообщения в нашу базу переводов:

$ .

/tr_compile.py

И наконец, даем группе права на запись в две папки, которые должны быть доступны веб-серверу:

$ chmod -R g+w search.db tmp

Папка search.db используется нашей базой данных полнотекстового поиска Whoosh. Папка tmp должна быть доступна для записи, о чем позже станет ясно.



Настройка Apache
Последнее, что вам нужно сделать, это настроить веб-сервер Apache. Мы будем использовать модуль mod_fcigd для обработки диалога FastCGI с нашим приложением.

Многие дистрибутивы предлагают готовые пакеты для поддержки mod_fcgid, но, к сожалению, CentOS не входит в их число, поэтому мы просто соберем этот модуль из исходников.

Вот список команд, которые соберут и установят текущую версию mod_fcgid:

$ wget http://mirror.metrocast.net/apache//httpd/mod_fcgid/mod_fcgid-2.3.7.tar.gz $ tar xvzf mod_fcgid-2.3.7.tar.gz $ cd mod_fcgid-2.3.7 $ APXS=/usr/sbin/apxs .

/configure.apxs $ su (enter root password) $ make install

Вы можете проверить документацию mod_fcgid, если вас интересуют подробности команд, представленных выше.

Установив этот модуль, приступаем непосредственно к настройке нашего сервера.

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

вам придется разобраться с этим вопросом самостоятельно.

Например, в CentOS файл конфигурации находится по адресу /etc/httpd/conf/httpd.conf. Здесь мы просто добавим определение нашего сервера.

В конце файла добавьте следующие строки (делайте это от имени администратора root, поскольку обычным пользователям этот файл недоступен для записи):

FcgidIPCDir /tmp AddHandler fcgid-script .

fcgi <VirtualHost *:80> DocumentRoot /home/apps/microblog/app/static Alias /static /home/apps/microblog/app/static ScriptAlias / /home/apps/microblog/runp-mysql.fcgi/ </VirtualHost>

Параметр FcgidIPCDir указывает папку, в которой будут созданы файлы сокетов.

Я обнаружил, что по умолчанию они создаются в папке, в которой у пользователя Apache нет разрешения на запись, поэтому я решил поместить эти файлы в /tmp. Затем мы указываем AddHandler, чтобы сообщить Apache, что все файлы с расширением .

fcgi должны рассматриваться как файлы FastCGI и выполняться через только что установленный нами модуль mod_fcgid. Помните новый файл runp-mysql.fcgi, расположенный в нашем корневом каталоге? Этот файл использует модуль Python flup в качестве адаптера, чтобы наше приложение могло взаимодействовать с протоколом FastCGI. Давайте посмотрим на этот файл:

#!flask/bin/python import os os.environ['DATABASE_URL'] = ' mysql://apps:apps@localhost/apps ' from flup.server.fcgi import WSGIServer from app import app if __name__ == '__main__': WSGIServer(app).

run()

Apache выполнит этот файл для запуска нашего приложения.

Обратите внимание, как мы помещаем имя базы данных MySQL в среду, чтобы Apache мог ее распознать.

В этом разделе определяется хост, который будет обслуживать веб-сервер.

Обозначение *:80 означает, что все запросы, полученные сервером на любом хосте через порт 80, будут обслуживаться этим виртуальным сервером.

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

Чтобы отличить серверы друг от друга, вы можете использовать разные IP-адреса, домены/поддомены или порты.

Определение нашего виртуального хоста довольно простое.

Оператор DocumentRoot сообщает Apache, где искать статические файлы.

Все запросы к файлам будут обслуживаться из этой папки, поэтому, например, когда браузер запрашивает файл /favicon.ico для отображения небольшого значка рядом с полем ввода адреса в браузере, Apache будет искать его здесь.

Однако все статические файлы, используемые в нашем приложении, будут иметь префикс /static, поэтому, чтобы Apache не искал другую статическую папку, мы используем оператор Alias, что означает, что все запросы, начинающиеся с /static, должны идти в нашу статическую папку.

.

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

fcgi. Файл конфигурации Apache поддерживает гораздо больше параметров, чем те, которые я упомянул.

Я рекомендую вам прочитать документацию Apache, чтобы решить, какие еще опции имеет смысл включить для вашего сервера.

Чтобы активировать внесенные изменения, мы должны перезагрузить сервер от имени пользователя root:

# service httpd restart

Теперь, перейдя по адресу http:// в своем браузере вы должны увидеть страницы нашего микроблога.



Установка обновлений приложения
Последний момент, который мы рассмотрим, — это развертывание обновлений нашего приложения.

Предположим, мы развернули приложение и какое-то время оно успешно работало на нашем сервере.

И вот пришло время выпустить обновление, которое должно исправить некоторые обнаруженные ошибки или просто добавить новые функции.

Для этого мы используем git и наши собственные инструменты.

Если мы авторизованы на сервере под учетной записью приложения, мы можем обновиться до последней версии в репозитории с помощью команд:

$ cd microblog $ git pull $ DATABASE_URL= mysql://apps:apps@localhost/apps .

/db_upgrade.py $ .

/tr_compile.py

Команда git pull загрузит все новые и обновленные файлы с нашего git-сервера.

Далее мы обновим нашу базу данных и перекомпилируем файлы перевода, если они изменились.

И все это! Теперь, когда все обновления получены, нам необходимо перезапустить процессы FastCGI, а это несколько сложно, поскольку мы вошли в систему как пользователь приложения, непривилегированный пользователь, а процессы FastCGI принадлежат пользователю apache. И в этом случае sudo пригодится.

Команда sudo позволяет пользователям запускать приложения от имени другого пользователя.

Мы не хотим давать пользователю нашего приложения слишком много прав, поэтому дадим ему только право отправлять сигналы остановки FastCGI процессам, запущенным пользователем Apache. Скрипт killpython из папки нашего микроблога делает именно это:

killall /home/apps/microblog/flask/bin/python

Загвоздка в том, что если мы запустим этот скрипт от имени пользователя приложения, у нас не будет необходимых привилегий для остановки процессов, принадлежащих пользователю Apache. Чтобы позволить пользователю приложения прерывать эти процессы, мы должны внести небольшие изменения в файл /etc/sudoers:

apps ALL=(apache) NOPASSWD:/home/apps/microblog/killpython Defaults: apps !requiretty

Обратите внимание, что вы должны внести эти изменения как пользователь root, поскольку /etc/sudoers — это системный файл.

Первая трудночитаемая команда дает пользователю приложения право запускать killpython от имени пользователя Apache без необходимости ввода пароля.

Вторая строка позволяет пользователю приложения использовать команду sudo, вызывая ее из сценария, а не только из консоли.

Вы можете обратиться к руководству по файлу sudoers для получения подробной информации о синтаксисе файла конфигурации sudo. Теперь, войдя в систему под учетной записью пользователя приложения, мы можем прерывать процессы Python, выполнив команду:

$ sudo -u apache .

/killpython

Если процессы FastCGI прерваны, Apache перезапустит их при получении следующего запроса к микроблогу.

Чтобы немного упростить обновление нашего сервера, мы могли бы создать клиентский скрипт, который объединил бы процессы обновления и перезапуска.

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

ssh apps@<your-server> "cd microblog;git pull;sudo -u apache .

/killpython;DATABASE_URL= mysql://apps:apps@localhost/apps .

/db_upgrade.py;.

/tr_compile.py"

Если сохранить эту команду в скрипт, то можно одной командой выкатить обновление на сервер!

Что еще можно добавить
Я не рассмотрел несколько распространенных операций, которые рекомендуется выполнять для обеспечения еще большей безопасности сервера во «враждебной интернет-среде».

Это такие операции, как:

  • Запретить пользователю root удаленный вход в систему
  • Отключите все неиспользуемые службы, такие как FTP, CIFS и т. д.
  • Настройка брандмауэра.

  • Своевременная установка обновлений безопасности серверного ПО.

  • Некоторые другие.

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



Хостинг на Raspberry Pi

Raspberry Pi это революционный миниатюрный компьютер под управлением Linux, который стоит около 35 долларов.

Он имеет очень низкое энергопотребление, что делает его отличным устройством для размещения домашних веб-приложений, к которым можно получить доступ онлайн 24 часа в сутки, 7 дней в неделю, без необходимости постоянно держать большой компьютер включенным.

Существует несколько дистрибутивов, разработанных для Raspberry Pi. Мы установим наше приложение на Распбиан , официальное распространение.

Кстати, обратите внимание, что Raspbian является ответвлением дистрибутива Debian, а это означает, что приведенные ниже инструкции также применимы (возможно, с минимальными изменениями) к серверам на базе Debian/Ubuntu. Теперь мы повторим те же шаги, которые мы выполнили для CentOS, для настройки сервера RPi.

Настройка на стороне клиента
Raspberry Pi — полноценный компьютер.

Вы можете подключить HDMI-монитор, клавиатуру, мышь и работать непосредственно на нем над настройкой серверного ПО.

Как и в случае с CentOS (или в любом другом дистрибутиве Linux), вы можете просто подключить Raspberry Pi к сети, а затем подключиться к нему с помощью ssh. См.

подраздел «Настройка на стороне клиента» выше, чтобы настроить ssh на вашем компьютере.

Обратите внимание, что я не коснулся установки и настройки самого Raspberry Pi, так как об этом написано немало статей.

Я предполагаю, что Raspberry Pi уже запущен и подключен к сети.



Установка пакетов программного обеспечения
Поскольку Pi по-прежнему является машиной с ограниченным энергопотреблением, мы не будем устанавливать полный стек Apache/MySQL, как это было на CentOS. Вместо этого мы воспользуемся облегченным подходом.

Используем в качестве веб-сервера Лайттпд , небольшой веб-сервер с Теги: #python #flask #веб-разработка #развертывание #centos #Raspberry Pi #Apache #lighttpd #разработка веб-сайтов #python

Вместе с данным постом часто просматривают: