Рейтинг:0

Отладка виртуального хоста Nginx в качестве обратного прокси-сервера для Uvicorn Python API

флаг in

У меня есть API (на основе Python, DRF), работающий как служба Uvicorn на порту 8002 на сервере Debian. Он работает без видимых проблем, так как, когда я делаю завиток http://127.0.0.1:8002/videos/, я получаю ожидаемый ответ API (я также без проблем протестировал его при развертывании на Heroku).

Мне нужно обслуживать его публично с помощью Nginx, поэтому я настроил новый виртуальный хост Nginx в качестве обратного прокси-сервера следующим образом:

 вверх по течению my_api {
     сервер 127.0.0.1:8002;
 }
 
 сервер {
 
     имя_сервера пример.com;
 
     место расположения / {
         # Переход к сервису веб-сервера Uvicorn/Gunicorn
         прокси_пасс http://my_api;
         proxy_set_header Хост $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header X-Forwarded-Proto $ схема;
     }

}

error_log /home/www/mydomain.log информация;

В браузере я получаю ошибку 400 Bad Request, независимо от того, включен ли он. http://example.com/videos/ или даже на http://example.com/ или же http://example.com/что угодно.

Когда я провожу /home/www/example.log Файл журнала виртуального хоста Nginx, я не получаю никакой соответствующей информации или журналов от других виртуальных хостов, например:

09.07.2021 12:05:49 [информация] 24698#24698: *233765 клиент 55.36.148.206 закрыто соединение с поддержкой активности
09.07.2021 12:06:12 [информация] 24698#24698: *233772 клиент 217.244.66.202 закрыто соединение проверки активности
09.07.2021 12:06:13 [информация] 24698#24698: *233775 клиент закрыл соединение в ожидании запроса, клиент: 63.210.40.102, сервер: 0.0.0.0:80

(Примечание: уникальная конечная точка работает для /ролики/ маршрут, но не для /ролики маршрут - это будет исправлено позже, но в любом случае это не должно мешать вопросу.)

Любая идея, как отлаживать/понимать, откуда эта ошибка 400?

Michael Hampton avatar
флаг cz
Проверьте журналы приложений.
флаг in
Разве файл /home/www/example.log, настроенный на виртуальном хосте, не заменяет журнал приложений?
Michael Hampton avatar
флаг cz
Вы должны надеяться, что нет! Как еще вы сможете отлаживать свое приложение, если вы не ведете журнал?
флаг in
Мой вопрос именно о регистрации. Как уже говорилось, я настроил виртуальный хост для входа в /home/www/example.log, но в журнале ничего не появляется о 400. Я не уверен, что понимаю вашу точку зрения.
Michael Hampton avatar
флаг cz
Кажется, вы путаете журналы nginx с журналами вашего приложения. Это отдельные и отличные друг от друга.
флаг in
О, извините, я думал, вы имеете в виду другой журнал приложений Nginx, а не мое приложение API, обслуживаемое Uvicorn. Попался. Так что на самом деле я предполагал, что ошибка исходит не от приложения, так как я могу его успешно свернуть, и поскольку я (ошибочно) предполагал, что 400 были сгенерированы Nginx, но вы правы, ошибка на стороне приложения. Спасибо
Рейтинг:0
флаг in

Благодаря замечаниям Майкла Хэмптона оказалось, что 400 ошибок были не на стороне Nginx, а на стороне приложения Python, обслуживаемого Gunicorn/Uvicorn, хотя curl работал локально.

Таким образом, для отладки просто нужно было показать журналы Gunicorn, запустив его вручную с включенными журналами отладки, следующим образом:

gunicorn -k uvicorn.workers.UvicornWorker --bind "0.0.0.0:8002" --отладка на уровне журнала my_api.asgi:application

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.