Apache в качестве обратного прокси не работает с gunicorn

Вопрос или проблема

Моя цель – позволить клиенту подключаться через https, но Apache обслуживает его запросы к моему приложению, которое работает на том же сервере через http. Вот мой минималистичный конфигурационный файл Apache (для входящих http-запросов я просто перенаправляю все запросы на https):

NameVirtualHost 1.2.3.4:443
NameVirtualHost 1.2.3.4:80

LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so

<VirtualHost 1.2.3.4:443>
  # Электронная почта администратора, имя сервера (доменное имя) и любые псевдонимы
  ServerAdmin [email protected]
  ServerName abc.com
  ServerAlias www.abc.com
  RequestReadTimeout header=90 body=90

  DocumentRoot /path/to/my/project
  LogLevel warn
  WSGIDaemonProcess abc_ssl processes=2 maximum-requests=500 threads=10
  WSGIProcessGroup abc_ssl
  WSGIScriptAlias / /path/to/my/project.wsgi
  WSGIApplicationGroup %{GLOBAL}

  SSLEngine on
  SSLCertificateFile /home/django/.ssh/abc.crt
  SSLCertificateKeyFile /home/django/.ssh/server.key
  SSLCertificateChainFile /home/django/.ssh/abc.ca-bundle

  RequestHeader set X-FORWARDED-SSL "on"
  RequestHeader set X-FORWARDED_PROTO "https"
  ProxyRequests off
  ProxyPreserveHost on

  <Location /stream/>
      Order Allow,Deny
      Allow from All
  </Location>

  ProxyPass /stream/ http://127.0.0.1:8001/
  ProxyPassReverse /stream/ http://127.0.0.1:8001/

</VirtualHost>

Очевидно, что gunicorn работает и слушает на http://127.0.0.1:8001/:

2013-08-31 05:05:51 [15025] [INFO] Starting gunicorn 0.17.2
2013-08-31 05:05:51 [15025] [INFO] Listening at: http://127.0.0.1:8001 (15025)
2013-08-31 05:05:51 [15025] [INFO] Using worker: eventlet
2013-08-31 05:05:51 [15044] [INFO] Booting worker with pid: 15044
2013-08-31 05:05:51 [15045] [INFO] Booting worker with pid: 15045
2013-08-31 05:05:51 [15046] [INFO] Booting worker with pid: 15046

Но в браузере я вижу только NetworkError: 404 NOT FOUND - https://abc.com/stream/. Пожалуйста, помогите, я застрял, буду очень признателен.

Ой! Это была глупая ошибка. ProxyPass и ProxyPassReverse должны быть:

ProxyPass /stream/ http://127.0.0.1:8001/stream/ #<-- здесь отсутствовал /stream/
ProxyPassReverse /stream/ http://127.0.0.1:8001/stream/

Ответ или решение

Проблема с обратным прокси Apache и Gunicorn: Решение

При настройке обратного прокси-сервера Apache для обработки запросов к приложению, работающему на Gunicorn, могут возникнуть различные проблемы. В вашем случае, вы столкнулись с ошибкой 404 NOT FOUND при попытке доступа к ресурсу по адресу https://abc.com/stream/. Поскольку вы уже нашли решение проблемы, давайте рассмотрим её более подробно и выделим важные моменты, которые могут быть полезны другим пользователям, сталкивающимся с аналогичными трудностями.

1. Контекст проблемы

Ваша цель заключалась в том, чтобы разрешить пользователям подключаться через HTTPS, в то время как ваше приложение работает на HTTP по адресу http://127.0.0.1:8001/. Вы указали совместимую конфигурацию Apache, и хотя Gunicorn успешно запускался и слушал на нужном порту, запросы не обрабатывались должным образом.

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

Ваша первоначальная конфигурация содержала следующие строки:

ProxyPass /stream/ http://127.0.0.1:8001/
ProxyPassReverse /stream/ http://127.0.0.1:8001/

Здесь вы пропустили добавление /stream/ к конечному URL в конфигурации ProxyPass и ProxyPassReverse. Этот параметр важен, так как он указывает Apache, куда точно направлять запросы.

3. Исправленная конфигурация

Корректная конфигурация должна выглядеть следующим образом:

ProxyPass /stream/ http://127.0.0.1:8001/stream/
ProxyPassReverse /stream/ http://127.0.0.1:8001/stream/

4. Как это работает

С вводом /stream/ вы говорите Apache, что все запросы, начинающиеся с /stream/, должны быть перенаправлены на тот же путь на вашем приложении, запущенном с помощью Gunicorn. Это является критически важным, поскольку без этого Gunicorn не будет знать, какой ресурс запрашивается. Запросы, не содержащие конкретного пути, будут обрабатываться неверно, что приведёт к ошибкам 404, как было в вашем случае.

5. Другие рекомендации

  • Проверка логов: В случае возникших проблем, всегда проверяйте логи Apache и Gunicorn. Они содержат информативные сообщения, которые могут помочь в диагностике. Логи Apache помогут понять, как обрабатываются запросы, а логи Gunicorn подскажут о любых ошибках в приложении.

  • SSL и заголовки: Убедитесь, что вы корректно настраиваете SSL и заголовки, передаваемые вашему приложению. Вы уже указали заголовки X-FORWARDED-SSL и X-FORWARDED-PROTO, что позволяет вашему приложению правильно обрабатывать протокол безопасности и возвращать корректные URL, но внимательно следите за их использованием в вашем коде.

  • Тестирование: Прежде чем делать окончательные изменения, тестируйте конфигурацию с использованием инструментов, таких как curl, чтобы убедиться в правильности ответов от вашего сервера.

Заключение

Настройка Apache в качестве обратного прокси для Gunicorn может быть достаточно сложной задачей, особенно при работе с HTTPS. Однако, правильно настроив конфигурацию и учитывая указанные выше моменты, можно эффективно обрабатывать запросы и избежать появления ошибок. Если возникнут дополнительные проблемы, не стесняйтесь обращаться к сообществу для получения поддержки.

Оцените материал
Добавить комментарий

Капча загружается...