Ошибка сокета Gunicorn при проксировании Apache2

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

У меня есть минимальное приложение django “hello world”, которое я хочу развернуть на своем сервере. Chatgpt посоветовал использовать Unix Domain Socket для лучшей производительности.
Мне удалось запустить службу gunicorn в tty screen с помощью:

gunicorn myproject.wsgi:application --bind unix:/var/run/myproject/gunicorn.sock --error-logfile /var/log/myproject/gunicorn.error.log

А вот и /etc/apache2/sites-enabled/myproject.conf

<VirtualHost *:80>
    ServerName myproject.mydomain.com
    DocumentRoot /var/www/myproject

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    ProxyPass / unix:/var/run/myproject/gunicorn.sock|fcgi://localhost/
    ProxyPassReverse / unix:/var/run/myproject/gunicorn.sock|fcgi://localhost/

</VirtualHost>

Но когда я обращаюсь к http://myproject.mydomain.com через браузер, я получаю ошибку 503.

Для отладки я установил права на сокет-файл как 777, изменил группу владельца файла на deployers (включающую ubuntu,www-data). Я также попробовал sudo -u www-data curl --unix-socket /var/run/myproject/gunicorn.sock http://localhost/ и получил ожидаемый ответ.

Вот мой лог ошибок apache.

[Sun Oct 06 15:07:19.512454 2024] [mpm_prefork:notice] [pid 160756] AH00163: Apache/2.4.52 (Ubuntu) OpenSSL/3.0.2 mod_wsgi/4.9.0 Python/3.10 настроен -- продолжаем нормальную работу
[Sun Oct 06 15:07:19.512479 2024] [core:notice] [pid 160756] AH00094: Командная строка: '/usr/sbin/apache2'
[Sun Oct 06 15:11:00.537321 2024] [proxy_fcgi:error] [pid 160759] [client 127.0.0.1:37940] AH01068: Получена неверная версия 72
[Sun Oct 06 15:11:00.537367 2024] [proxy_fcgi:error] [pid 160759] (22)Недопустимый аргумент: [client 127.0.0.1:37940] AH01075: Ошибка при обработке запроса к :

Вот мой лог ошибок gunicorn.

[2024-10-06 15:11:00 +0800] [161935] [INFO] Запуск рабочего процесса с pid: 161935

Gunicorn не поддерживает fastcgi. Вместо этого следует использовать http proxy.

Строки в конфигурации сайта apache должны быть

ProxyPass / unix:/var/run/myproject/gunicorn.sock|http://localhost/
ProxyPassReverse / unix:/var/run/myproject/gunicorn.sock|http://localhost/

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

Чтобы решить вашу проблему с развертыванием Django-приложения с использованием Gunicorn и Apache2, обратим внимание на несколько ключевых моментов, которые могут помочь устранить ошибку 503.

Проблема

Ошибка 503 Service Unavailable возникает из-за неправильной конфигурации Apache для взаимодействия с Gunicorn через сокеты. Судя по вашим логам, вы получаете ошибку Got bogus version 72, что указывает на то, что Apache пытается использовать механизм FastCGI, который не поддерживается Gunicorn.

Решение

Для правильной настройки вам необходимо использовать HTTP-прокси вместо FastCGI. Ваша конфигурация Apache должна выглядеть следующим образом:

<VirtualHost *:80>
    ServerName myproject.mydomain.com
    DocumentRoot /var/www/myproject

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    ProxyPass / http://unix:/var/run/myproject/gunicorn.sock|http://localhost/
    ProxyPassReverse / http://unix:/var/run/myproject/gunicorn.sock|http://localhost/
</VirtualHost>

Порядок действий

  1. Измените конфигурацию Apache: Замените строки ProxyPass и ProxyPassReverse в вашем файле конфигурации Apache, как указано выше. Обратите внимание на http://unix:/, что является корректным синтаксисом для указания сокета.

  2. Проверьте разрешения и владельца сокета: Убедитесь, что сокет /var/run/myproject/gunicorn.sock имеет правильные разрешения и владельца. Если сокет доступен для группы www-data, убедитесь, что как Apache, так и Gunicorn работают с этой группой:

    sudo chown www-data:deployers /var/run/myproject/gunicorn.sock
    sudo chmod 770 /var/run/myproject/gunicorn.sock
  3. Перезапустите Gunicorn и Apache: После изменения конфигурации необходимо перезапустить оба сервиса:

    sudo systemctl restart gunicorn
    sudo systemctl restart apache2
  4. Проверьте логи: Если после этих изменений всё ещё возникает ошибка, проверьте логи Apache (/var/log/apache2/error.log) и Gunicorn, чтобы получить больше информации о проблеме.

Заключение

Сделав вышеуказанные изменения, вы должны устранить ошибку 503 и успешно развернуть ваше Django-приложение с использованием Gunicorn и Apache2. Если вы продолжаете сталкиваться с проблемами, не стесняйтесь фиксировать и анализировать ошибки из логов, так как они могут дать больше понимания о том, что может идти не так.

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

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