部署Starlette应用
Uvicorn是一个实现了ASGI的轻型负载服务,在配合Starlette使用时,有两种启动方法。
- 命令行启动,格式为
uvicorn app
,其中app
表示可以启动应用的变量或者类,其书写格式为文件名:变量名
或者文件名:类名
。 - 程序式启动,使用
uvicorn.run(app, host, port, log_level)
,其中app
依旧为可以启动应用的变量或者类。
在实际项目部署中,Uvicorn经常会搭配Gunicorn来使用。Gunicorn是一个进程管理器,可以在uvicorn出现异常时或者组成集群簇时进行管理。搭配Gunicron时经常使用以下命令。
gunicorn app:App -w 4 -k uvicorn.workers.UvicornWorker
Gunicorn也可以使用pip安装。常用的命令行选项有以下这些。
-c CONFIG
或者--config=CONFIG
,指定配置文件,可以使用以下格式:${PATH}
;file:${PATH}
;python:${MODULE_NAME}
。
-b BIND
或者--bind=BIND
,指定监听的套接字,可以使用以下格式:${HOST}
;${HOST}:${PORT}
;unix:${PATH}
。
-w WORKERS
或者--workers=WORKERS
,设定工作进程数量,每CPU核心可支持2-4个工作进程。-k WORKER_CLASS
或者--worker-class=WORKER_CLASS
,设定工作进程类型以及实现。-n APP_NAME
或者--name=APP_NAME
,设定进程名称。
Gunicorn可以搭配Nginx使用,这里给出一个示范性的Nginx配置,其中省略了大部分配置内容,仅保留了与Gunicorn有关的部分,具体其中各项配置的含义可参考下一章。
http {
upstream app_server {
# 当使用UNIX域套接字时,即绑定到unix:${PATH}时
server unix:/tmp/gunicorn.sock fall_timeout=0;
# 当使用TCP配置时
server 127.0.0.1:8000 fall_timeout=0;
}
server {
location / {
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_redirect off;
# 如果需要使用流或者WebSocket,需要将缓冲关闭
proxy_buffering off;
proxy_pass http://app_server;
}
}
}