Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.
Кратко о задаче
Нам понадобится хост с предустановленной Ubuntu. Желательно создать на сервере обычного пользователя с правами sudo. Например, арендуйте готовую к эксплуатации удаленную машину у провайдера Simple-Server.
- Инсталлировать веб-сервер Nginx.
- Зарегистрировать домен.
- Настроить записи DNS:
* А с указанием публичного IP в графе `your_domain`.
* А аналогично, но с добавлением `www`.- А с указанием публичного IP в графе
your_domain. - А аналогично, но с добавлением
www.
Желательно иметь представление о спецификации WSGI. Это поможет понять, как Gunicorn обменивается данными и командами с приложениями Flask.
В рамках подготовки к работе постановим менеджер pip, с его помощью мы будем манипулировать компонентами Python. Плюс скачаем файлы, требуемые для создания ряда элементов Gunicorn. Но предварительно скачаем обновления пакетов и установим python3-pip, он нужен для организации среды разработки:
sudo apt update
sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptoolsЗададим настройки виртуальной среде Python
Виртуальные окружения позволяют разделять зависимости приложений, размещенных на одном сервере. Первый этап:
sudo apt install python3-venvВторым этапом сделаем родительскую директорию, где будем хранить весь проект Flask. И сразу перейдем в нее:
mkdir ~/myproject
cd ~/myprojectТретьим этапом организуем непосредственно виртуальную среду Python:
python3 -m venv myprojectenvВсе используемые впоследствии файлы будут сохраняться в папке myprojectenv. Остается провести активацию:
source myprojectenv/bin/activateРезультат будет заметен по изменившемуся виду командной строки. Она примет такой вид:
(myprojectenv)user@host:~/myproject$Настроим приложение Flask
Следом загрузим**** Flask и Gunicorn:
pip install gunicorn flaskТеперь применим Flask для создания простейшей программы. Но важно учитывать, что данную микроструктуру чаще берут в качестве дополнительного модуля, т.к. в ней минимум инструментов из тех, что обычно актуальны при веб-разработке. В качестве примера создадим простой вариант под названием myproject.py:
nano ~/myproject/myproject.pyВ указанный файл мы сохраним код программы. При запуске будет импортирован Flask и создан экземпляр объекта. Например, вот так:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "<h >Hello!<h1>"
if __name__ == "__main__":
app.run(host='0.0.0.0')После внесения изменений закройте файл с сохранением. Теперь проверим работоспособность кода, но сначала настроим брандмауэр, чтобы тот разрешал трафик по порту 5000.
Теперь система готова к тесту программного модуля Flask:
Теперь откроем наш домен по IP с указанием порта:
http://your_server_ip:5000В окне браузера увидим «Hello!». Завершим сессию и отключим сервер нажатием комбинации <Ctrl+C> (в терминале).
Переходим к созданию файла, который послужит нам точкой входа в разрабатываемую программу. Он «подскажет» серверу Gunicorn, каким образом обмениваться данными с ним.
Перенесем экземпляр Flask в только что созданный файл, после чего откроем его:
from myproject import app
if __name__ == "__main__":
app.run()Перед продолжением работы убедимся, что сервер Gunicorn способен правильно обрабатывать нашу программу. Выполняется это передачей наименования точки входа без расширения и имени вызываемого элемента. Возьмем, например, wsgi:app. Еще в команде понадобится указать номер порта с интерфейсом:
cd ~/myproject
gunicorn --bind 0.0.0.0:5000 wsgi:appПерейдем в браузер и введем IP нашего сервера с портом под номером 5000:
http://your_server_ip:5000Программа выдаст сообщение «Hello!». Завершим работу нажатием кнопок <Ctrl + C> в окне терминала. И отключим виртуальную среду:
После этого все команды Python будут иметь отношение только к общей системной среде. Если работать с виртуальной придется постоянно, есть смысл запускать ее автоматически вместе с операционкой. С этой целью сгенерируем файл автозагрузки. Сначала создадим *.service и разместим в папке /etc/systemd/system:
sudo nano /etc/systemd/system/myproject.serviceПервоначально [Unit], куда обычно вносят метаданные и зависимости, внесем описание службы и зададим условие инициализировать «виртуалку» после подтверждения наличия связи:
[Unit]
Description=Gunicorn instance to serve myproject
After=network.targetВ блоке [Service] укажем аккаунт и группу, от имени которых будет запускаться процесс.
[Unit]
Description=Gunicorn instance to serve myproject
After=network.target
[Service]
User=username
Group=www-dataСледующим шагом укажем переменную PATH, чтобы при активизации система сразу «понимала», где брать требуемые файлы (в «виртуалке»).
[Unit]
Description=Gunicorn instance to serve myproject
After=network.target
[Service]
User=username
Group=www-data
WorkingDirectory=/home/username/myproject
Environment="PATH=/home/username/myproject/myprojectenv/bin"
ExecStart=/home/username/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:appСледует учитывать, что для systemd нужно указывать полный путь к файлу Gunicorn, размещенному в «виртуалке».
В итоге добавим раздел [Install] и внесем в него:
[Unit]
Description=Gunicorn instance to serve myproject
After=network.target
[Service]
User=username
Group=www-data
WorkingDirectory=/home/username/myproject
Environment="PATH=/home/username/myproject/myprojectenv/bin"
ExecStart=/home/username/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app
[Install]
WantedBy=multi-user.targetВсе, файл systemd подготовлен. Закройте его с сохранением изменений. И можно запускать службу Guricorn (сразу настроим ее загрузку вместе с операционкой):
sudo systemctl start myproject
sudo systemctl enable myprojectОстается проверить ее текущее состояние:
sudo systemctl status myprojectПереходим к работе с веб-сервером Nginx (Gunicorn не используется в качестве фронтенд-сервера, и обычно настраивается реверс-прокси. В нашем случае это будет Nginx). Сначала создадим файл с конфигурацией в директории с sites-available, назовем его myproject.
sudo nano /etc/nginx/sites-available/myprojectВ нем укажем веб-серверу прослушивать порт 80 и использовать серверный блок при всех запросах нашего домена:
server {
listen 80;
server_name your_domain www.your_domain;
}Следом добавим location, где укажем proxy_params, определяющий параметры настраиваемого прокси.
server {
listen 80;
server_name your_domain www.your_domain;
location / {
include proxy_params;
proxy_pass http://unix:/home/username/myproject/myproject.sock;
}
}Закроем файл с сохранением изменений. И применим новую конфигурацию путем привязки к директории sites-enabled.
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabledТакже добавим пользователя www-data в группу текущего пользователя. Для этого выполним:
sudo usermod -a -G ${USER} www-dataПроверим конфигурацию Nginx:
И если все в порядке, перезапустим его:
Завершим настройку внесением изменений в параметры брандмауэра. Например, правило насчет доступа через порт 5000 нам уже не понадобится, его можно смело удалять. Вместо него внесем другой, для открытия подключения к серверу Nginx:
sudo ufw delete allow 5000
sudo ufw allow 'Nginx Full'Попробуйте зайти на наш сервер из браузера: http://your_domain. Программа выдаст сообщение «Hello!»
Последняя задача в этом материале – установка SSL сертификата для защиты трафика. Мы рекомендуем получить бесплатный SSL Let’s Encrypt с помощью Certbot. Рекомендуемый способ установки Certbot — через snap, который уже предустановлен в Ubuntu.
Подробную инструкцию по выпуску SSL можно найти в официальной документации Certbot.
Выполните команду ниже, чтобы убедиться, что используется последняя версия snapd:
sudo snap install core; sudo snap refresh coreЕсли ранее вы устанавливали какие-то пакеты Certbot с помощью пакетного менеджера apt, удалите их командой:
sudo apt-get remove certbotУстановите Certbot через snap:
sudo snap install --classic certbotВыполните следующее, чтобы убедиться, что команда certbot может быть запущена:
sudo ln -s /snap/bin/certbot /usr/bin/certbotВыполните команду ниже, чтобы получить сертификат и автоматически внести необходимые изменений в конфигурацию Nginx:
Certbot будет автоматически обновлять сертификат. Вы можете протестировать обновление, запустив команду:
sudo certbot renew --dry-runПосле проверьте открытие домена https://your_domain в браузере. Помимо традиционного результата в виде сообщения «Hello!», должен появиться замочек, подтверждающий защиту сайта.
Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.