Server error 500 gunicorn

Hello, guys. Don't know what's wrong. I am using default digital ocean setup. I've used it a lot of times by now. But this time I needed to implement post request from my client mobile ...

Hello, guys. Don’t know what’s wrong.
I am using default digital ocean setup. I’ve used it a lot of times by now. But this time I needed to implement post request from my client mobile app. I’ve installed cors-headers app for django and tested my app locally for a long time, everything was great (btw my mobile app is written on ionic framework and uses angularjs to post). On server everything was also ok with following commands:
python manage.py runserver 9000
and (!!!)
gunicorn config.wsgi —bind 127.0.0.1:9000
By ok I mean post requests were handled as they should be.
But when I run gunicorn as a service (sudo service gunicorn restart) on every post request from my mobile app I get 500 internal server error. And this is just after everything was ok not in service mode. What’s so different in service mode so it doesn’t allow my post requests to reach server?
Again: the difference is only service / not service mode of gunicorn. (but of cource service mode has it’s config while «working» gunicorn is just «gunicorn config.wsgi —bind 127.0.0.1:9000»)

Also I need to say that the website is running fine even in service mode. So the problem is only with this cross-domain post requests.

Errors examples (gunicorn as a service):

178.140.183.40 - - [29/Jun/2015:22:07:10 -0400] "POST /create_o_action/ HTTP/1.1" 500 58581 "-" "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.121 Mobile Safari/537.36"
178.140.183.40 - - [29/Jun/2015:22:07:10 -0400] "POST /create_o_action/ HTTP/1.1" 500 58595 "-" "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.121 Mobile Safari/537.36"

Success examples (gunicorn config.wsgi —bind 127.0.0.1:9000 ):

178.140.183.40 - - [29/Jun/2015:22:25:58 -0400] "POST /create_o_action/ HTTP/1.1" 200 32 "-" "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.121 Mobile Safari/537.36"
178.140.183.40 - - [29/Jun/2015:22:25:58 -0400] "POST /create_c_action/ HTTP/1.1" 200 34 "-" "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.121 Mobile Safari/537.36"

My gunicorn settings (more or less default digital ocean):

/etc/init/gunicorn.conf

description "Gunicorn daemon for Django project"

start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]

# If the process quits unexpectadly trigger a respawn
respawn

setuid django
setgid django
chdir /home/django/counter_platform_django

exec gunicorn 
    --name=webapp 
    --pythonpath=webapp 
    --bind=127.0.0.1:9000 
    --config /etc/gunicorn.d/gunicorn.py 
    config.wsgi:application

/etc/gunicorn.d/gunicorn.py

"""gunicorn WSGI server configuration."""
from multiprocessing import cpu_count
from os import environ


def max_workers():
    return cpu_count() * 2 + 1

max_requests = 1000
worker_class = 'gevent'
workers = max_workers()

So what’s exactly different in two ways of running gunicorn? I’m really curious. Of course there is —daemon (which btw also works fine), but solution will be better.
Also I found a lot of questions on the internet (all without answers) about problems with post requests and gunicorn in service mode. If we will find solution — some of them also can be answered.

У меня есть приложение Django, работающее на сервере- пулемете, с фронтом nginx. Мне нужно диагностировать сбой производительности с результатом HTTP 500, но файлы журнала ошибок не содержат информации, которую я ожидал бы. Thusly:

  • у пушки есть установка errorlog = "/somepath/gunicorn-errors.log"
  • nginx имеет параметр error_log/somepath/nginx-errors.log;
  • Мое приложение имеет InternalErrorView dispatch которого делает безусловное raise Exception("Just for testing.") Это представление сопоставляется с URL /fail_now
  • Я не модифицировал handler500
  • Когда я запускаю свое приложение с DEBUG=True и имею свой запрос браузера /fail_now, я вижу обычный экран ошибок Django, в том числе "Just for testing." сообщение. Хорошо.
  • Когда я запускаю свое приложение с DEBUG=False, я получаю ответ, состоящий всего из <h1>Server Error (500)</h1>, как и ожидалось. Хорошо.
  • Однако, когда я смотрю в gunicorn-errors.log, запись для этого события HTTP 500 вообще отсутствует. Зачем? Как я могу его получить? Я хотел бы получить трассировку.
  • Аналогично, в nginx-errors.log: нет следа 500 или URL /fail_now. Зачем?

Бонусный вопрос: когда я сравниваю это с моей исходной проблемой производства, я получаю другой ответ: 9-строчный документ с <h1><p>Internal Server Error</p></h1> в качестве центрального сообщения. Зачем?

