Nginx reverse proxy on unix socket for uvicorn not working

随声附和 提交于 2020-08-08 06:14:39

问题


Files:

# main.py:
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

-

# nginx.conf:
events {
    worker_connections 128;
}
http{
    server {
        listen 0.0.0.0:8080;
        location / {
            include uwsgi_params;
            uwsgi_pass unix:/tmp/uvi.sock;
        }
    }
}

-

# Dockerfile
FROM python:3

COPY main.py .

RUN apt-get -y update && apt-get install -y htop tmux vim nginx

RUN pip install fastapi uvicorn

COPY nginx.conf /etc/nginx/

Setup:

docker build -t nginx-uvicorn:latest .
docker run -it --entrypoint=/bin/bash --name nginx-uvicorn -p 80:8080 nginx-uvicorn:latest

Starting uvicorn as usual:

$ uvicorn --host 0.0.0.0 --port 8080 main:app

Works - I can access http://127.0.0.1/ from my browser.

Starting uvicorn behind nginx:

$ service nginx start
[ ok ] Starting nginx: nginx.

$ uvicorn main:app --uds /tmp/uvi.sock
INFO:     Started server process [40]
INFO:     Uvicorn running on unix socket /tmp/uvi.sock (Press CTRL+C to quit)
INFO:     Waiting for application startup.
INFO:     Application startup complete.

If I now request http://127.0.0.1/ then:

  • Nginx: Responds with 502 Bad Gateway
  • uvicorn: Responds with WARNING: Invalid HTTP request received.

Hence a connection is established but something is wrong about the configuration.

Any ideas?


回答1:


You are using the uwsgi module of nginx. Uvicorn exposes an asgi API. Therefore you should use a "reverse proxy" configuration instead of an uwsgi configuration.

You can get more info on the uvicorn documentation: https://www.uvicorn.org/deployment/#running-behind-nginx (see the proxy_pass line)



来源:https://stackoverflow.com/questions/59307024/nginx-reverse-proxy-on-unix-socket-for-uvicorn-not-working

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!