前提:当前操作系统 ubuntu 20
1、在根目录要有 mian.py
2、main.py 里面要有 main方法,main方法里面有 如下:
import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)
3、安装 pip install gunicorn,在根目录创建gunicorn.py文件,
import os
# 设置守护进程
daemon=True
# 监听内网端口8000
bind='0.0.0.0:8000'
# 设置进程文件目录
pidfile='./gunicorn.pid'
chdir='./' # 工作目录
# 工作模式
worker_class='uvicorn.workers.UvicornWorker'
# 并行工作进程数 核心数*2+1个
workers=3 #multiprocessing.cpu_count()+1
# 指定每个工作者的线程数
threads=2
# 设置最大并发量
worker_connections = 2000
loglevel='debug' # 错误日志的日志级别
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"'
# 设置访问日志和错误信息日志路径
log_dir = "./log"
if not os.path.exists(log_dir):
os.makedirs(log_dir)
accesslog = "./log/gunicorn_access.log"
errorlog = "./log/gunicorn_error.log"
4、静默启动 fastapi:
gunicorn main:app -b 0.0.0.0:8000 -w 4 -k uvicorn.workers.UvicornWorker --daemon
5、停止 gunicorn 脚本:
#!/bin/bash
# 查找 gunicorn 主进程 PID
gunicorn_pid=$(ps aux | grep 'gunicorn' | grep -v 'grep' | awk '{print $2}')
# 如果找到了主进程 PID
if [ -n "$gunicorn_pid" ]; then
echo "Found gunicorn process: $gunicorn_pid"
# 给主进程发 SIGINT 信号,请求正常停止进程
kill -INT $gunicorn_pid
# 睡眠 5 秒等待主进程结束
sleep 5
# 杀死所有子进程
for single_pid in $gunicorn_child_pids; do
# 查找所有 gunicorn 子进程 PID
gunicorn_child_pids=$(pstree -p $single_pid | grep -oP '([0-9]+)(?=\))')
# 如果找到了子进程 PID
if [ -n "$gunicorn_child_pids" ]; then
echo "Found gunicorn child processes: $gunicorn_child_pids"
# 杀死所有子进程
for pid in $gunicorn_child_pids; do
kill -9 $pid
done
else
echo "No running gunicorn child process found:$gunicorn_child_pids"
fi
done
echo "Stopped gunicorn process and child processes"
else
echo "No running gunicorn process found"
fi
6、安装 nginx,配置/etc/nginx/nginx.conf 文件的 Nginx代理访问, listen的端口,
1> 我自测时候不能是80,访问接口的时候 会出现 404 问题,所以 我改成了 8001;
2> 这里的 proxy_pass 地址的端口要和 main方法中的 unicorn 的 端口保持一致
3> nginx 是通过 手动命令行安装的 :sudo apt-get install nginx
4> 如果通过 docker 安装nginx ,然后 启动 nginx ,会出现 404,conf文件中配置的端口是docker配置的端口都是80,不知道是不是这个影响的:
docker run -d -p 80:80 \
-p 443:443 \
--name nginx \
-v /home/python/html \
-v /home/python/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/python/conf/conf.d:/etc/nginx/conf.d \
-v /home/python/logs:/var/log/nginx \
Nginx镜像id
server {
listen 8001;
# listen 443 ssl;
server_name api.hmily.vip;
access_log /var/log/nginx/access.log;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $proxy_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
7、配置静态资源目录,配置 alias ,确保路径权限足够,上传目标文件到/usr/share/nginx/html , 访问 http://xxx:8001/resource 即可
server {
listen 8001;
# listen 443 ssl;
server_name api.hmily.vip;
access_log /var/log/nginx/access.log;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $proxy_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /resource {
alias /usr/share/nginx/html;
autoindex on;
}
}