一、flask的自带web server
这是最简单的方式,用法:
from flask import Flask
app = Flask(appname)
if __name__ == '__main__':
app.run(host='0.0.0.0',port=8000,debug=True)
这语句是flask框架的初始化语句,也是框架webserver的启动语句,执行后,框架会自动监听指定的host和port,本例是监听所有来源IP对8000端口的请求,根据url作出回应
例如以上代码写在manage.py中
#python manage.py
此时访问浏览器http://localhost:8000就可以请求到项目了
二、uWSGI
uWSGI其实是现在python的专用cgi服务了,但是并不是说他仅仅能支持python项目。它类似php的php-fpm的作用,在python和前端代理(通常是nginx)之间建立起通讯的桥梁,由nginx接收请求,转发到uWSGI拉起的服务上,uWSGI启用python脚本解析器,解析对应代码执行后返回结果给nginx,最后呈现到用户面前。
安装
#pip install uwsgi
到项目根目录下创建uwsgi的配置文件uwsgi.xml
#vim uwsgi.xml
<uwsgi>
<pythonpath>[你的工程的根目录]</pythonpath>
<module>[模块名,就填flask的启动脚本名称,例如是manage.py此处就写manage]</module>
<callable>[启动flask服务的入口,找启动脚本里Flask对象赋给的变量名称,例如app]</callable>
<socket>0.0.0.0:8000</socket> #注: 指定某个固定端口,原本项目flask监听的是哪个host和port就写哪个
<processes>4</processes> #注:跑几个进程,这里用4个进程
<memory-report/>
</uwsgi>
配置nginx,修改nginx的配置文件
#vim nginx_vhost.conf
server {
listen 80;
server_name www.app.com; #写你的域名
location / {
include uwsgi_params;
uwsgi_pass 0.0.0.0:8000; #注:这里的端口8000和uwsgi的里配的是同一个端口,因为nginx和uwsgi需要通过这个端口进行交互
}
}
启动uswgi和重启nginx
#uwsgi -x uwsgi.xml
默认是前台运行,如果要后台运行,加一个-d参数
#uwsgi -d -x uwsgi.xml
#service nginx restart
现在打开浏览器,访问http://www.app.com:8000,就能看到你的项目了
二、Gunicorn
guincorn是一个支持wsgi协议的http server,它的出现是为了解决django、flask这些web框架自带wsgi server性能低下的问题。 用它来启动webserver非常简单,比uwsgi还要简单
#pip install guincorn
安装完其实就等于部署结束了,接下来只要打命令关联flask项目并启动guincorn就可以了
#gunicorn --chdir 项目根目录 --workers 10 --bind 0.0.0.0:8000 --user nobody --group nobody --worker-class gevent --threads 30 --timeout 30 manage:app
解释一下参数
chdir 启动时先切换到的目录
workers 启动工作进程的数量
bind 监听的host和port
user 工作进程用户
group 工作进程用户组
worker-class 工作模式,gevent是基于greenlet的网络库,greenlet是一个轻量级的协程库,总的来说,这个参数用gevent是比较好支持多线程的
threads 工作线程数量
timeout 请求超时时间
最后的manage:app,以冒号为分隔,分别表示flask启动脚本名称和启动脚本里Flask对象赋给的变量名称
现在打开浏览器,访问http://www.app.com:8000,就已经能看到你的项目了,这是gunicorn直接暴露给外网裸跑的最简单方式,如果没有什么性能要求,这样就可以了。
如果你的项目是大型项目,还是需要前端上一个nginx分流以下压力和负载均衡
#vim nginx_vhost.conf
server{
listen 80;
server_name www.app.com; #写你的域名
location / {
proxy_pass http://127.0.0.1:8000; # 这里是指向 gunicorn host 的服务地址
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
#service nginx restart
这样nginx就能转发请求到gunicorn了,另外为了减轻gunicorn压力,不需要把所有请求都转发,例如图片资源和静态文件的请求就可以在nginx中就路由到静态文件服务器上