当前位置: 首页 > 后端技术 > Python

nginx+gunicorn+fastapi部署后台自动启动

时间:2023-03-25 22:53:01 Python

方案后台系统版本:debian9环境搭配:python3虚拟环境+fastapi+uvicorn+gunicorn项目根目录:/data/wwwroot/domian.com官方文档为IP:PORT形式启动fastapi,但是每次都要进入虚拟环境通过命令启动gunicorn,很麻烦。后来改成systemd+gunicorn的方式后,gunicorn会开机自动启动,不占用端口。fastapi的具体部署写在另一篇文章中。本文只讲nginx+systemd+gunicorn的配置方法。大体计划是创建如下文件:/etc/systemd/system/gunicorn.service/etc/systemd/system/gunicorn.socketnginx的conf文件中,没有使用代理ip:prot形式,而是代理sock文件。具体步骤是在项目根目录下创建gunicorn的配置文件gconfig.py,内容为:#coding=utf-8#fromgeventimportmonkey#monkey.patch_all()#importmultiprocessingdebug=True#自动重启修改代码时reload=True#reload_engine='inotify'#//绑定端口与Nginx通信#bind='127.0.0.1:3002'bind='unix:/data/wwwroot/domian.com/tmp/gunicorn.sock'pidfile='log/gunicorn.pid'workers=4#进程数#workers=multiprocessing.cpu_count()*2+1#进程数worker_class='uvicorn.workers.UvicornWorker'#使用unicorn代替gunicorn附带的方式。Unicorn相关文档:http://www.uvicorn.org/deployment/#running-gunicorn-worker#loglevel#debug:debug级别,记录最多的信息;#信息:正常水平;#warning:警告信息;#错误:错误信息;#critical:严重错误信息;loglevel='debug'#访问日志路径accesslog='log/gunicorn_access.log'#错误日志路径errorlog='log/gunicorn_error.log'#设置gunicorn访问日志的格式,错误日志不可设置。看似无效的access_log_format='%(t)s%(p)s%(h)s"%(r)s"%(s)s%(L)s%(b)s%(f)s""%(a)s"'#执行命令#gunicorn-cgconfig.pymain:app#gunicorn-cgconfig.pymain:app-kuvicorn.workers.UvicornWorker'''使用supervisor自动执行https://docs.gunicorn.org/en/stable/deploy.html#supervisor参考资料:https://www.jianshu.com/p/bbd0b4cfcac9https://www.cnblogs.com/tk091/archive/2014/07/22/3859514.html'''/etc/systemd/system/gunicorn.service:[Unit]Description=gunicorndaemonRequires=gunicorn.socketAfter=network.target[Service]Type=notify#the我们的服务将运行的特定用户User=gunicornGroup=www#另一个更受限制的服务选项是#DynamicUser=yes#参见http://0pointer.net/blog/dynamic-users-with-systemd.htmlRuntimeDirectory=gunicorn#WorkingDirectory是项目路径目录WorkingDirectory=/data/wwwroot/domian.com#而不是手动执行命令,#gunicorn-cgconfig.pymain:app-kuvicorn.workers.UvicornWorker本来是要在虚拟环境中执行的#其中gunicorn和gconfig.py写全路径名ExecStart=/data/wwwroot/domain.com/venv/bin/gunicorn-c/data/wwwroot/domain.com/gconfig.pymain:app-kuvicorn.workers。UvicornWorkerExecReload=/bin/kill-sHUP$MAINPIDKillMode=mixedTimeoutStopSec=5PrivateTmp=true[Install]WantedBy=multi-user.target/etc/systemd/system/gunicorn.socket:[Unit]Description=gunicornsocket[Socket]#ListenStream写入要生成的sock文件的路径。写完整路径,我是放在项目根目录下的。ListenStream=/data/wwwroot/domian.com/tmp/gunicorn.sock#我们的服务不需要套接字权限,因为它#通过套接字激活继承文件描述符#只有nginx守护进程需要访问socketUser=www-data#可选的对socket权限进行更多的限制。#mode=600[Install]WantedBy=sockets.targetnginx的domian.conf,其他配置就不写了,主要是/proxy部分:location/{#放弃原来的ip端口形式,代理到sock文件#proxy_passhttp://127.0.0.1:3002;#unix后面的路径是前面文件中sock文件的完整路径,注意格式。proxy_passhttp://unix:/data/wwwroot/domian.com/tmp/gunicorn.sock;}运行命令重启nginx后,会自动生成domian_gunicorn.sock,然后打开域名确认fastapi应用是否正常启动:systemctlreloadnginx。servicesystemctlrestartnginx.servicebootandimmediatelystartgonicorn.socket:systemctlenablegunicorn.socket--now不同的操作命令:start:systemctlstartgunicorn.servicestatus:systemctlstatusgunicorn.servicestop:systemctlstopgunicorn.servicerestart:systemctlrestartgunicorn.service