内容目录
最近使用自己编写的fastapi的脚手架开发了一个项目,下面分享部署fastapi的过程。
-
venv: Python创建虚拟环境的工具。
-
uvicorn: Python ASGI Web服务器。轻量级,不具备进程监控。
-
gunicorn: 用于UNIX的Python WSGI Web服务器。可以用来管理Uvicorn,充当进程管理器,Gunicorn的功能齐全且成熟。
本教程环境说明:操作系统 debian10; 项目 kaxiluo/fastapi-skeleton
安装python虚拟环境和项目依赖
# 创建python虚拟环境
python3 -m venv venv-fastapi-demo
# 进入虚拟环境
source ./venv-fastapi-demo/bin/activate
# 进入项目根目录
cd /path/to/fastapi-demo/
# 安装项目依赖
pip install -r requirements.txt
# 可能中途报错,提示缺少库或请升级pip
# 升级pip
python -m pip install --upgrade pip
# 安装依赖
apt install build-essential libssl-dev libffi-dev python3-dev
# 再次执行安装项目依赖命令
pip install -r requirements.txt
启动
- 方式一
使用uvicorn启动,一般用于开发环境
uvicorn main:app --host 0.0.0.0 --port 8080
- 方式二
安装gunicorn,并启动
pip install gunicorn
gunicorn main:app --workers 2 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8080
这些启动参数也可以用一个配置文件管理,了解更多功能参数请运行 gunicorn -h
- 方式三
以守护进程方式运行gunicorn
nohup gunicorn main:app --workers 2 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8080 > /dev/null &
# 或者
# 其实gunicorn提供了-D参数
gunicorn main:app -D --workers 2 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8080
停止服务和重启
首先找到gunicorn进程PID,然后通过信号量停止或重启服务
# 查看主进程ID
pstree -ap | grep gunicorn
停止
# 正常停止主进程及其子进程
kill -TERM pid
重启
kill -HUP pid
以上方式都不适合生产环境,下面是终极方案。
加入系统服务运行,配置nginx反向代理,设置开机启动
- 新建gunicorn服务文件
/etc/systemd/system/gunicorn.service
:
[Unit]
Description=gunicorn - python http server
After=network.target
[Service]
Type=forking
PIDFile=/var/run/gunicorn.pid
# 项目根目录
WorkingDirectory=/path/to/fastapi-demo
# gunicorn启动命令
ExecStart=/path/to/venv-fastapi-demo/bin/python3 /path/to/venv-fastapi-demo/bin/gunicorn main:app -D --pid /var/run/gunicorn.pid --workers 2 --worker-class uvicorn.workers.UvicornWorker --bind 127.0.0.1:8080
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
- 加载新的服务配置文件
systemctl daemon-reload
- 配置nginx反向代理
server {
listen 80;
server_name demo.fastapi.com;
rewrite ^(.*)$ https://$host$1 permanent;
}
server {
listen 443 ssl http2;
server_name demo.fastapi.com;;
# ...省略ssl部分...
charset utf-8;
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
location ~ /\.(?!well-known).* {
deny all;
}
access_log /var/log/nginx/access_fastapi-demo.log;
error_log /var/log/nginx/error_fastapi-demo.log error;
}
- 启动Gunicorn
service gunicorn start
# 查看服务状态
service gunicorn status
- 重启
# 平滑重启 主进程id不会变
service gunicorn reload
# 重启
service gunicorn restart
- 设置开机启动
systemctl enbale gunicorn
厉害