Запуск двух Flask приложений в двух разных доменах с использованием apache2 и WSGI - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть два python (3.6) Flask приложений, работающих на Ubuntu 18.04, и я пытаюсь использовать Apache2 (v2.4.29) для обслуживания этих двух приложений в двух разных доменах - app1domain.com и app2domain.com. У меня есть два файла .conf, которые я пытался изменить, чтобы заставить это работать. В настоящее время они выглядят так (замените app1 на app2 на второй):

WSGIDaemonProcess app1 python-home=/var/www/app1/venv user=brett group=sudo home=/ threads=5
WSGIScriptAlias / /var/www/app1/app.wsgi
WSGIProcessGroup app1
WSGIApplicationGroup %{GLOBAL}

<VirtualHost *:80>

    ServerAdmin myemail@outlook.com
    ServerName app1domain.com
    ServerAlias www.app1domain.com

    <Directory /var/www/app1>
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    RewriteEngine on
    RewriteCond %{SERVER_NAME} =app1domain.com [OR]
    RewriteCond %{SERVER_NAME} =www.app1domain.com
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

</VirtualHost>

<VirtualHost *:443>

        ServerName app1domain.com
        ServerAlias www.app1domain.com
        ServerAdmin myemail@outlook.com

        LogLevel debug
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        Include /etc/letsencrypt/options-ssl-apache.conf

        SSLCertificateFile /etc/letsencrypt/live/app1domain.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/app1domain.com/privkey.pem
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Вот где я застрял, и вот что я попробовал:

  1. Если оба файла conf имеют формат, показанный выше, app1 будет обслуживаться как https://app1domain.com и https://app2domain.com, а app2 не будет отображаться.
  2. Если я отключаю conf для app1, app2 подается на https://app1domain.com и https://app2domain.com, что говорит о том, что как минимум оба файла conf работают и приложения работают правильно.
  3. Из моих исследований я вижу, что во многих conf-файлах есть инструкции WSGI внутри тегов <VirtualHost>. Если я сделаю это для обоих конфессий, страница Apache2 по умолчанию будет отображаться в обоих доменах.
  4. Я попробовал почти каждую комбинацию инструкций WSGI внутри и снаружи тега <VirtualHost>, а также вложенную <Directory> тег. Большая часть просто приводит к странице apache2 по умолчанию.

Мне не хватает другого параметра, который мне нужно изменить? Что я здесь не так делаю?

Я также искал хорошую документацию о том, как интерпретировать эти файлы conf, что на самом деле делают опции, поэтому очень хотелось бы, чтобы кто-то мог указать мне на что-то, особенно если это чехлы WSGI.

1 Ответ

0 голосов
/ 26 апреля 2020

Кажется таким очевидным в заднем плане. Оказывается, проблема была в том, что я слепо доверял certbot для автоматического создания нового VirtualHost и перенаправления, и я не особо задумывался о том, как это работает.

Если вы посмотрите на пример файла .conf в вопросе, причина, по которой он работает, заключается в том, что инструкции WSGI создаются вне области действия тегов <VirtualHost>, что позволяет им быть подхваченными обоими виртуальными хостами. , Но в то же время, поскольку они создаются глобально, инструкции WSGI в файле .conf, который идет первым в алфавитном порядке, переопределяют другие, следовательно, app1 отображается на app1domain.com и app2domain.com.

Когда я переехал инструкции WSGI внутри тегов <VirtualHost>, я перемещал их внутри тегов <VirtualHost *:80>, потому что все примеры, которые я нашел, делали это (потому что они не использовали SSL). Когда я это сделал, вместо запуска приложения RewriteEngine перенаправлял запрос на https-версию веб-сайта. Это замечено <VirtualHost *:443>, когда вы заметите, что у меня не было инструкций по запуску приложения, поэтому мы получаем страницу по умолчанию.

В конце я переписал свои файлы .conf следующим образом:

<VirtualHost *:80>

    ServerAdmin myemail@outlook.com
    ServerName app1domain.com
    ServerAlias www.app1domain.com

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    RewriteEngine on
    RewriteCond %{SERVER_NAME} =app1domain.com [OR]
    RewriteCond %{SERVER_NAME} =www.app1domain.com
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

</VirtualHost>

<VirtualHost *:443>

    ServerName app1domain.com
    ServerAlias www.app1domain.com
    ServerAdmin myemail@outlook.com

    WSGIDaemonProcess app1 python-home=/var/www/app1/venv user=brett group=sudo home=/ threads=5
    WSGIScriptAlias / /var/www/app1/app.wsgi

    <Directory /var/www/app1>
        WSGIProcessGroup app1
        WSGIApplicationGroup %{GLOBAL}
        Require all granted
    </Directory>

    LogLevel debug
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    Include /etc/letsencrypt/options-ssl-apache.conf

    SSLCertificateFile /etc/letsencrypt/live/app1domain.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/app1domain.com/privkey.pem

</VirtualHost>
...