部署Starlette应用

Uvicorn是一个实现了ASGI的轻型负载服务,在配合Starlette使用时,有两种启动方法。

  1. 命令行启动,格式为uvicorn app,其中app表示可以启动应用的变量或者类,其书写格式为文件名:变量名或者文件名:类名
  2. 程序式启动,使用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;	
		}
	}
}