#django #nginx #gunicorn
#django #nginx #gunicorn
Вопрос:
Я переношу свой веб-сайт с одного хоста на другой. Миграция была в основном успешной на 99%, за исключением того факта, что всякий раз, когда я перехожу на домашнюю страницу сайта, я получаю страницу 404 nginx. Все остальные страницы, статические и мультимедийные файлы отображаются правильно. Я ломал голову, пытаясь найти решение, но я не нашел ни одного, не говоря уже о том, что у кого-то есть подобная проблема (вместо этого у других есть рабочая домашняя страница, но 404 на всех остальных).
У меня есть два разных домена (один принадлежит моей компании, другой принадлежит городу, в котором мы находимся). Я обновил DNS в домене, которым я владею, чтобы убедиться, что он работает с новым хостом, и это так. Когда я перемещаюсь с помощью хоста (example.com ) или IP-адрес сервера, веб-сайт правильно загружает все страницы — кроме домашней страницы, которая — опять же — возвращает 404 nginx. Все остальные ошибки 404 отображают страницу 404, которую я настроил через Django.
Всякий раз, когда возникает эта проблема, журнал ошибок gunicorn добавляет строку, в которой указывается, что служба «Загружает рабочий с помощью pid: …»
nginx.conf —> сохранить пути и порт, этот conf идентичен conf, работающему на моем текущем хосте
http {
client_max_body_size 30M;
open_file_cache max=1000 inactive=300s;
open_file_cache_valid 360s;
open_file_cache_min_uses 2;
open_file_cache_errors off;
upstream cgac_server {
server unix:/root/cgac/cinema_backend/cinema_backend.sock fail_timeout=0;
}
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
server {
listen 80 default_server;
location /static/ {
expires 365d;
root /root/cgac/cinema_backend/static/;
}
location /media/ {
expires 365d;
root /root/cgac/cinema_backend/media/;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://cgac_server;
break;
}
}
}
gunicorn.service —> gunicorn настроен иначе, чем активный сервер, но параметры в этом файле идентичны, и он работает.
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=root
Group=www-data
WorkingDirectory=/root/cgac/cinema_backend
ExecStart=/root/cgac-venv/bin/gunicorn --access-logfile /root/logs/gunicorn-access.log --error-logfile /root/logs/gunicorn-error.log --workers 3 --bind unix:/root/cgac/cinema_backend/cinema_backend.sock cinema_backend.wsgi:application
[Install]
WantedBy=multi-user.target
Шаблоны URL-адресов Django -> также на 100% идентичны рабочему сайту
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)), # NOQA
url(r'^fobi/', include('fobi.urls.view')),
url(r'^fobi/', include('fobi.urls.edit')),
url(r'^captcha/', include('captcha.urls')),
url(r'^sitemap.xml$', 'django.contrib.sitemaps.views.sitemap',
{'sitemaps': {'cmspages': CMSSitemap}}),
url(r'^select2/', include('django_select2.urls')),
url(r'^', include('cms.urls')),
)
Комментарии:
1.
if (!-f $request_filename)
Для чего это нужно?2. @RichardSmith, насколько я понимаю (я на самом деле не кодировал это сам), он проверяет, существует ли файл, и, если он существует, он передает запрос на вышестоящий сервер, которым является gunicorn. Согласно общему ресурсу nginx common pitfalls , это не так, как это должно быть сделано. Как бы то ни было, если я перемещу строку proxy_pass за пределы if-инструкции, сайт все равно будет работать.
Ответ №1:
существует множество вариантов для его исправления
- поместите свой восходящий поток через http {}
- перезагрузите свой демон
- перезапустите ваш gunicorn.service
- ваш cinema_backend должен быть /run/cinema_backend.sock(что нормально)
- попробуйте использовать другую конфигурацию, например, site-availabe
Ответ №2:
Проблема не имела абсолютно никакого отношения к конфигурации nginx или gunicorn. Оказывается, изображение в карусели на домашней странице каким-то образом было повреждено или что-то в этом роде, и это сводило Django с ума. Я удалил запись в CMS, которая устранила проблему, затем приступил к повторной загрузке файла, и все хорошо.