Бонусный вопрос 2: когда я копирую содержимое своей базы данных на мой промежуточный сервер (который идентичен по конфигурации на производственном сервере) и устанавливает DEBUG=True в Django, /fail_now работает так, как ожидалось, но моя исходная проблема все еще отображается как <h1><p>Internal Server Error</p></h1>. WTF?

24 авг. 2016, в 11:48

Поделиться

Источник

2 ответа

Хорошо, это заняло много времени, но я нашел все:

  • Ответ <h1>Server Error (500)</h1> поступает из django.views.defaults.server_error Django (если нет шаблона 500.html).
  • <h1><p>Internal Server Error</p></h1> из бонусного вопроса исходит от gunicorn gunicorn.workers.base.handle_error.
  • nginx регистрирует ошибку 500 в файле журнала доступа, а не файл журнала ошибок; по-видимому, потому, что это был не сам nginx, который потерпел неудачу.
  • Для /fail_now, gunicorn также зарегистрирует проблему в журнале доступа, а не в журнале ошибок; опять же предположительно потому, что увольнитель как таковой не провалился, только приложение имеет.
  • Моя первоначальная проблема действительно появилась в журнале ошибок стрельбы, но я никогда не искал ее там, потому что я впервые представил файл журнала (раньше я использовал вывод logs Docker, что довольно сложно), и предположил, что это будет лучше использовать очень явный InternalErrorView для начальной отладки. (Это была идея, которая была неправильной по-интересному).
  • Однако моя фактическая ошибка программирования включала отправку ответа с заголовком Content-Disposition (сгенерированным в коде Django) следующим образом: attachment; filename="dag-wönnegården.pdf" attachment; filename="dag-wönnegården.pdf". Особые персонажи, по-видимому, способны заставить споткнуться, когда он обрабатывает этот ответ.

Написание этого вопроса помогло мне значительно диагностировать эту ситуацию. Теперь, если этот ответ помогает кому-то другому, магия StackOverflow снова работает.

Lutz Prechelt
24 авг. 2016, в 15:58

Поделиться

может быть ответ сервера 500 зарегистрирован в access_log не в errorlog

в файле nginx по умолчанию

access_log  /var/log/nginx/example.log;

я думаю <h1><p>Internal Server Error</p></h1> генерируется nginx в процессе производства ‘

в debug = False

raise исключение рассматривается как ошибка или http500, поэтому, если вы не изменили представление для handler500, будет отображаться страница с ошибкой по умолчанию 500

Исключение debug = true raise отображается на странице debug djnago debug

masternone
24 авг. 2016, в 13:24

Поделиться

Ещё вопросы

  • 1Сделайте так, чтобы текст появлялся сразу, но постепенно исчезал, используя современные CSS-переходы
  • 1Spring SAML учетные данные и учетные записи платформы
  • 1Передача нескольких значений на мой взгляд из mssql db
  • 0Неверное значение из DDX_CBIndex ()
  • 0Конфигурация NGINX: угловой SPA в корне и Slim REST API в подпапке
  • 1Мне нужно отредактировать текстовый файл с непостоянной структурой. Попытка использовать панд, это лучший инструмент для работы?
  • 0Как сделать так, чтобы два ползунка двигались в противоположном направлении [AngularJS]
  • 0MYSQL две таблицы сортировки TRICKY
  • 0угловая модель должна быть текстовой, а тип ввода должен быть временным
  • 1Добавить разбор функции в простой разбор с нечисловыми аргументами
  • 1Не удалось подключить поток во время выполнения Android
  • 0Отмените выделение выбранной области карты изображения при наведении на карту
  • 1Python — Как я могу сделать этот повторяющийся код короче, используя цикл?
  • 0Mysql сравнить два номера списка
  • 0SQL альтернатива левому соединению
  • 0Проблемы со ссылкой при разборе JSON
  • 0Как переписать url-encoded-base64 с помощью .htaccess
  • 1Почему вывод на консоль приходит как функция?
  • 0Изменение текста после фотографии с помощью jquery
  • 0Сервер WAMP не позволяет загружать файлы (PHP application)
  • 0Как получить имя файла, который загружен во вложении, используя php
  • 1Получение представления даты в секундах в Java
  • 0jQuery недооценивает ширину и высоту некоторых элементов на странице
  • 0Что происходит, если функция нового обработчика не написана должным образом или не может освободить больше памяти в c ++
  • 0Почему эта функция, которая принимает параметр шаблона шаблона, не компилируется?
  • 0Настройте mysimpleads с помощью CakePHP
  • 0Липкий заголовок стола со 100% -й высотой «панелей»
  • 0скрыть всех учеников, которые не являются потомками элемента (this)?
  • 1Могу ли я загрузить код Python в Python и проанализировать его как обычные строки кода?
  • 1проблема minsdk в андроиде
  • 1Извлечь имя в текстовом файле между (: или, или;) и (ключевым словом) с помощью регулярного выражения в python
  • 1Как передать объект JSON в качестве параметра с URL?
  • 1Как разбить большой текстовый файл на основе регулярных выражений с помощью Python
  • 1Как отфильтровать кадр данных Pandas в python на основе сравнения значений столбцов?
  • 0«динамические» изображения перекрываются, а не смещаются по горизонтали
  • 0MYSQL LEFT JOIN 3 таблицы (1-я таблица возвращает пустые значения)
  • 0PHP: как заполнять элементы HTML на основе атрибута родительского класса
  • 0Разумный способ вызова boost :: python :: call?
  • 1Помогает с появлением спрайта, столкновением спрайта и отображением очков
  • 0Цикл по полям с помощью jQuery Validation
  • 1Открытый плагин NetBeans и OpenOffice
  • 0Тексты не выравниваются по центру
  • 1Копирование листа в Smartsheet с использованием Python API
  • 0Соотношение сторон мобильного сайта jQuery изменилось после переноса сайта
  • 1Android, как показать другой вид поверх существующего ListView после того, как флажок установлен
  • 1XmlSerializer не может десериализовать XML, содержащий зашифрованную строку
  • 0Как показать или скрыть вкладку на основе URL страницы
  • 0Сброс цикла HTML <audio> с помощью .keyup () в jquery
  • 0Найти вложенные divs scrapy
  • 0Рост таблицы тд высота динамически в зависимости от информации на столе

