通过


为 Azure 应用服务上的 Python 应用配置自定义启动文件

在本文中,你将了解何时以及如何为 Azure 应用服务上托管的 Python Web 应用配置自定义启动文件。 虽然本地开发不需要启动文件,但 Azure 应用服务在 Docker 容器中运行已部署的 Web 应用,该容器可以使用启动命令(如果提供)。

在以下情况下,需要自定义启动文件:

  • 自定义 Gunicorn 参数:你想要使用超出其默认值的额外参数(即)启动 --bind=0.0.0.0 --timeout 600 默认 Web 服务器。

  • 备用框架或服务器:你的应用是使用 Flask 或 Django 以外的框架构建的,或者你想要使用除 Gunicorn 以外的其他 Web 服务器。

  • 非标准 Flask 应用程序结构:你有一个 Flask 应用,其主代码文件的名称不是 app.pyapplication.py*,或者应用对象的名称不是

换句话说,除非项目在根文件夹中具有名为 Flask 应用对象的 app.py 或 app 文件,否则需要自定义启动命令。

有关详细信息,请参阅 配置 Python 应用 - 容器启动过程

创建启动文件

如果需要自定义启动文件,请使用以下步骤:

  1. 在项目中创建一个名为 startup.txtstartup.sh 或包含启动命令的其他名称的文件。 有关 Django、Flask 和其他框架的详细信息,请参阅本文后面的部分。

    如果需要,启动文件可以包含多个命令。

  2. 将文件提交到代码存储库,以便可以使用应用的其余部分进行部署。

  3. 在 Visual Studio Code 中,选择活动栏中的 Azure 图标,展开 资源,查找和展开订阅,展开 应用服务,然后右键单击应用服务,然后选择 在门户中打开

  4. Azure 门户中,从左侧的服务菜单中,选择 “设置>配置”。 在应用服务的“配置”页上,选择“常规设置”,在“堆栈设置启动命令”下输入启动文件的名称(如 > 或 startup.sh),然后选择“保存”。

    注释

    可以将启动命令本身直接放在 Azure 门户的 “启动命令 ”字段中,而不是使用启动命令文件。 建议使用启动命令文件,因为它将配置存储在存储库中。 这使版本控制能够跟踪更改并简化对其他 Azure 应用服务实例的重新部署。

  5. 当系统提示重启应用服务时,选择 “继续 ”。

    如果在部署应用程序代码之前访问 Azure 应用服务站点,则会显示“应用程序错误”,因为没有代码可用于处理请求。

Django 启动命令

默认情况下,Azure 应用服务会找到包含 wsgi.py 文件的文件夹,并使用以下命令启动 Gunicorn:

# <module> is the folder that contains wsgi.py. If you need to use a subfolder,
# specify the parent of <module> using --chdir.
gunicorn --bind=0.0.0.0 --timeout 600 <module>.wsgi

如果要修改任何 Gunicorn 参数,例如将超时值增加到 1,200 秒(--timeout 1200),请创建自定义启动命令文件。 这样,就可以使用特定要求替代默认设置。 有关详细信息,请参阅 容器启动过程 - Django 应用

Flask 启动命令

默认情况下,Linux 上的应用服务假定您的 Flask 应用程序符合以下标准:

  • WSGI 可调用对象的名称为 app
  • 应用程序代码包含在名为 application.pyapp.py 的文件中。
  • 应用程序文件位于应用的根文件夹中。

如果项目与此结构不同,则自定义启动命令必须以 格式化 file:app_object 标识应用对象的位置:

  • 不同的文件名和/或应用对象名称:如果应用的主代码文件 hello.py 且应用对象命名 myapp,则启动命令如下所示:

    gunicorn --bind=0.0.0.0 --timeout 600 hello:myapp
    
  • 启动文件位于子文件夹中:如果启动文件为 myapp/website.py 且应用对象为 app,则使用 Gunicorn 的参数 --chdir 指定文件夹,然后将启动文件和应用对象命名为平常:

    gunicorn --bind=0.0.0.0 --timeout 600 --chdir myapp website:app
    
  • 启动文件位于模块中:在 python-sample-vscode-flask-tutorial 代码中, webapp.py 启动文件包含在文件夹 hello_app中,该文件本身是具有 __init__.py 文件的模块。 应用对象命名 app 并在 __init__.py 中定义, webapp.py 使用相对导入。

    由于这种安排,当将 Gunicorn 指向 webapp:app 时,会产生错误 “在非包中尝试相对导入”,并且应用无法启动。

    在这种情况下,请创建一个从模块导入应用对象的 shim 文件,然后使用 Gunicorn 通过该 shim 文件启动应用程序。 例如, python-sample-vscode-flask-tutorial 代码包含以下内容 startup.py

    from hello_app.webapp import app
    

    然后,启动命令为:

    gunicorn --bind=0.0.0.0 --workers=4 startup:app
    

有关详细信息,请参阅 容器启动过程 - Flask 应用

其他框架和 Web 服务器

运行 Python 应用的应用服务容器默认安装了 Django 和 Flask,以及 Gunicorn Web 服务器。

若要使用 Django 或 Flask 以外的框架(例如 FalconFastAPI 等),或使用其他 Web 服务器:

  • requirements.txt 文件中包括框架和/或 Web 服务器。

  • 在启动命令中,根据上一节对 Flask 的描述指定 WSGI 可调用项。

  • 若要启动 Gunicorn 以外的 Web 服务器,请使用命令 python -m 而不是直接调用服务器。 例如,以下命令启动 uvicorn 服务器,假设 WSGI 可调用的命名 app 并在 application.py 中找到:

    python -m uvicorn application:app --host 0.0.0.0
    

    之所以使用 python -m ,是因为通过 requirements.txt 安装的 Web 服务器不会添加到 Python 全局环境,因此无法直接调用。 该 python -m 命令从当前虚拟环境中调用服务器。