uvicorn 的 unix 套接字上的 Nginx 反向代理不起作用
Nginx reverse proxy on unix socket for uvicorn not working
文件:
# 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 Bad Gateway
- uvicorn:响应
WARNING: Invalid HTTP request received.
因此建立了连接,但配置有问题。
有什么想法吗?
您正在使用 nginx 的 uwsgi
模块。 Uvicorn 暴露了一个 asgi
API。因此,您应该使用 "reverse proxy" 配置而不是 uwsgi
配置。
您可以获得有关 uvicorn 文档的更多信息:https://www.uvicorn.org/deployment/#running-behind-nginx(参见 proxy_pass
行)
文件:
# 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 Bad Gateway
- uvicorn:响应
WARNING: Invalid HTTP request received.
因此建立了连接,但配置有问题。
有什么想法吗?
您正在使用 nginx 的 uwsgi
模块。 Uvicorn 暴露了一个 asgi
API。因此,您应该使用 "reverse proxy" 配置而不是 uwsgi
配置。
您可以获得有关 uvicorn 文档的更多信息:https://www.uvicorn.org/deployment/#running-behind-nginx(参见 proxy_pass
行)