Python3+Gunicorn+Nginx 部署Flask项目

Python3+Gunicorn+Nginx 部署Flask项目,第1张

前言: 之前在本地测试项目的过程中一直使用python apppy的方式来启动项目,这种方式在本地测试的话还可以,但是在生产环境的话就不能使用这种方式。
原因:
1可能会出现无响应情况
2无法支持高并发和多线程
3无法合理利用服务器资源

生产环境: Centos7、Python3
需要模块: Gunicon、Nginx、Flask

一、安装Gunicorn
Gunicorn是一个高效的Web服务器,地位相当于Java中的Tomcat。简单来说gunicorn封装了>书接上文 flask与SQLAlchemy ,我们了解到

这一步的的测试可以看 一个小型的资源管理站
这里与直接上结果。

原flask使用的WSGI是python,但是很明显python作为>#!/usr/local/bin/python
# coding=utf-8
from flask import Flask
app = Flask(__name__)
@approute('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
apprun(host='0000',port=9000)
'''''
第4行,引入Flask类,Flask类实现了一个WSGI应用
第5行,app是Flask的实例,它接收包或者模块的名字作为参数,但一般都是传递__name__。
让flaskhelpersget_root_path函数通过传入这个名字确定程序的根目录,以便获得静态文件和模板文件的目录。
第7~9行,使用approute装饰器会将URL和执行的视图函数的关系保存到appurl_map属性上。
处理URL和视图函数的关系的程序就是路由,这里的视图函数就是hello_world。
第11行,使用这个判断可以保证当其他文件引用这个文件的时候(例如“from hello import app”)不会执行这个判断内的代码,也就是不会执行apprun函数。
第12行,执行apprun就可以启动服务了。默认Flask只监听虚拟机的本地127001这个地址,端口为5000。
而我们对虚拟机做的端口转发端口是9000,所以需要制定host和port参数,0000表示监听所有地址,这样就可以在本机访问了。
服务器启动后,会调用werkzeugservingrun_simple进入轮询,默认使用单进程单线程的werkzeugservingBaseWSGIServer处理请求,
实际上还是使用标准库Base>我们先写一个最基本的flask应用:
demopy
from flask import Flask
app = Flask(name)
@approute('\')
def index():
return 'Hello World'
if __name__ == __main__:
apprun()
运行这个py文件,打开浏览器访问127001:5000就能看到显示Hello World的页面
如果让这个flask引用监听来自公网ip的请求,理论上你跑此程序的机器就相当于一个服务器了,然而这个服务器并不完美,所以我们需要nginx和gunicorn来增加它的功能,让它真刀真q上生产环境的时候能按要求运行。
flask自带的WSGI框架性能很差劲,只能适用于开发环境调试使用。我们用专业一点的gunicorn(还有很多其他优秀的框架)替代flask自带的WSGI框架。
配置完后,通过命令’/usr/local/bin/gunicorn -b127001:5000‘启动应用。打开浏览器访问127001:5000,同样能够得到返回页面
然而gunicorn也仅仅是一个python的WSGI框架而已,要让它真正处理来自互联网的各类访问功能还是有点欠缺,这时候就需要用到大名鼎鼎的nginx 服务器来替gunicorn遮风挡雨了。
Ubuntu下安装nginx可以用命令
sudo apt-get install nginx
安装后需要进行下配置:
cd /etc/nginx/sites-available
sudo vi test (test为配置名称,可以根据自己项目进行命名)
test文件的配置为:
server {
listen 80; # 监听80端口
location / {
proxy_pass >当你在Ubuntu下使用nginx和uwsgi部署flask时,uwsgi服务器的默认配置可能会导致问题。uwsgi默认会创建一个主进程和一个或多个工作进程,而当nginx代理请求时,它可能会将请求发送到已经关闭的工作进程,导致超时错误。使用killall -s INT uwsgi命令杀掉uwsgi进程可以解决这个问题,因为这个命令会向uwsgi主进程发送SIGINT信号,通知它关闭所有工作进程。然后,当你再次启动uwsgi时,它会重新创建一组新的工作进程,这些工作进程应该都能够正常工作。
为了避免这种情况,你可以修改uwsgi的配置,使它只创建一个工作进程。这样,当nginx代理请求时,它就只会将请求发送到一个工作进程,而不会出现超时错误。你可以在uwsgi配置文件中添加processes = 1来实现这一目的。例如:
==============
[uwsgi]
socket = /tmp/uwsgisock
chdir = /path/to/your/app
wsgi-file = apppy
callable = app
processes = 1
==============
希望这些信息能够帮助你解决问题。

使用flask,那么我指定action发送给一个router,
from flask import Flask
app = Flask(__name__)
@approute('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
apprun()
把它保存成 hellopy (或者类似的文件),然后用 Python 解释器运行它。确保你的应用不叫做 flaskpy, 因为这会与 Flask 本身冲突。
$ python hellopy
Running on >

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zz/13504342.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-20
下一篇 2023-08-20

发表评论

登录后才能评论

评论列表(0条)

保存