web-dev-qa-db-ja.com

uvicornのUNIXソケットでのNginxリバースプロキシが機能しない

ファイル

# 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/

セットアップ

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

いつものようにuvicornを開始します

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

動作します-ブラウザから http://127.0.0.1/ にアクセスできます。

nginxの背後でuvicornを開始しています

$ 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.

私が今要求した場合 http://127.0.0.1/ そして:

  • Nginx:502 BadGatewayで応答します
  • uvicorn:WARNING: Invalid HTTP request received.で応答します

したがって、接続は確立されますが、構成に問題があります。

何か案は?

2
Raffael

Nginxのuwsgiモジュールを使用しています。 UvicornはasgiAPIを公開しています。したがって、uwsgi構成の代わりに「リバースプロキシ」構成を使用する必要があります。

Uvicornのドキュメントで詳細情報を入手できます: https://www.uvicorn.org/deployment/#running-behind-nginxproxy_pass行を参照)

5
Blusky