使用结构部署

Fabric 是一个用于Python的工具,类似于makefiles,但能够在远程服务器上执行命令。结合正确设置的python包 (大型应用程序包 )以及配置的良好概念 (配置管理 )将flask应用程序部署到外部服务器非常容易。

在我们开始之前,这里有一个快速的检查清单,我们必须事先确保:

  • 必须在本地安装结构1.0。本教程假设结构的最新版本。

  • 应用程序必须是一个包,并且需要 setup.py 文件 (使用安装工具部署

  • 在下面的示例中,我们使用 mod_wsgi 对于远程服务器。当然,您可以在那里使用自己喜欢的服务器,但在本例中,我们选择了Apache+ mod_wsgi 因为它非常容易设置,并且有一种简单的方法可以在没有根访问的情况下重新加载应用程序。

创建第一个FabFile

FabFile是控制结构执行的工具。它被命名 fabfile.py 并由 fab 命令。该文件中定义的所有函数将显示为 fab 子命令。它们在一个或多个主机上执行。这些主机可以在fabfile或命令行中定义。在这种情况下,我们将把它们添加到fab文件中。

这是一个基本的第一个示例,能够将当前源代码上载到服务器并将其安装到预先存在的虚拟环境中:

from fabric.api import *

# the user to use for the remote commands
env.user = 'appuser'
# the servers where the commands are executed
env.hosts = ['server1.example.com', 'server2.example.com']

def pack():
    # build the package
    local('python setup.py sdist --formats=gztar', capture=False)

def deploy():
    # figure out the package name and version
    dist = local('python setup.py --fullname', capture=True).strip()
    filename = f'{dist}.tar.gz'

    # upload the package to the temporary folder on the server
    put(f'dist/{filename}', f'/tmp/{filename}')

    # install the package in the application's virtualenv with pip
    run(f'/var/www/yourapplication/env/bin/pip install /tmp/{filename}')

    # remove the uploaded package
    run(f'rm -r /tmp/{filename}')

    # touch the .wsgi file to trigger a reload in mod_wsgi
    run('touch /var/www/yourapplication.wsgi')

运行fabfiles

现在你如何执行那个fabfile?你使用 fab 命令。要在远程服务器上部署当前版本的代码,您将使用以下命令:

$ fab pack deploy

但是,这要求我们的服务器已经创建了:file:/ var / www / yourapplication`文件夹,并且:file:/ var / www / yourapplication / env`是一个虚拟环境。 此外,我们不在服务器上创建配置或``.wsgi``文件。 那么我们如何将新服务器引导到我们的基础架构中呢?

这现在取决于我们要设置的服务器的数量。如果我们只有一个应用服务器(大多数应用程序都有),那么在fabfile中为此创建一个命令就太过分了。但很明显你能做到。如果那样的话,你可能会称之为 setupbootstrap 然后在命令行上显式传递servername::

$ fab -H newserver.example.com bootstrap

要设置新服务器,您大致需要执行以下步骤:

  1. 在中创建目录结构 /var/www ::

    $ mkdir /var/www/yourapplication
    $ cd /var/www/yourapplication
    $ virtualenv --distribute env
    
  2. 上传新 application.wsgi 文件到服务器和应用程序的配置文件(例如: application.cfg

  3. 为创建新的Apache配置 yourapplication 激活它。确保激活监视 .wsgi 文件,以便我们可以通过触摸它来自动重新加载应用程序。看到了吗 mod_wsgi (Apache) .

所以现在的问题是,file:`application.wsgi`和:file:`application.cfg`文件来自哪里?

WSGI文件

WSGI文件必须导入应用程序,还必须设置一个环境变量,以便应用程序知道在哪里查找配置。这是一个很简单的例子,可以做到:

import os
os.environ['YOURAPPLICATION_CONFIG'] = '/var/www/yourapplication/application.cfg'
from yourapplication import app

然后,应用程序本身必须像这样初始化,以便在该环境变量中查找配置:

app = Flask(__name__)
app.config.from_object('yourapplication.default_config')
app.config.from_envvar('YOURAPPLICATION_CONFIG')

该方法在 配置管理 文档的节。

配置文件

如前所述,应用程序将通过查找 YOURAPPLICATION_CONFIG 环境变量。所以我们必须将配置放在应用程序能够找到它的地方。配置文件在所有计算机上都具有不同的不友好质量,因此您通常不会对其进行版本更改。

一种流行的方法是将不同服务器的配置文件存储在单独的版本控制存储库中,并在所有服务器上签出它们。然后将服务器的活动文件符号链接到预期的位置(例如: /var/www/yourapplication

不管怎样,在这里我们只需要一个或两个服务器,我们可以提前手工上传它们。

第一次部署

现在我们可以进行第一次部署。我们已经设置了服务器,这样它们就有了虚拟环境并激活了Apache配置。现在我们可以打包应用程序并部署它:

$ fab pack deploy

Fabric现在将连接到所有服务器,并运行fabfile中写下的命令。首先,它将执行pack,以便我们准备好tarball,然后它将执行deploy,并将源代码上载到所有服务器,然后将其安装在那里。多亏了 setup.py 文件,我们将自动将所需的库拉入到我们的虚拟环境中。

下一步

从那时起,我们可以做很多事情来让部署变得有趣:

  • 创建一个 bootstrap 初始化新服务器的命令。它可以初始化一个新的虚拟环境,适当地设置Apache等。

  • 将配置文件放入单独的版本控制存储库,并将活动配置符号链接到适当的位置。

  • 您还可以将应用程序代码放入存储库,在服务器上签出最新版本,然后安装。这样,您也可以轻松地返回到旧版本。

  • 挂接测试功能,以便您可以部署到外部服务器并运行测试套件。

使用Fabric非常有趣,您会注意到输入``fab deploy``并将您的应用程序自动部署到一个或多个远程服务器是非常神奇的。