Flask部署和分发
http://www.bjhee.com/flask-ad8.html
到目前為止,我們啟動Flask應(yīng)用都是通過”app.run()”方法,在開發(fā)環(huán)境中,這樣固然可行,不過到了生產(chǎn)環(huán)境上,勢必需要采用一個健壯的,功能強大的Web應(yīng)用服務(wù)器來處理各種復雜情形。同時,由于開發(fā)過程中,應(yīng)用變化頻繁,手動將每次改動部署到生產(chǎn)環(huán)境上很是繁瑣,最好有一個自動化的工具來簡化持續(xù)集成的工作。本篇,我們就會介紹如何將上一篇中Flask的應(yīng)用程序自動打包,分發(fā),并部署到像Apache, Nginx等服務(wù)器中去。
系列文章
- Flask進階系列(一)–上下文環(huán)境
- Flask進階系列(二)–信號
- Flask進階系列(三)–Jinja2模板引擎
- Flask進階系列(四)–視圖
- Flask進階系列(五)–文件和流
- Flask進階系列(六)–藍圖(Blueprint)
- Flask進階系列(七)–應(yīng)用最佳實踐
- Flask進階系列(八)–部署和分發(fā)
- Flask進階系列(九)–測試
使用setuptools打包Flask應(yīng)用
首先,你要了解基本的使用setuptools打包分發(fā)Python應(yīng)用程序的方法。接下來,就讓我們開始寫一個”setup.py”文件:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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”文件:
| 1 2 | recursive-include myapp/templates * recursive-include myapp/static * |
編寫完畢后,你可以創(chuàng)建一個干凈的虛擬環(huán)境,然后運行安裝命令試下效果。
$ python setup.py install使用Fabric遠程部署Flask應(yīng)用
同樣,你需要先了解如何使用Fabric來遠程部署Python應(yīng)用。然后,我們來編寫”fabfile.py”文件:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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”任務(wù)是用來將應(yīng)用程序打包,而”deploy”任務(wù)是用來將Python包安裝到遠程服務(wù)器的虛擬環(huán)境中,這里假設(shè)虛擬環(huán)境在”/home/bjhee/virtualenv”下。安裝完后,我們將”/var/www/myapp.wsgi”文件的修改時間更新,以通知WSGI服務(wù)器(如Apache)重新加載它。對于非WSGI服務(wù)器,比如uWSGI,這條語句可以省去。
編寫完后,運行部署腳本測試下:
$ fab package deploy使用Apache+mod_wsgi運行Flask應(yīng)用
Flask應(yīng)用是基于WSGI規(guī)范的,所以它可以運行在任何一個支持WSGI協(xié)議的Web應(yīng)用服務(wù)器中,最常用的就是Apache+mod_wsgi的方式。上面的Fabric腳本已經(jīng)完成了將Flask應(yīng)用部署到遠程服務(wù)器上,接下來要做的就是編寫WSGI的入口文件”myapp.wsgi”,我們假設(shè)將其放在Apache的文檔根目錄在”/var/www”下。
| 1 2 3 4 5 6 7 8 9 10 11 12 | 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') |
注意上,你需要預先創(chuàng)建配置文件”config.py”,并將其放在遠程服務(wù)器的Python模塊導入路徑中。上例中,我們將”/var/www”加入到了Python的模塊導入路徑,因此可以將”config.py”放在其中。另外,記得用setuptools打包時不能包括”config.py”,以免在部署過程中將開發(fā)環(huán)境中的配置覆蓋了生產(chǎn)環(huán)境。
在Apache的”httpd.conf”中加上腳本更新自動重載和URL路徑映射:
WSGIScriptReloading On WSGIScriptAlias /myapp /var/www/myapp.wsgi重啟Apache服務(wù)器后,就可以通過”http://example1.com/myapp”來訪問應(yīng)用了。
使用Nginx+uWSGI運行Flask應(yīng)用
你要先準備好Nginx+uWSGI的運行環(huán)境,然后編寫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”來訪問應(yīng)用了。
你也可以將我們的應(yīng)用配置為虛擬服務(wù)器,只需要將上述uWSGI的配置移到虛擬服務(wù)器的配置文件中即可。關(guān)于Nginx虛擬服務(wù)器的配置,可以參考我之前的文章。
使用Tornado運行Flask應(yīng)用
Tornado的強大之處在于它是非阻塞式異步IO及Epoll模型,采用Tornado的可以支持數(shù)以萬計的并發(fā)連接,對于高并發(fā)的應(yīng)用有著很好的性能。本文不會展開Tornado的介紹,感興趣的朋友們可以參閱其官方文檔。使用Tornado來運行Flask應(yīng)用很簡單,只要編寫下面的運行程序,并執(zhí)行它即可:
| 1 2 3 4 5 6 7 8 9 10 11 | 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″來訪問應(yīng)用了。
使用Gunicorn運行Flask應(yīng)用
Gunicorn是一個Python的WSGI Web應(yīng)用服務(wù)器,是從Ruby的Unicorn移植過來的。它基于”pre-fork worker”模型,即預先開啟大量的進程,等待并處理收到的請求,每個單獨的進程可以同時處理各自的請求,又避免進程啟動及銷毀的開銷。不過Gunicorn是基于阻塞式IO,并發(fā)性能無法同Tornado比。更多內(nèi)容可以參閱其官方網(wǎng)站。另外,Gunicorn同uWSGI一樣,一般都是配合著Nginx等Web服務(wù)器一同使用。
讓我們先將應(yīng)用安裝到遠程服務(wù)器上,然后采用Gunicorn啟動應(yīng)用,使用下面的命令即可:
$ gunicorn run:app解釋下,因為我們的應(yīng)用使用了工廠方法,所以只在run.py文件中創(chuàng)建了應(yīng)用對象app,gunicorn命令的參數(shù)必須是應(yīng)用對象,所以這里是”run:app”。現(xiàn)在你就可以通過”http://example1.com:8000″來訪問應(yīng)用了。默認監(jiān)聽端口是8000。
假設(shè)我們想預先開啟4個工作進程,并監(jiān)聽本地的5000端口,我們可以將啟動命令改為:
$ gunicorn -w 4 -b 127.0.0.1:5000 run:app本篇中的示例代碼可以在這里下載。
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/articles/9548866.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Flask部署和分发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python远程部署利器Fabric详解
- 下一篇: 入门科普,围绕JVM的各种外挂技术