Обратный прокси-сервер Apache с использованием mod_proxy

0 Введение

Я пытаюсь настроить сервер с основным сайтом, размещенным на портах 80 и 443 (назовем его example.com), и секцией на этом сайте, которая обслуживает аналитику umami, размещенную на порту 3000 (назовем ее umami.example.com), используя обратный прокси. Я использую Django и Apache (с mod_wsgi, как подсказывает проект django), и мне нужно настроить DNS с помощью Cloudflare.

Основной сайт работает как и предполагалось, перенаправляя http трафик на https (подробнее об этом в разделе Apache), и я пытаюсь добавить этот раздел под umami.example.com, но каждый запрос заканчивается 404 ошибкой, выдаваемой моим основным сайтом.

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

####################################################################

1 DNS

DNS настроен с помощью Cloudflare с 3 записями A:

  • example.com -> IP-адрес сервера
  • umami -> тот же ip-адрес сервера
  • www -> снова тот же ip

и некоторые MX и TXT.

####################################################################

2 Конфигурация Apache

<VirtualHost _default_:80>
    ServerAdmin admin@example.com
    ServerName umami.example.com

    ProxyPass "/" "http://127.0.0.1:3000/"
    ProxyPassReverse "/" "http://127.0.0.1:3000/"
</VirtualHost>


<VirtualHost *:80>
   ServerName example.com
   ServerAlias www.example.com
   Redirect permanent / https://example.com/
</VirtualHost>


<VirtualHost _default_:443>
    ServerAdmin admin@example.com
    ServerName example.com
    ServerAlias www.example.com


    Alias /static /mainfolder/static
    DocumentRoot /mainfolder/django-folder

    <Directory /mainfolder/django-folder/static>
        Require all granted
    </Directory>

    <Directory /mainfolder/django-folder/django-app>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>

    WSGIDaemonProcess django-folder python-path=/mainfolder/django-folder python-home=/usr/local/env
    WSGIProcessGroup django-folder
    WSGIScriptAlias / /mainfolder/django-folder/django-app/wsgi.py


    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

</VirtualHost>

####################################################################

3 Что я пробовал

  • Подключение напрямую к IP-адресу в обход DNS (порт 80) не имеет никакого значения.

  • Подключение напрямую к IP-адресу в обход DNS (порт 3000) работает как положено.

  • Поменяв местами конфигурацию Apache работает следующим образом:

    • Когда обратный прокси стоит на первом месте (конфигурация такая, как описано выше), то подключение к 80 порту обслуживает сайт аналитики.
    • Когда редирект идет первым (поменяно местами), подключение к 80 порту перенаправляет на HTTPS сайт
    • .
  • Добавление и удаление ProxyPreserveHost не имеет никакого значения.

Вернуться на верх