Puncte:0

Depanați un vhost Nginx ca proxy invers pentru un API Uvicorn Python

drapel in

Am un API (Python, bazat pe DRF), care rulează ca serviciu Uvicorn pe portul 8002 pe un server Debian. Funcționează fără nicio problemă aparentă, de când fac eu curl http://127.0.0.1:8002/videos/, primesc răspunsul API așteptat (de asemenea, l-am testat când a fost implementat pe Heroku, fără nicio problemă).

Trebuie să îl servesc public cu Nginx, așa că am configurat un nou vhost Nginx ca proxy invers, după cum urmează:

 în amonte my_api {
     server 127.0.0.1:8002;
 }
 
 Server {
 
     nume_server example.com;
 
     Locație / {
         # Treceți la serviciul de server web Uvicorn/Gunicorn
         proxy_pass http://my_api;
         proxy_set_header Gazdă $gazdă;
         proxy_set_header X-Real-IP $adresă_la distanță;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header X-Forwarded-Proto $schema;
     }

}

error_log /home/www/mydomain.log info;

Pe browser, primesc o eroare 400 Bad Request, indiferent dacă este activată http://example.com/videos/ sau chiar pe http://example.com/ sau http://example.com/whatever.

Când îl urmăresc pe /home/www/example.log Fișierul jurnal Nginx vhost, nu primesc nicio informație relevantă sau jurnale de la alte vhost-uri, cum ar fi următoarele:

2021/07/09 12:05:49 [info] 24698#24698: *233765 client 55.36.148.206 conexiune keepalive închisă
2021/07/09 12:06:12 [info] 24698#24698: *233772 client 217.244.66.202 conexiune keepalive închisă
2021/07/09 12:06:13 [info] 24698#24698: *233775 client a închis conexiunea în așteptarea solicitării, client: 63.210.40.102, server: 0.0.0.0:80

(Notă: punctul final unic funcționează pentru /Videoclipuri/ traseu dar nu pentru /Videoclipuri ruta - aceasta va fi rezolvată mai târziu, dar oricum asta nu ar trebui să interfereze cu întrebarea.)

Aveți idee cum să depanați/înțelegeți de unde vine această eroare 400?

Michael Hampton avatar
drapel cz
Verificați jurnalele aplicației dvs.
drapel in
/home/www/example.log, așa cum este configurat în vhost, nu înlocuiește jurnalul aplicației?
Michael Hampton avatar
drapel cz
Ar trebui să speri că nu! Cum altfel ați putea să vă depanați aplicația dacă nu vă conectați?
drapel in
Întrebarea mea este tocmai despre logare. După cum sa menționat, am configurat vhost să se conecteze la /home/www/example.log, dar nu apare nimic în jurnal despre 400. Nu sunt sigur că am înțeles punctul dvs.
Michael Hampton avatar
drapel cz
Se pare că confundați jurnalele nginx cu jurnalele aplicației dvs. Acestea sunt separate și distincte.
drapel in
Îmi pare rău, am crezut că te referi la un alt jurnal al aplicației Nginx, nu la aplicația mea API deservită de Uvicorn. Am inteles. Deci, de fapt, am presupus că eroarea nu provine din aplicație, deoarece o pot curba cu succes și, din moment ce am presupus (în mod greșit) că 400 au fost generate de Nginx, dar aveți dreptate, eroarea este de partea aplicației. Mulțumiri
Puncte:0
drapel in

Datorită observațiilor lui Michael Hampton, s-a părut că cele 400 de erori nu erau de partea lui Nginx, ci de partea aplicației Python servită de Gunicorn/Uvicorn, chiar dacă curl-ul funcționa local.

Deci, trebuia doar să arate jurnalele Gunicorn pentru a-l depana, lansându-l manual cu jurnalele de depanare activate, astfel:

gunicorn -k uvicorn.workers.UvicornWorker --bind "0.0.0.0:8002" --log-level debug my_api.asgi:application

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.