- Вопрос или проблема
- Ответ или решение
- Решение проблем с настройкой Gunicorn + Nginx + Django
- Введение
- 1. Проверка работы Gunicorn
- 2. Убедитесь в правильности конфигурации Nginx
- 3. Логирование
- Логирование в Django
- Логирование Gunicorn
- 4. Проверка доступа к базе данных
- 5. Проверка прав доступа
- 6. Диагностика 404 ошибок
- Заключение
Вопрос или проблема
Я пытаюсь развернуть экземпляр readthedocs на своем сервере. Рекомендуемый способ развертывания — использовать Gunicorn + nginx с postgres. Поскольку фактически нет документации о том, как это сделать (кроме их fabfiles, которые, конечно, работают только на их сервере), я пытаюсь настроить свой собственный сервер вручную.
Вот мой nginx.conf
:
server {
listen 80 default;
server_name mysite.com;
access_log /var/log/nginx/mysite.access.log;
error_log /var/log/nginx/mysite.error.log;
location /favicon.ico {
root /home/mysite/Code/checkout/readthedocs.org/media/images;
break;
}
location robots.txt {
root /home/mysite/Code/checkout/readthedocs.org/media;
break;
}
location /static/ {
alias /home/mysite/Code/checkout/readthedocs.org/media/;
expires 30d;
break;
}
location /media/ {
alias /home/mysite/Code/checkout/readthedocs.org/media/;
expires 30d;
break;
}
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 10;
proxy_read_timeout 10;
proxy_pass http://127.0.0.1:8888;
}
}
Файл settings.py
для конфигурации django можно найти здесь. Единственное, что я изменил в settings.py
, это добавил gunicorn
в INSTALLED_APPS
, чтобы я мог запустить его.
Команда, которую я использую для запуска сервера gunicorn:
./manage.py run_gunicorn -b 127.0.0.1:8888
Затем, если я пытаюсь получить доступ к 127.0.0.1
из локального браузера, это работает, но всегда показывает страницу 404, независимо от того, какой URL я ввожу. Запуск ./manage.py runserver
работает корректно.
Теперь я не системный администратор и у меня практически 0 опыта с django, gunicorn или nginx раньше. Я искал в Google и экспериментировал с конфигурацией неделями, но без результатов. Мой вопрос:
- Как я могу узнать, какой маршрут django вызывается gunicorn? Могу ли я это отладить? Все файлы журналов, которые я могу найти, это не показывают.
- Вы видите что-то неправильное в моем конфигурационном файле? Если да, не могли бы вы сказать, что именно неправильно?
Большое спасибо.
Вы пробовали загрузить сайт на порту 8888, чтобы убедиться, что он работает правильно?
Сообщение 404, которое вы получаете, содержит nginx в тексте? Это означало бы, что nginx не может найти ресурс, а не служба на порту 8888. В этом случае вы можете устранить неполадки в вашем конфигурационном файле.
Вы ведете журнал доступа в nginx, так что вы можете посмотреть в ваш журнал для дополнительной информации. tail -n 10 /var/log/nginx/mysite.access.log
покажет вам последние 10 строк этого журнала.
По умолчанию nginx использует формат журнала combined:
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
Это должно помочь вам понять, что означает каждый столбец в вашем файле журнала.
Убедитесь, что вы правильно запускаете Gunicorn. Он должен запускаться из директории вашего проекта, и вы можете захотеть указать WSGI-приложение Django.
Пример:
gunicorn --bind 127.0.0.1:8888 myproject.wsgi:application
Замените myproject.wsgi:application на правильный путь импорта для вашего WSGI-приложения Django.
Отладьте маршруты и проверьте, какие представления вызываются; вы можете добавить журналирование в ваш проект Django, добавив это в ваш settings.py:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': '/path/to/your/logs/django_debug.log',
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'DEBUG',
'propagate': True,
},
},
}
Убедитесь, что путь к файлу журнала существует и записываемый.
Когда вы запускаете Gunicorn, вы можете направить его вывод в файл журнала, чтобы записать любые проблемы. Например:
gunicorn --bind 127.0.0.1:8888 myproject.wsgi:application --log-file /path/to/your/logs/gunicorn.log
Убедитесь, что ваши PostgreSQL настройки в settings.py правильные и что база данных доступна. Неправильные настройки базы данных могут вызвать проблемы, которые могут быть не сразу очевидны.
Убедитесь, что ваши статические и медиафайлы правильно собраны и обслуживаются. Запустите эти команды:
./manage.py collectstatic
./manage.py migrate
Подтвердите, что Nginx, Gunicorn и PostgreSQL работают без ошибок.
sudo systemctl status nginx
sudo systemctl status gunicorn
sudo systemctl status postgresql
Убедитесь, что процесс Nginx имеет права на чтение для директорий, где хранятся ваши статические и медиафайлы.
Теперь вы должны быть в состоянии определить причину ошибок 404 и подтвердить, что ваше развертывание настроено правильно.
Ответ или решение
Решение проблем с настройкой Gunicorn + Nginx + Django
Введение
Настройка Django-приложения с использованием Gunicorn в связке с Nginx и PostgreSQL может быть сложной задачей, особенно для тех, кто не имеет опыта в системном администрировании и разработке на Django. В этом ответе мы рассмотрим основные шаги, которые помогут вам отладить вашу установку и устранить ошибки 404, которые возникают при попытке доступа к вашему приложению.
1. Проверка работы Gunicorn
Первое, что нужно сделать, это убедиться, что Gunicorn работает корректно с вашим приложением. Попробуйте запустить Gunicorn следующим образом:
gunicorn --bind 127.0.0.1:8888 myproject.wsgi:application
Замените myproject.wsgi:application
на правильный путь импорта вашего WSGI приложения. Это важно, так как неправильная ссылка приведет к ошибке. Убедитесь, что вы вызываете Gunicorn из корневого каталога вашего проекта Django.
После запуска вы можете протестировать ваше приложение, открыв в браузере http://127.0.0.1:8888
. Если приложение работает корректно, это говорит о том, что проблем с Gunicorn нет.
2. Убедитесь в правильности конфигурации Nginx
Ваш файл конфигурации Nginx выглядит почти верно, но на всякий случай проверьте следующее:
- Убедитесь, что записи о статических файлах корректны и что файловая система имеет доступ к ним:
location /static/ {
alias /home/mysite/Code/checkout/readthedocs.org/media/; # Убедитесь, что файлы находятся в этом пути
}
- Проверьте, что ваши статические и медиа-файлы собраны (не забудьте выполнить
./manage.py collectstatic
).
3. Логирование
Отсутствие информации о причинах ошибок 404 может быть устранено путем настройки логирования как для Nginx, так и для Django.
Логирование в Django
Добавьте следующее в settings.py
вашего проекта для логирования на уровне DEBUG:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': '/path/to/your/logs/django_debug.log', # Убедитесь, что путь существует и доступен для записи
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'DEBUG',
'propagate': True,
},
},
}
Логирование Gunicorn
Запустите Gunicorn с указанием файла для логов, чтобы получить информацию об ошибках:
gunicorn --bind 127.0.0.1:8888 myproject.wsgi:application --log-file /path/to/your/logs/gunicorn.log
4. Проверка доступа к базе данных
Убедитесь, что настройки подключения к PostgreSQL в вашем settings.py
корректные. Проблемы с подключением к базе данных могут вызвать ошибки, которые не всегда очевидны. Попробуйте выполнить миграции:
./manage.py migrate
5. Проверка прав доступа
Убедитесь, что у службы Nginx есть необходимые права доступа к директориям, содержащим ваши статические и медиа-файлы.
6. Диагностика 404 ошибок
Для диагностики 404 ошибок проверьте логи Nginx, выполнив:
tail -n 10 /var/log/nginx/mysite.access.log
Убедитесь, что в этих логах нет сообщений об ошибках, которые могут указать на проблемы в конфигурации.
Заключение
Следуя приведенным шагам, вы сможете выявить и устранить проблемы, связанные с развертыванием вашего Django-приложения в связке с Gunicorn и Nginx. Убедитесь, что все сервисы запущены и правильно настроены. Если вы все еще сталкиваетесь с проблемами, могу помочь с чем-то конкретным.