Вопрос или проблема
У меня есть минимальное приложение 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>
Порядок действий
-
Измените конфигурацию Apache: Замените строки
ProxyPass
иProxyPassReverse
в вашем файле конфигурации Apache, как указано выше. Обратите внимание наhttp://unix:/
, что является корректным синтаксисом для указания сокета. -
Проверьте разрешения и владельца сокета: Убедитесь, что сокет
/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
-
Перезапустите Gunicorn и Apache: После изменения конфигурации необходимо перезапустить оба сервиса:
sudo systemctl restart gunicorn sudo systemctl restart apache2
-
Проверьте логи: Если после этих изменений всё ещё возникает ошибка, проверьте логи Apache (
/var/log/apache2/error.log
) и Gunicorn, чтобы получить больше информации о проблеме.
Заключение
Сделав вышеуказанные изменения, вы должны устранить ошибку 503 и успешно развернуть ваше Django-приложение с использованием Gunicorn и Apache2. Если вы продолжаете сталкиваться с проблемами, не стесняйтесь фиксировать и анализировать ошибки из логов, так как они могут дать больше понимания о том, что может идти не так.