Flask 部署和分发
到目前为止,启动Flask应用都是通过”app.run()”方法,在开发环境中,这样固然可行,不过到了生产环境上,势必需要采用一个健壮的,功能强大的Web应用服务器来处理各种复杂情形。同时,由于开发过程中,应用变化频繁,手动将每次改动部署到生产环境上很是繁琐,最好有一个自动化的工具来简化持续集成的工作。本篇,我们就会介绍如何将上一篇中Flask的应用程序自动打包,分发,并部署到像Apache, Nginx等服务器中去。
使用setuptools打包Flask应用
首先,你要了解基本的使用setuptools打包分发Python应用程序的方法。接下来,就让我们开始写一个”setup.py”文件:
from setuptools import setup setup(
name='MyApp',
version='1.0',
long_description=__doc__,
packages=['myapp','myapp.main','myapp.admin'],
include_package_data=True,
zip_safe=False,
install_requires=[
'Flask>=0.10',
'Flask-Mail>=0.9',
'Flask-SQLAlchemy>=2.1'
]
)
把文件放在项目的根目录下。另外,还要写一个”MANIFEST.in”文件:
recursive-include myapp/templates *
recursive-include myapp/static *
编写完毕后,你可以创建一个干净的虚拟环境,然后运行安装命令试下效果。
python setup.py install
使用Fabric远程部署Flask应用
同样,你需要先了解如何使用Fabric来远程部署Python应用。然后,我们来编写”fabfile.py”文件:
from fabric.api import * env.hosts = ['example1.com', 'example2.com']
env.user = 'bjhee' def package():
local('python setup.py sdist --formats=gztar', capture=False) def deploy():
dist = local('python setup.py --fullname', capture=True).strip()
put('dist/%s.tar.gz' % dist, '/tmp/myapp.tar.gz')
run('mkdir /tmp/myapp')
with cd('/tmp/myapp'):
run('tar xzf /tmp/myapp.tar.gz')
run('/home/bjhee/virtualenv/bin/python setup.py install')
run('rm -rf /tmp/myapp /tmp/myapp.tar.gz')
run('touch /var/www/myapp.wsgi')
上例中,”package”任务是用来将应用程序打包,而”deploy”任务是用来将Python包安装到远程服务器的虚拟环境中,这里假设虚拟环境在”/home/bjhee/virtualenv”下。安装完后,我们将”/var/www/myapp.wsgi”文件的修改时间更新,以通知WSGI服务器(如Apache)重新加载它。对于非WSGI服务器,比如uWSGI,这条语句可以省去。
编写完后,运行部署脚本测试下:
fab package deploy
使用Apache+mod_wsgi运行Flask应用
Flask应用是基于WSGI规范的,所以它可以运行在任何一个支持WSGI协议的Web应用服务器中,最常用的就是Apache+mod_wsgi的方式。上面的Fabric脚本已经完成了将Flask应用部署到远程服务器上,接下来要做的就是编写WSGI的入口文件”myapp.wsgi”,我们假设将其放在Apache的文档根目录在”/var/www”下。
activate_this = '/home/bjhee/virtualenv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this)) import os
os.environ['PYTHON_EGG_CACHE'] = '/home/bjhee/.python-eggs' import sys;
sys.path.append("/var/www") from myapp import create_app
import config
application = create_app('config')
注意上,你需要预先创建配置文件”config.py”,并将其放在远程服务器的Python模块导入路径中。上例中,我们将”/var/www”加入到了Python的模块导入路径,因此可以将”config.py”放在其中。另外,记得用setuptools打包时不能包括”config.py”,以免在部署过程中将开发环境中的配置覆盖了生产环境。
在Apache的”httpd.conf”中加上脚本更新自动重载和URL路径映射:
WSGIScriptReloading On
WSGIScriptAlias /myapp /var/www/myapp.wsgi
重启Apache服务器后,就可以通过”http://example1.com/myapp”来访问应用了。
使用Nginx+uWSGI运行Flask应用
要先准备好Nginx+uWSGI的运行环境,然后编写uWSGI的启动文件”myapp.ini”:
[uwsgi]
socket=127.0.0.1:3031
callable=app
mount=/myapp=run.py
manage-script-name=true
master=true
processes=4
threads=2
stats=127.0.0.1:9191
virtualenv=/home/bjhee/virtualenv
再修改Nginx的配置文件,Linux上默认是”/etc/nginx/sites-enabled/default”,加上目录配置:
location /myapp {
include uwsgi_params;
uwsgi_param SCRIPT_NAME /myapp;
uwsgi_pass 127.0.0.1:3031;
}
重启Nginx和uWSGI后,就可以通过”http://example1.com/myapp”来访问应用了。
你也可以将我们的应用配置为虚拟服务器,只需要将上述uWSGI的配置移到虚拟服务器的配置文件中即可。关于Nginx虚拟服务器的配置,可以参考我之前的文章。
使用Tornado运行Flask应用
Tornado的强大之处在于它是非阻塞式异步IO及Epoll模型,采用Tornado的可以支持数以万计的并发连接,对于高并发的应用有着很好的性能。使用Tornado来运行Flask应用很简单,只要编写下面的运行程序,并执行它即可:
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from myapp import create_app
import config app = create_app('config') http_server = HTTPServer(WSGIContainer(app))
http_server.listen(5000)
IOLoop.instance().start()
之后你就可以通过”http://example1.com:5000″来访问应用了
使用Gunicorn运行Flask应用
Gunicorn是一个Python的WSGI Web应用服务器,是从Ruby的Unicorn移植过来的。它基于”pre-fork worker”模型,即预先开启大量的进程,等待并处理收到的请求,每个单独的进程可以同时处理各自的请求,又避免进程启动及销毁的开销。不过Gunicorn是基于阻塞式IO,并发性能无法同Tornado比。另外,Gunicorn同uWSGI一样,一般都是配合着Nginx等Web服务器一同使用。
让我们先将应用安装到远程服务器上,然后采用Gunicorn启动应用,使用下面的命令即可:
gunicorn run:app
解释下,因为我们的应用使用了工厂方法,所以只在run.py文件中创建了应用对象app,gunicorn命令的参数必须是应用对象,所以这里是”run:app”。现在你就可以通过”http://example1.com:8000″来访问应用了。默认监听端口是8000。
假设我们想预先开启4个工作进程,并监听本地的5000端口,我们可以将启动命令改为:
gunicorn -w 4 -b 127.0.0.1:5000 run:app
Flask 部署和分发的更多相关文章
- flask部署深度学习模型
flask部署深度学习模型 作为著名Python web框架之一的Flask,具有简单轻量.灵活.扩展丰富且上手难度低的特点,因此成为了机器学习和深度学习模型上线跑定时任务,提供API的首选框架. 众 ...
- flask 部署后并发测试
部署后看下flask支持的并发,来个300并发看看,上代码 import threading, time, requests url = "http://www.baidu.com" ...
- Apache+wsgi+flask部署
flask自带的web server是开发用途,并不适用与发布,需要借助专业的web服务器. 配置的坑无数,Apache部署,403禁止,莫名其妙无法访问,500内部错误把我搞得崩溃了. 重点参考: ...
- python3 flask部署新浪sae
第一步需要注册新浪云 https://sae.sinacloud.com/ 第二步 创建应用,注:直接选python2.7不用纠结,后面可以指定python版本,共享版 第三步 找到git仓库信息 第 ...
- 把flask部署到服务器
1.新建一个wsgi.py文件 # -*- coding:utf-8 -*- import sys from os.path import abspath from os.path import di ...
- flask 部署
学习 Flask,写完一个 Flask 应用需要部署的时候,就想着折腾自己的服务器.根据搜索的教程照做,对于原理一知半解,磕磕碰碰,只要运行起来了,谢天谢地然后不再折腾了,到下一次还需要部署时,这样的 ...
- flask部署:Ubuntu下使用nginx+uwsgi+supervisor部署flask应用
之前一直用的Centos或者Red hat,自从使用Ubuntu后,发现Ubuntu使用起来更方便,自此爱上Ubuntu. 一.从github上下载flask应用 1.我已经成功将自己编写好的应用上传 ...
- python flask 部署
flask在开发的时候,经常启动本身进行调试(本身可以设置监听的端口,例如 在app.run(port=8088),当然默认不设置端口为5000). 但生产环境经常使用uswgi充当flask的宿主, ...
- Windows+Apache+mod_wsgi+Flask部署方法
环境:windows7 64bit 1.python版本3.6.5,32位 2.下载Apache,版本httpd-2.4.33-o102o-x86-vc14-r2,32位,vc14编译 3.下载mod ...
随机推荐
- JavaScript的那些事儿
关于JavaScript的对象数据类型: Object 定义一个对象类型: 例如:var person=new Object(): 当然在建立对象以后我们可以为他添加属性, 如: <script ...
- 版本控制-Git对象
Git对象 版本控制在于文件的控制,git的控制方法在于为每个文件生成(key,object)的结构.git利用sha-1加密算法,对每一个文件生成一个唯一的字符序列(明文大小不超过2^64位,对于普 ...
- 云计算之路-阿里云上:3个manager节点异常造成 docker swarm 集群宕机
今天 11:29 - 11:39 左右,docker swarm 集群 3 个 manager 节点同时出现异常,造成整个集群宕机,由此给您带来很大的麻烦,请您谅解. 受此次故障影响的站点有:博问,闪 ...
- Eclipse增强代码提示插件Code Recommenders安装,顺便说说Eclipse插件安装方法
1.为什么用Code Recommenders 在用过Intelij Idea后,发现它的自动代码提示非常智能,可以敲关键字就能提示,但是因为公司用的是Eclipse, 所以想找有没有这个插件能增强代 ...
- 通过Navicat连接MySQL数据库
步骤一.从Navicat官网下载Navicat11版本安装包安装 下载连接:http://www.formysql.com/xiazai_mysql.html 步骤二.下载补丁破解程序PatchNav ...
- body里面的onload和window.onload的区别
区别:body里面的onload是在“页面加载完成后执行的动作” window里面的onload是在“页面加载时执行的动作” 例子:在html页面中有一个大图片,想要在图片显示出来后提示一个消息框“图 ...
- Web前端有价值的博客文章汇总
一.HTML 二.CSS 1.深入理解position和z-index属性 :https://www.cnblogs.com/zhuzhenwei918/p/6112034.html 2.BFC(清除 ...
- 无需安装Oracle Client连接Oracle数据库
介绍 当我们采用 ODP.NET 检索Oracle 数据库的时候,Oracle客户端是必须安装.假如当时电脑上没有安装Oracle客户端,就不能这么用了,这时候Oracle.ManagedDataAc ...
- PAT乙级-1056. 组合数的和(15)
给定N个非0的个位数字,用其中任意2个数字都可以组合成1个2位的数字.要求所有可能组合出来的2位数字的和.例如给定2.5.8,则可以组合出:25.28.52.58.82.85,它们的和为330. 输入 ...
- 如约而至,Java 10 正式发布!
3 月 20 日,Oracle 宣布 Java 10 正式发布. 官方已提供下载:http://www.oracle.com/technetwork/java/javase/downloads/ind ...