Невозможно получить доступ к приложению FastAPI через прокси-сервер Apache HTTPS в Google Cloud

Я изо всех сил пытаюсь обеспечить безопасное обслуживание своего приложения FastAPI на сайте forge-code.com с помощью HTTPS.

Вот что я сделал на данный момент:

Развернул свое приложение FastAPI на экземпляре Google Cloud. Успешный доступ к приложению по протоколу HTTPS напрямую через IP-адрес экземпляра. Купил домен forge-code.com на Hostinger и настроил его для пересылки запросов на мой экземпляр. Установил сертификат SSL от Certbot и получил доступ к файлу Apache2 index.html на моем экземпляре через https://forge-code.com. Моя проблема: когда я захожу на https://forge-code.com, я вижу Apache2 index.html вместо моего приложения FastAPI. Мой файл 000-default.conf выглядит так:

  GNU nano 7.2                                                                                                     000-default.conf                                                                                                              
<VirtualHost *:80>
    ServerName forge-code.com

    RewriteEngine on
    RewriteCond %{SERVER_NAME} =forge-code.com
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>


00-default-le-ssl.conf

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        ProxyPass / http://0.0.0.0:8000/
        ProxyPassReverse / http://0.0.0.0:8000/
        SSLEngine on
        ServerName forge-code.com
        Include /etc/letsencrypt/options-ssl-apache.conf
        SSLCertificateFile /etc/letsencrypt/live/forge-code.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/forge-code.com/privkey.pem
</VirtualHost>

</IfModule>

Вот еще немного информации Это выходные данные

systemctl status apache2

shivajay295@instance-20240221-193932:/etc/apache2/sites-available$ systemctl status apache2
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; preset: enabled)
     Active: active (running) since Fri 2024-02-23 18:37:43 UTC; 2h 30min ago
       Docs: https://httpd.apache.org/docs/2.4/
    Process: 46449 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
    Process: 47594 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS)
   Main PID: 46455 (apache2)
      Tasks: 55 (limit: 1141)
     Memory: 12.5M
        CPU: 1.008s
     CGroup: /system.slice/apache2.service
             ├─46455 /usr/sbin/apache2 -k start
             ├─47598 /usr/sbin/apache2 -k start
             └─47599 /usr/sbin/apache2 -k start

Feb 23 18:37:43 instance-20240221-193932 systemd[1]: Starting apache2.service - The Apache HTTP Server...
Feb 23 18:37:43 instance-20240221-193932 systemd[1]: Started apache2.service - The Apache HTTP Server.
Feb 23 20:56:01 instance-20240221-193932 systemd[1]: Reloading apache2.service - The Apache HTTP Server...
Feb 23 20:56:01 instance-20240221-193932 systemd[1]: Reloaded apache2.service - The Apache HTTP Server.
Feb 23 21:02:15 instance-20240221-193932 systemd[1]: Reloading apache2.service - The Apache HTTP Server...
Feb 23 21:02:15 instance-20240221-193932 systemd[1]: Reloaded apache2.service - The Apache HTTP Server.
shivajay295@instance-20240221-193932:/etc/apache2/sites-available$ 

sudo /usr/sbin/apache2ctl -S

shivajay295@instance-20240221-193932:/etc/apache2/sites-available$ sudo /usr/sbin/apache2ctl -S
VirtualHost configuration:
*:443                  forge-code.com (/etc/apache2/sites-enabled/000-default-le-ssl.conf:2)
*:80                   forge-code.com (/etc/apache2/sites-enabled/000-default.conf:1)
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex watchdog-callback: using_defaults
Mutex rewrite-map: using_defaults
Mutex ssl-stapling-refresh: using_defaults
Mutex ssl-stapling: using_defaults
Mutex proxy: using_defaults
Mutex ssl-cache: using_defaults
Mutex default: dir = "/var/run/apache2/" mechanism=default 
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name = "www-data" id=33
Group: name = "www-data" id=33
shivajay295@instance-20240221-193932:/etc/apache2/sites-available$ 

Дополнительная информация:

Я использую Ubuntu в своем экземпляре Google Cloud. Я проверил, что у меня есть разрешения на чтение сертификата SSL и файлов ключей. Я не понимаю, почему мое приложение FastAPI не обслуживается через forge-code.com. Что мне нужно сделать, чтобы успешно обслуживать мое приложение FastAPI с помощью HTTPS на сайте forge-code.com?

Вы перезагрузили или перезапустили Apache после смены виртуального хоста? В вашей конфигурации нет записей для обслуживания индексного файла Apache по умолчанию.

John Hanley 23.02.2024 21:18

@JohnHanley Я перезагружал несколько раз. Все еще не работает. sudo systemctl перезапустить apache2

shivank anchal 23.02.2024 21:22

Что показывает systemctl status apache2? Также apache2ctl -S. Отредактируйте свой вопрос и покажите эти команды и результаты.

John Hanley 23.02.2024 21:23

@JohnHanley Внесены изменения

shivank anchal 23.02.2024 21:36

