最近很多事,很长时间没有发表文章了。

今天有空,写篇文章。

买了一台服务器,天翼云的1核2G,新用户一年几十块钱。

【吐槽一下,阿里云,腾讯云,这些也有新用户一年几十块钱的服务器【2核4G】,但是我是老用户了,买不了,歧视老用户,天翼云服务器个垃圾,80、8080、443端口需要备案才能访问,废了我老大的劲,一度怀疑人生,草】

服务器是买的centos7

登录服务器,

第一步:安装python3.9注意:centos7默认有安装python2.7.5,安装好python3.9以后,添加软链接python3指向python3.9的bin目录的python,修改软链接python,也指向bin目录的python,python2这个软链接保持不变,

验证是否安装成功,并修改好软链接,如图:

fastapi操作MySQL 封装 fastapi部署到服务器上_服务器

本地项目生成requirements.txt文件pip freeze > requirements.txt

把项目文件夹内的文件、文件夹上传到服务器【注意:venv不要上传】

服务器项目文件夹下,安装requirements.txt依赖包:pip install -r requirements.txt

注意:linux下,安装依赖和windows下不同,windows有个文件夹venv,添加的依赖,都会放在这个文件夹下,而linux下,安装依赖的话,它直接会添加到python的安装目录下,例如我的python安装路径是/usr/local/python3,安装requirements.txt依赖包,它就会安装到/usr/local/python3/lib/python3.9/site-packages/目录下,

第二步:安装Mysql,网上很多教程,就不多说了

第三步:安装REDIS,网上很多教程,就不多说了

第四步:安装nginx,网上很多教程,就不多说了

第五步:安装gunicorn库(pip install gunicorn),gunicorn会自动安装到/usr/local/python3/lib/python3.9/site-packages/目录下,并添加一个gunicorn文件/usr/local/python3/bin目录下,该文件是gunicorn启动操作文件

编写gunicorn.conf.py文件

import multiprocessing

bind = '0.0.0.0:9088'#绑定fastapi的端口号
#workers = multiprocessing.cpu_count() * 2 + 1 #并行工作进程数
workers = 2 #并行工作进程数
worker_class = 'uvicron.workers.UvicornWorker' #还可以使用gevent模式,还可以使用sync模式,默认sync模式
threads = 1 #指定每个工作者的线程数
backlog = 2048 #监听队列
timeout = 120 #超过多少秒后工作将被杀掉,并重新启动。一般设置为30秒或更多
worker_connections = 1000 #设置最大并发量
daemon = False #默认False,设置守护进程,将进程交给supervisor管理
debug = True
loglevel = 'debug'
proc_name = 'main' #默认None,这会影响ps和top。如果要运行多个Gunicorn实例,需要设置一个名称来区分,这就要安装setproctitle模块。如果未安装
accesslog = './logs/access.log'
pidfile = './logs/gunicron.pid' #设置进程文件目录
errorlog = './logs/error.log'
#logger_class = 'gunicron.gologging.Logger'
preload_app = True #预加载资源
autorestart = True
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" " "%(a)s"' #设置gunicron访问日志格式,错误日志无法设置
#下面代码在安装了python,并pip install gunicorn的centos服务器中运行,可以用gunicorn启动main,实现接口访问
#gunicorn -c gunicorn.py main:app -k uvicorn.workers.UvicornWorker

注意:gunicorn.conf.py放在项目根目录下面,logs目录在根目录下面

第六步:配置nginx,    vim /etc/nginx/conf.d/9518.conf【我的配置文件存在这,诸君请自行对应自己的配置文件所在】

配置文件如下:

server {
        listen 9518;
        root /www/python;
        server_name xxx.xxx.xxx.xxx;
        location / {
            proxy_set_header x-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_pass http://localhost:9088/; # gunicorn绑定的fastapi的端口号
        }
        # 配置static的静态文件:
        location ~ ^\/static\/.*$ {
            root /www/python/static;
        }
}

大概意思是:listen监听9518端口,root指向项目目录,server_name设定服务器IP或者域名,location的proxy_set_header设定IP以及相关,proxy_pass转发给gunicorn绑定的fastapi使用的端口,注意:监听端口和转发绑定端口不能一样,

然后保存,重启nginx:nginx -s reload

第七步:进入网站项目根目录:cd /www/python【这个是我的项目目录,诸君请根据自己项目来】 

然后输入一下启动gunicorn,

【注意:pip install gunicorn,然后要找到gunicorn地址,使用find / -name gunicorn,【例如:我的gunicorn在/usr/local/python3/bin/目录下,因为我python安装目录是/usr/local/python3】添加软链接ln -s /gunicorn地址 /usr/bin/gunicorn】

gunicorn -c gunicorn.conf.py main:app -k uvicorn.workers.UvicornWorker

注意:main.py的端口要和gunicorn绑定的端口一样。

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=9088, reload=True, debug=True)

在linux服务器用gunicorn启动项目,如图:

fastapi操作MySQL 封装 fastapi部署到服务器上_python_02

最后测试:浏览器输入http://xxx.xxx.xxx.xxx:9518/docs测试访问,成功如下图:

fastapi操作MySQL 封装 fastapi部署到服务器上_python_03

 PS:查看gunicorn进程树:

pstree -ap|grep gunicorn

注意:pstree需要安装,centos安装pstree的命令是:

yum -y install psmisc

fastapi操作MySQL 封装 fastapi部署到服务器上_python_04

kill进程可结束gunicorn

执行:kill -9 gunicorn的pid【例如上面的例子:kill -9 8269】

PS2:可以通过nohup命令来守护进程

nohup gunicorn -c gunicorn.conf.py main:app -k uvicorn.workers.UvicornWorker

这样你就可以关闭连接服务器的终端,还能通过你的浏览器访问到你的fastapi应用了!

PS3:大文件上传

这个发布部署是通过nginx反向代理,转发fastapi端口,来实现的,

因为nginx默认最大上传文件是1M,所以需要修改,

把上面的nginx的配置文件,修改成如下:

server {
        listen 9518;
        root /www/python;
        server_name xxx.xxx.xxx.xxx;
        location / {
            proxy_set_header x-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header Range $http_range;
            proxy_set_header If-Range $http_if_range;
            proxy_pass http://127.0.0.1:9088/; # gunicorn绑定的端口号
            client_max_body_size   100m;#最大上传文件改成100M
            proxy_connect_timeout  1800s;#最大等待上传时间,改成30分钟
        }
        # 配置static的静态文件:
        location ~ ^\/static\/.*$ {
            root /www/python/static;
        }
}

注意:超大文件的话应分片上传,可参考我写的文章:


最新更新:2022-06-29

设置开机自启动

一、编写自启动脚本 vim /www/python/run_fastapi.sh

        注意:【英文注释不要删,否则会出毛病,我也不清楚啥原因】

#!/bin/bash
#chkconfig: 12345 90 10
#description: start topology service
cd /www/python;nohup gunicorn -c gunicorn.conf.py main:app -k uvicorn.workers.UvicornWorker
#上面命令意思是:转到/www/python目录,启动nohup守护gunicorn根据配置文件【gunicorn.conf.py】启动【main.py】使用uvicorn

二、复制文件到系统/etc/init.d目录下,并设置开机启动这个.sh文件:

cp /www/python/run_fastapi.sh /etc/init.d/run_fastapi.sh
cd /etc/init.d
chmod +x run_fastapi.sh
chkconfig --add run_fastapi.sh
chkconfig run_fastapi.sh on

三、重启验证