Настраиваем Linux сервер Ubuntu для работы сайтов на python через фреймворк Flask.
Этот материал из цикла статей по разработке сайтов на python: от локальной разработки до развертывания на удаленном сервере.
В статье работаем на сервере Ubuntu 20.04 с базовой первичной настройкой. Как обновить и сделать первичную настройку сервера Ubuntu.
Мы уже настраивали сервер под Django. Некоторые процессы похожи, а некоторые отличаются.
Перед развертыванием сервера у нас должна быть готова локальная разработка, иначе особого смысла в удаленном сервере нет.
Если сначала подготовить сервер, а только потом разрабатывать локально, то при переносах появится мешанина. Поэтому лучше сначала сделать сайт или приложение в локальной среде, а затем по инструкции ниже настроить и перенести на сервер.
1. Установка пакетов для Python
Обновим пакеты в системе:
Установим необходимые пакеты для работы с python
2. Создаем виртуальную среду Python
Установим пакет python3-venv:
Заходим в папку пользователя:
Создаем новую директорию для проекта. Это может быть название сайта:
cd ploshadka.net
Устанавливаем виртуальную среду в директорию venv. Она будет создана в текущей директории:
В этой изолированной виртуальной среде будут находиться различные модули для работы Python.
Для дальнейшей настройки активируем виртуальную среду:
3. Переносим локальный проект на удаленный сервер
Если мы переносим локальный проект на сервер, то используем инструкцию переноса приложения python на удаленный сервис.
В этом случае далее в статье, где указаны установки с командой pip можно пропустить, ведь они установлены локально и будут подтянуты на сервер из зависимостей.
4. Устанавливаем Flask
Находясь в виртуальной среде, устанавливаем:
pip install uwsgi flask
Выходим из виртуальной среды:
Дополнительно можно установить SQLAlchemy.
Создадим и проверим стартовую страницу
Создаём файл wsgi.py в корне сайта. Эта будет стартовая точка запуска нашего приложения.
Предварительно в нашем фаерволе ufw должен быть открыт порт:
Мы уже можем запустить наш сайт такой командой:
Сайт будет доступен по адресу:
Поигрались и закрыли доступ снова:
Файл настроек
Дальше создадим файл с настройками в корне сайта:
Внутри него:
# Имя файла стартовой страницы без расширения
module = wsgi:app
# Режим мастера и количество рабочих процессоров
master = true
processes = 10
# Создание и очистка сокета
socket = wsgi-socket.sock
chmod-socket = 660
vacuum = true
die-on-term = true
# Автоматически обновляет данные на странице после изменений содержимого сайта
py-autoreload = 1
5. Настраиваем службу systemd
Содержимое файла:
Description=uWSGI instance for ploshadka
After=network.target
[Service]
User=ploshadka
Group=www-data
WorkingDirectory=/home/ploshadka/ploshadka.net
Environment="PATH=/home/ploshadka/ploshadka.net/venv/bin"
ExecStart=/home/ploshadka/ploshadka.net/venv/bin/uwsgi --ini wsgi-config.ini
[Install]
WantedBy=multi-user.target
Команды службы uWSGI
Запуск службы:
Положим сервис в автозагрузку при запуске сервера:
Проверка статуса:
Перезагрузка:
Если меняете файл службы, то следует перезапустить демон:
Если иногда требуется перезагрузить systemctl в авто-режиме без пароля.
6. Настройка Nginx
Установим nginx на сервер:
sudo apt install nginx
Добавим разрешение в наш брандмауэр ufw. Посмотрим возможные конфигурации:
А добавим:
Настроим базовую конфигурацию для nginx:
Содержимое файла:
listen 80;
server_name ploshadka.net www.ploshadka.net;
location / {
include uwsgi_params;
uwsgi_pass unix:/home/ploshadka/ploshadka.net/wsgi-socket.sock;
}
}
Проверим на ошибки в синтаксисе файла:
Активируем настройки нового сайта для nginx:
Если встречается ошибка «command not found», попробовать очистить строку от лишних символов, которые вставляют отдельные редакторы.
Перезагрузим nginx:
Сайт готов и должен работать по адресу http://:
7. Получаем сертификат Let’s Encrypt для https
Делать строго после настройки nginx конфига для сайта (предыдущий пункт).
Устанавливаем Certbot для Nginx:
Certbot самостоятельно будет обновлять сертификат за 30 дней до истечения срока.
Запрашиваем сертификат для своего сайта:
Выбираем самостоятельное добавление конфигурации. Автоматически Certbot любит добавлять дубли.
После установки снова открываем файл nginx:
И меняем содержимое на такое:
server_name ploshadka.net www.ploshadka.net;
location / {
include uwsgi_params;
uwsgi_pass unix:/home/ploshadka/ploshadka.net/wsgi-socket.sock;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/ploshadka.net/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/ploshadka.net/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = www.ploshadka.net) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = ploshadka.net) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name ploshadka.net www.ploshadka.net;
return 404; # managed by Certbot
}
Опять проверим файл на ошибки синтаксиса:
Перезагрузим nginx:
Проверить время окончания сертификата можно так:
8. Устанавливаем PostgreSQL
Установим PostgreSQL на сервер:
Активируем виртуальную среду python (предварительно надо быть в каталоге сайта):
Теперь устанавливаем пакет psycopg2, который является python-postgreSQL адаптером:
На случай проблем команда перезагрузки сервиса PostgreSQL в Ubuntu:
Перед созданием баз данных и пользователей не лишним будет ознакомиться с особенностями кодировок в PostgreSQL. Это поможет избежать возможных проблем при миграции базы данных с локальной разработки на удаленный сервер.
Дальше создаем и настраиваем пользователя и базу данных в PostgreSQL.
После настройки базы данных в PostgreSQL подключиться к ней можно с локального компьютера.
Если в локальной разработке уже есть нужные нам данные в БД, то перенесем их на удаленный сервер.