Установка mod_wsgi с Apache на Ubuntu 20.04

mod_wsgi — это модуль Apache, который позволяет запускать Python‑веб‑приложения под Apache. Подходит как для производственных сайтов с высокой нагрузкой, так и для персональных сайтов. С помощью mod_wsgi можно разворачивать приложения на Django, Flask, Web.py, Werkzeug, CherryPy, TurboGears и других фреймворках.
Кому полезно
- Сисадминам, которые хотят запускать Python‑приложения внутри Apache.
- Разработчикам, которым нужно быстро протестировать WSGI‑скрипт через Apache.
Предварительные требования
- Сервер с Ubuntu 20.04.
- Доступ root или пользователь с sudo.
- Базовые навыки работы с терминалом и редактором (nano/vi).
Важно: в рабочем окружении рекомендуется использовать виртуальное окружение Python и запускать приложение от непользовательского аккаунта (например, www‑data). Включите HTTPS для публичных сервисов.
Обновление системы
Перед началом обновите пакеты:
sudo apt-get update -y
sudo apt-get upgrade -yПерезапустите систему при необходимости, чтобы применить обновления.
Установка Python
Ubuntu 20.04 обычно поставляется с Python 3. Если по какой‑то причине Python не установлен, установите его так:
sudo apt-get install python3 libexpat1 -yДля развёртывания приложений в продакшене используйте virtualenv или venv:
python3 -m venv /opt/myapp/venv
source /opt/myapp/venv/bin/activate
pip install --upgrade pipУстановка Apache и mod_wsgi
Установите Apache и модуль WSGI. В большинстве случаев для Python 3 нужен пакет libapache2-mod-wsgi-py3:
sudo apt-get install apache2 apache2-utils ssl-cert libapache2-mod-wsgi-py3 -yПримечание: в старых руководствах встречается libapache2-mod-wsgi (для Python 2). Для Ubuntu 20.04 используйте вариант для Python 3.
После установки можно продолжить конфигурацию.
Быстрая тестовая страница через mod_wsgi
Создадим простой WSGI‑скрипт в корне веб‑сайта Apache:
sudo nano /var/www/html/wsgi.pyДобавьте в файл следующий код (корректный минимальный WSGI‑приложение):
def application(environ, start_response):
status = '200 OK'
html = '\n' \
'\n' \
'\n' \
'\n' \
'Welcome to mod_wsgi Test Page\n' \
'\n' \
'\n' \
'\n'
response_header = [('Content-Type', 'text/html; charset=utf-8')]
start_response(status, response_header)
return [html.encode('utf-8')]Сохраните файл и измените владельца на www‑data:
sudo chown www-data:www-data /var/www/html/wsgi.pyСоздайте конфигурацию Apache для привязки WSGI‑скрипта к пути /wsgi:
sudo nano /etc/apache2/conf-available/wsgi.confДобавьте строку:
WSGIScriptAlias /wsgi /var/www/html/wsgi.pyСохраните файл, включите конфигурацию и перезапустите Apache:
sudo a2enconf wsgi
sudo systemctl restart apache2Теперь откройте в браузере http://your-server-ip/wsgi — вы должны увидеть тестовую страницу.

Рекомендации по безопасности и производительности
Важно: базовая конфигурация подходит для тестов. Для реальных приложений используйте демонический режим mod_wsgi, настройте права и включите HTTPS.
Пример безопасной конфигурации виртуального хоста с WSGIDaemonProcess:
ServerName example.com
WSGIDaemonProcess myapp python-home=/opt/myapp/venv python-path=/opt/myapp
WSGIProcessGroup myapp
WSGIScriptAlias / /opt/myapp/myapp/wsgi.py
Require all granted
ErrorLog ${APACHE_LOG_DIR}/myapp-error.log
CustomLog ${APACHE_LOG_DIR}/myapp-access.log combined
Что важно сделать:
- Использовать WSGIDaemonProcess и WSGIProcessGroup для изоляции процессов.
- Запускать процессы от непривилегированного пользователя (указанного в WSGIDaemonProcess).
- Настроить права доступа так, чтобы только Apache мог читать код и файлы конфигурации.
- Включить HTTPS (Let’s Encrypt / certbot) для публичных сервисов.
- Отключить индексирование директорий и лишние модули Apache.
Альтернативные подходы
Если вам нужна лучшая масштабируемость или контейнеризация, рассмотрите альтернативы:
- Gunicorn + systemd + Nginx в качестве обратного прокси — часто проще отлаживать и масштабировать.
- uWSGI + Emperor + Nginx — мощный стек с множеством настроек.
- Запуск в контейнерах (Docker) с orchestration (Kubernetes) для микросервисной архитектуры.
mod_wsgi хорош для тех, кто хочет держать всё внутри Apache и минимизировать число компонентов.
Тесты и критерии приёмки
Критерии приёмки для базовой установки:
- Apache установлен и активен (systemctl status apache2).
- Пакет libapache2-mod-wsgi-py3 установлен.
- URL http://your-server-ip/wsgi возвращает 200 OK и корректный HTML.
- Логи Apache не содержат ошибок, связанных с загрузкой WSGI‑скрипта.
Мини‑тесты:
- curl -I http://your-server-ip/wsgi — ответ 200 и Content-Type text/html.
- Проверить владелец файла: ls -l /var/www/html/wsgi.py -> www-data:www-data.
Типичные проблемы и как их решать
- 500 Internal Server Error — смотрите /var/log/apache2/error.log для деталей.
- ModuleNotFoundError — убедитесь, что приложение запускается в том же виртуальном окружении, что и модуль mod_wsgi (python-home в WSGIDaemonProcess).
- Неправильный пакет mod_wsgi — используйте libapache2-mod-wsgi-py3 для Python 3.
Чеклист по ролям
Для системного администратора:
- Установить Apache и модуль WSGI.
- Настроить службы, логи и ротацию логов.
- Настроить брандмауэр (ufw allow ‘Apache Full’) и HTTPS.
Для разработчика:
- Подготовить WSGI‑файл и virtualenv.
- Проверить локально приложение через gunicorn/uWSGI.
- Настроить переменные окружения и секреты вне кода.
Для владельца продукта:
- Определить SLA и требования ко времени отклика.
- Решить стратегию бэкапов и мониторинга.
Короткий глоссарий
- WSGI — интерфейс между веб‑сервером и Python‑приложением.
- mod_wsgi — модуль Apache, реализующий WSGI.
- WSGIDaemonProcess — директива для изолированного процесса WSGI.
- virtualenv / venv — инструмент для изоляции зависимостей Python.
Заключение
Вы успешно настроили базовую интеграцию mod_wsgi и Apache на Ubuntu 20.04 и протестировали простое WSGI‑приложение. Для продакшн‑окружения используйте демонический режим mod_wsgi, виртуальное окружение, HTTPS и строгие права доступа. Рассмотрите альтернативы (Gunicorn/uWSGI + Nginx) для более гибкого масштабирования.
Важно: выбор между mod_wsgi и внешними WSGI‑серверами зависит от требований к масштабируемости, управляемости и окружению развёртывания.
Сводка — что сделать далее:
- Перенести приложение в виртуальное окружение.
- Настроить WSGIDaemonProcess с нужным пользователем и python-home.
- Настроить HTTPS с certbot и обеспечить бэкапы логов.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента