• 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
  • 相关阅读:
    新手安装Oracle数据库指南
    新手IntelliJ IDEA入门指南
    IntelliJ IDEA 开发工具快捷键大全
    打印杨辉三角
    个人作业-Alpha项目测试
    第三次作业
    第二次作业
    第一次作业-林楠-201731062428
    手把手教你实现在Monaco Editor中使用VSCode主题
    一文搞懂jsBridge的运行机制
  • 原文地址:https://www.cnblogs.com/Erick-L/p/7025668.html
Copyright © 2020-2023  润新知