Сообщество Overcoder

Сервер выдает ошибку 500 только по одной ветке в urls.py, остальные работают

settings.py

import os
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
DEBUG = False
ALLOWED_HOSTS = ['194.67.97.123', 'ilya-shevelev.ru', 'www.ilya-shevelev.ru']
INSTALLED_APPS = [
    'daphne',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.messages',
    'django.contrib.sites',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.staticfiles',
    # -----------------------
    'channels',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    # -----------------------
    'chat.apps.ChatConfig',
    'accounts.apps.AccountsConfig',
]
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'django_project.urls'
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
WSGI_APPLICATION = 'django_project.wsgi.application'
ASGI_APPLICATION = 'django_project.wsgi.application'
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'ion_db',
        'USER': 'django',
        'PASSWORD': '********',
        'HOST': 'localhost',
        'PORT': '',
    }
}
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]
LANGUAGE_CODE = 'ru'
TIME_ZONE = 'Europe/Moscow'
USE_I18N = True
USE_TZ = True
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
AUTH_USER_MODEL = "accounts.CustomUser"
AUTHENTICATION_BACKENDS = [
    # Needed to login by username in Django admin, regardless of `allauth`
    'django.contrib.auth.backends.ModelBackend',
    # `allauth` specific authentication methods, such as login by e-mail
    'allauth.account.auth_backends.AuthenticationBackend',
]
SITE_ID = 1
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [("127.0.0.1", 6379)],
        },
    },
}

nginx/sites-available/ion

server {
    server_name 194.67.97.123 ilya-shevelev.ru www.ilya-shevelev.ru;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/django/ion/src;
    }

     location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }

     location /ws/ {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_redirect off;
        proxy_pass http://127.0.0.1:8001;
    }




    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/ilya-shevelev.ru/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/ilya-shevelev.ru/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


}
server {
    if ($host = www.ilya-shevelev.ru) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = ilya-shevelev.ru) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    server_name 194.67.97.123 ilya-shevelev.ru www.ilya-shevelev.ru;
    listen 80;
    return 404; # managed by Certbot

systemd/system/gunicorn.service

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=django
Group=www-data
WorkingDirectory=/home/django/ion/src
ExecStart=/home/django/ion/venv/bin/gunicorn 
          --access-logfile - 
          --workers 3 
          --bind unix:/run/gunicorn.sock 
          django_project.wsgi:application

[Install]
WantedBy=multi-user.target

Вернуться на верх

Понравилась статья? Поделить с друзьями:
  • Service control manager 7001 windows 10 как исправить
  • Server error 43 бравл старс
  • Server error 43 brawl stars
  • Server error 429
  • Server error 403 forbidden you do not have permission to access this document