У вас включено пять виртуальных хостов. Отключите все виртуальные хосты. Затем настройте один файл конфигурации виртуального хоста для порта 80, а другой — для порта 443, а также конфигурацию SSL. У вас есть 443, настроенный в 000-default.conf, который должен находиться в 000-default-le-ssl.conf. Как только вы это сделаете, обновите свой вопрос, включите оба файла conf и обновите выходные данные команды.

John Hanley 23.02.2024 21:48

@JohnHanley Я внес изменения

shivank anchal 24.02.2024 06:20
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
6
202
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Развертывание приложения FastAPI в домене с помощью Apache и SSL:

1. Покупка домена и настройка DNS:

Приобретение домена. Приобретите доменное имя (например, forge-code.com) у авторитетного регистратора доменов. Точечные записи DNS. В настройках DNS вашего домена создайте запись A, которая сопоставит ваш домен с IP-адресом вашего экземпляра GCP:

Type: A

Name: @ (or leave blank)

Value: 34.131.190.233 (replace with your instance's IP)

TTL: 14400 (or a suitable value)

2. Установка SSL-сертификата:

Получите сертификат: используйте Certbot, чтобы получить бесплатный сертификат SSL от Let's Encrypt:

sudo apt install certbot python3-certbot-apache
sudo certbot --apache -d forge-code.com

3. Конфигурация Apache:

Редактирование виртуальных хостов. Измените следующие файлы в /etc/apache2/sites-available:

000-default-le-ssl.conf (для HTTPS): Убедитесь, что SSLEngine включен.

Установите имя_сервера в свой домен.

Включите сертификат SSL и файлы ключей.

ProxyPass и ProxyPassReverse используют порт вашего приложения FastAPI (8000).

Вот мой файл конфигурации

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        ProxyPass / http://0.0.0.0:8000/
        ProxyPassReverse / http://0.0.0.0:8000/
        SSLEngine on
        ServerName forge-code.com
        Include /etc/letsencrypt/options-ssl-apache.conf
        SSLCertificateFile /etc/letsencrypt/live/forge-code.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/forge-code.com/privkey.pem
</VirtualHost>

</IfModule>

000-default.conf (для HTTP): Перенаправьте все HTTP-запросы на HTTPS с помощью RewriteRule.

Вот мой файл конфигурации

  GNU nano 7.2                                                                                                000-default.conf                                                                                                          
<VirtualHost *:80>
    ServerName forge-code.com

    # Enable proxy modules
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / http://0.0.0.0:8000/
    ProxyPassReverse / http://0.0.0.0:8000/

    # Rewrite rule to redirect HTTP to HTTPS
    RewriteEngine on
    RewriteCond %{SERVER_NAME} =forge-code.com
    SetEnv proxy-initial-not-pooled 1
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

4. Перезапуск Apache:

Перезагрузить конфигурацию: sudo systemctl restart apache2

5. Запуск приложения FastAPI:

Запустите приложение FastAPI: venv/bin/uvicorn app:app --host 0.0.0.0 --port 8000

Дополнительные соображения:

Правила брандмауэра: убедитесь, что ваш брандмауэр разрешает трафик через порты 80 и 443.

Конфигурация приложения FastAPI: убедитесь, что ваше приложение FastAPI настроено на прослушивание порта 8000.

Устранение неполадок: используйте журналы Apache (/var/log/apache2/error.log) для устранения любых проблем.

Управление процессами. Рассмотрите возможность использования диспетчера процессов, такого как systemd или supervisord, чтобы ваше приложение FastAPI работало в фоновом режиме. Альтернативный прокси. Если у Apache возникнут проблемы, изучите Nginx или HAProxy в качестве альтернативных прокси-решений.

Ключевые моменты:

Конфигурация домена. Точные настройки DNS имеют решающее значение для направления трафика на ваш сервер.

Сертификаты SSL. Для безопасной связи по протоколу HTTPS требуются действительные сертификаты SSL.

Конфигурация Apache. Правильная конфигурация позволяет Apache пересылать запросы к вашему приложению FastAPI и обрабатывать SSL.

Запуск приложения FastAPI: убедитесь, что ваше приложение работает и прослушивает правильный порт.

Устранение неполадок. Файлы журналов и управление процессами необходимы для выявления и решения проблем.

И Бинго, ваше приложение fastapi работает на вашем домене!!!

Другие вопросы по теме

ValueError: неизвестная схема для URL-адреса прокси-сервера ('socks://127.0.0.1:7890/')
Запуск Vite с прокси-сервером возвращает ошибку 500
Как изменить объект события перед выполнением функции обратного вызова события DOM
Как я могу отправить запрос Ext JS AJAX через прокси-сервер и использовать пользовательский ридер для извлечения данных?
Попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время - весенняя безопасность, веб-клиент
Код Visual Studio: OSError: URL-адрес прокси-сервера не имеет схемы, должен начинаться с http:// или https://
В ExtJs 6.0 с использованием прокси-сервера Rest не удается получить правильный идентификатор для ввода URL-адреса Httl
Использование Firebase .net Admin Sdk с прокси-сервером для отправки push-уведомлений
Как полностью удалить настройки прокси-сервера Docker?
Как правильно проксировать через SSH