По каждой составляющей можно нагуглить множество статей с примерами, здесь я опишу высокоуровневую картинку для цельного понимания происходящего:
1. Настройка кода
Настраиваете окружение для бэкэнда отдельных сайтов. Не важно, Python + Flask/Django или Node.js или что ещё, не особо важно, где оно в системе хранится (часто используется путь вида /var/www/my-website
).
По-хорошему, для Питона можно использовать изолированные окружения через venv (virtual environment), или вообще Docker для всего, но если число сайтов редко меняется или опыта/компетенций мало, то можно обойтись и общим системным окружением.
Желательно настроить проброс прослушиваемого порта из консольного аргумента, пригодится в дальнейшем. В Джанго это имеется по умолчанию, во Фласке можно легко сделать самостоятельно.
2. Запуск кода
Автоматизировать запуск серверных приложений через systemctl или Docker-Compose, что позволит автоматически их перезапускать в случае падения из-за ошибок, или вручную для выкатки новых версий. Приложениям в конфигах проставляем порты, удобно использовать единообразные вроде 80xx.
3. Роутинг
Установить и настроить NginX для перенаправления запросов по разным доменам к портам. Чтобы условный my-site-1.ru:80/443
отправлялся на порт 8001 одного приложения, а my-site-2.ru:80/443
на порт 8002 другого, и т.п. Можно и даже удобно использовать разные конфиги, что позволит проще управлять сайтами, в каждом независимо прописывать отдельные правила, чаще всего для обработки статического контента сайта (JS, CSS, медиа).
В документации Фласка есть базовый пример настройки NginX.