

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Elastic Beanstalk Python 平台
<a name="create-deploy-python-container"></a>

本主题介绍如何在 Elastic Beanstalk 上配置、构建和运行 Python 应用程序。

AWS Elastic Beanstalk 支持适用于不同版本的 Python 编程语言的多个平台分支。有关完整列表，请参阅 *AWS Elastic Beanstalk 平台*文档中的 [Python](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.python)。

Python Web 应用程序可以在具有 WSGI 的代理服务器后面运行。Elastic Beanstalk 提供 [Gunicorn](https://gunicorn.org/) 作为默认 WSGI 服务器。

您可以将 `Procfile` 添加到源捆绑包，以指定和配置应用程序的 WSGI 服务器。有关更多信息，请参阅 [在 Elastic Beanstalk 上使用 Procfile 配置 WSGI 服务器](python-configuration-procfile.md)。

您可以使用通过 Pipenv 创建的 `Pipfile` 和 `Pipfile.lock` 文件，指定 Python 包依赖项和其他要求。有关指定依赖项的详细信息，请参阅[在 Elastic Beanstalk 上使用要求文件指定依赖项](python-configuration-requirements.md)。

Elastic [Beanstalk 提供了](command-options.md)配置选项，您可以使用这些选项来自定义在 Elastic Beanstalk 环境中的实例 EC2 上运行的软件。您可配置应用程序所需的环境变量，启用日志轮换至 Amazon S3，并将应用程序源中包含静态文件的文件夹映射至代理服务器所提供的路径。

Elastic Beanstalk 控制台中提供了配置选项，可用于[修改运行环境的配置](environment-configuration-methods-after.md)。要避免在终止环境时丢失环境配置，可以使用[保存的配置](environment-configuration-savedconfig.md)来保存您的设置，并在以后将这些设置应用到其他环境。

要保存源代码中的设置，您可以包含[配置文件](ebextensions.md)。在您每次创建环境或部署应用程序时，会应用配置文件中的设置。您还可在部署期间使用配置文件来安装程序包、运行脚本以及执行其他实例自定义操作。

在 Elastic Beanstalk 控制台中应用的设置会覆盖配置文件中的相同设置（如果存在）。这让您可以在配置文件中包含默认设置，并使用控制台中的特定环境设置加以覆盖。有关优先顺序和其他设置更改方法的更多信息，请参阅[配置选项](command-options.md)。

对于 `pip` 提供的 Python 包，您可以在应用程序源代码的根目录中包含要求文件。Elastic Beanstalk 将在部署期间安装要求文件中指定的所有依赖项程序包。有关更多信息，请参阅 [在 Elastic Beanstalk 上使用要求文件指定依赖项](python-configuration-requirements.md)。

有关扩展 Elastic Beanstalk 基于 Linux 的平台的各种方法的详细信息，请参阅 [扩展 Elastic Beanstalk Linux 平台](platforms-linux-extend.md)。

## 配置 Python 环境
<a name="create-deploy-python-container-console"></a>

Python 平台设置允许您微调亚马逊 EC2 实例的行为。您可以使用 Elastic Beanstalk 控制台编辑 Elastic Beanstalk 环境 EC2 的亚马逊实例配置。

使用 Elastic Beanstalk 控制台配置 Python 进程 AWS X-Ray设置，启用和启用 Amazon S3 的日志轮换，以及配置应用程序可以从环境中读取的变量。

**在 Elastic Beanstalk 控制台中配置 Python 环境**

1. 打开 [Elastic Beanstalk](https://console.aws.amazon.com/elasticbeanstalk) 控制台，然后**在 “区域” 列表中，选择您**的。 AWS 区域

1. 在导航窗格中，选择 **Environments**（环境），然后从列表中选择环境的名称。

1. 在导航窗格中，选择 **Configuration**（配置）。

1. 在 **Updates, monitoring, and logging**（更新、监控和日志记录）配置类别中，选择 **Edit**（编辑）。

### Python 设置
<a name="python-console-settings"></a>
+ **Proxy server**（代理服务器）– 要在环境实例上使用的代理服务器。默认情况下，使用 nginx。
+ **WSGI Path**（WSGI 路径）– 主应用程序文件的名称或路径。例如，`application.py` 或 `django/wsgi.py`。
+ **NumProcesses**— 要在每个应用程序实例上运行的进程数。
+ **NumThreads**— 每个进程中要运行的线程数。

### AWS X-Ray 设置
<a name="python-console-xray"></a>
+ **X-Ray 守**护程序 — 运行 AWS X-Ray 守护程序以处理来自的跟踪数据。[AWS X-Ray SDK for Python](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-python.html)

### 日志选项
<a name="create-deploy-python-container.console.logoptions"></a>

“日志选项”部分有两个设置：
+ **Instance profile**（实例配置文件）– 指定有权访问与应用程序关联的 Amazon S3 存储桶的实例配置文件。
+ **启用向 Amazon S3 的日志文件轮换-指定是否将**应用程序的 Amazon EC2 实例的日志文件复制到与您的应用程序关联的 Amazon S3 存储桶中。

### 静态文件
<a name="python-platform-staticfiles"></a>

为了提高性能，您可以使用 **Static files**（静态文件）部分配置代理服务器，以便从 Web 应用程序内的一组目录提供静态文件（例如 HTML 或图像）。对于每个目录，您都将虚拟路径设置为目录映射。当代理服务器收到对指定路径下的某个文件的请求时，它将直接提供此文件，而不是将请求路由至您的应用程序。

有关使用配置文件或 Elastic Beanstalk 控制台配置静态文件的详细信息，请参阅 [提供静态文件](environment-cfg-staticfiles.md)。

默认情况下，Python 环境中的代理服务器提供 `static` 路径下名为 `/static` 的文件夹中的任何文件。例如，如果您的应用程序源代码在名为 `logo.png` 的文件夹中包含一个名为 `static` 的文件，则代理服务器将通过 `subdomain.elasticbeanstalk.com/static/logo.png` 将其提供给用户。您可以配置额外的映射，如本节中所述。

### 环境属性
<a name="create-deploy-python-custom-container-envprop"></a>

您可使用环境属性来为应用程序提供信息，配置环境变量。例如，您可创建名为 `CONNECTION_STRING` 的环境属性，指定应用程序可用于连接数据库的连接字符串。

在 Elastic Beanstalk 上运行的 Python 环境中，可以使用 Python 的 `os.environ` 字典访问这些值。欲了解更多信息，请参阅 [http://docs.python。 org/library/os.html。](http://docs.python.org/library/os.html)

您可使用类似以下内容的代码，用于访问各种密钥和参数：

```
import os
endpoint = os.environ['API_ENDPOINT']
```

环境属性也可为框架提供信息。例如，您可创建名为 `DJANGO_SETTINGS_MODULE` 的属性，以配置 Django 为使用特定设置模块。根据环境的不同，值可以是 `development.settings`、`production.settings` 等等。

请参阅[环境变量和其他软件设置](environments-cfg-softwaresettings.md)了解更多信息。

## Python 配置命名空间
<a name="python-namespaces"></a>

您可以使用[配置文件](ebextensions.md)设置配置选项并在部署期间执行其他实例配置。配置选项可以[特定于平台](command-options-specific.md)，也可以应用于整个 Elastic Beanstalk 服务中的[所有平台](command-options-general.md)。配置选项被组织到*命名空间*中。

Python 平台在 `aws:elasticbeanstalk:environment:proxy`、`aws:elasticbeanstalk:environment:proxy:staticfiles` 和 `aws:elasticbeanstalk:container:python` 命名空间中定义选项。

以下示例配置文件指定配置选项设置以创建一个名为 `DJANGO_SETTINGS_MODULE` 的环境属性，选择 Apache 代理服务器，指定两个静态文件选项（用于将名为 `statichtml` 的目录映射至路径 `/html` 和将名为 `staticimages` 的目录映射到路径 `/images`）以及指定 `[aws:elasticbeanstalk:container:python](command-options-specific.md#command-options-python)` 命名空间中的附加设置。此命名空间包含让您在源代码中指定 WSGI 脚本位置的选项，以及运行 WSGI 的线程和进程数量。

```
option_settings:
  aws:elasticbeanstalk:application:environment:
    DJANGO_SETTINGS_MODULE: production.settings
  aws:elasticbeanstalk:environment:proxy:
    ProxyServer: apache
  aws:elasticbeanstalk:environment:proxy:staticfiles:
    /html: statichtml
    /images: staticimages
  aws:elasticbeanstalk:container:python:
    WSGIPath: ebdjango.wsgi:application
    NumProcesses: 3
    NumThreads: 20
```

**注意**  
如果您使用的是 Amazon Linux AMI Python 平台版本（在 Amazon Linux 2 之前），请将 `WSGIPath` 的值替换为 `ebdjango/wsgi.py`。示例中的值适用于 Gunicorn WSGI 服务器，该服务器在 Amazon Linux AMI 平台版本上不受支持。
此外，这些较旧的平台版本使用不同的命名空间来配置静态文件 - `aws:elasticbeanstalk:container:python:staticfiles`。它与标准静态文件命名空间具有相同的选项名称和语义。

配置文件还支持多个密钥，以便进一步[在环境实例上修改软件](customize-containers-ec2.md)。此示例使用[程序包](customize-containers-ec2.md#linux-packages)密钥，以使用 `yum` 和[容器命令](customize-containers-ec2.md#linux-container-commands)安装 Memcached，从而在部署期间运行配置服务器的命令。

```
packages:
  yum:
    libmemcached-devel: '0.31'

container_commands:
  collectstatic:
    command: "django-admin.py collectstatic --noinput"
  01syncdb:
    command: "django-admin.py syncdb --noinput"
    leader_only: true
  02migrate:
    command: "django-admin.py migrate"
    leader_only: true
  03wsgipass:
    command: 'echo "WSGIPassAuthorization On" >> ../wsgi.conf'
  99customize:
    command: "scripts/customize.sh"
```

Elastic Beanstalk 提供了许多用于自定义环境的配置选项。除了配置文件之外，您还可使用控制台、保存的配置、EB CLI 或 AWS CLI来配置选项。请参阅[配置选项](command-options.md)了解更多信息。

## `python3` 可执行文件
<a name="python3-executable"></a>

Elastic Beanstalk Python 环境中 EC2 实例上`python3`可用的可执行文件版本并不总是与平台使用的相同 Python 版本相对应。例如，在 Python 3.12 AL2 023 平台上，`/usr/bin/python3`指向 Python 3.9。这是因为 Python 3.9 是 AL2 023 上的 *Python 系统*。有关更多信息，请参阅《*亚马逊 Linux 2023 用户指南》*[中的 AL2 023 年中的 P](https://docs.aws.amazon.com/linux/al2023/ug/python.html) ython。您可以在版本控制位置（例如 `/usr/bin/python3.12`）或应用程序虚拟环境 `bin` 目录（例如 `/var/app/venv/staging-LQM1lest/bin/python3`）中访问与平台使用的 Python 版本相对应的可执行文件。平台使用的是与平台分支相对应的正确 Python 可执行文件。

# 在 Elastic Beanstalk 上使用 Procfile 配置 WSGI 服务器
<a name="python-configuration-procfile"></a>

您可以将 [`Procfile`](platforms-linux-extend.build-proc.md#platforms-linux-extend.proc) 添加到源捆绑包，以指定和配置应用程序的 WSGI 服务器。您可以在 `Procfile` 中指定自定义启动和运行命令。

使用 `Procfile` 时，它会覆盖您使用配置文件设置的 `aws:elasticbeanstalk:container:python` 命名空间选项。

下面的示例使用 `Procfile` 将 UWSGI 指定为服务器并进行配置。

**Example Procfile**  

```
web: uwsgi --http :8000 --wsgi-file application.py --master --processes 4 --threads 2
```

下面的示例使用 `Procfile` 配置 Gunicorn（即默认 WSGI 服务器）。

**Example Procfile**  

```
web: gunicorn --bind :8000 --workers 3 --threads 2 project.wsgi:application
```

**注意**  
如果您配置 Gunicorn 之外的任何 WSGI 服务器，请确保还将该服务器指定为应用程序的依赖项，以便将安装在环境实例上。有关依赖项规范的详细信息，请参阅[在 Elastic Beanstalk 上使用要求文件指定依赖项](python-configuration-requirements.md)。
WSGI 服务器的默认端口为 8000。如果您在 `Procfile` 命令中指定了其他端口号，请将 `PORT` [环境属性](environments-cfg-softwaresettings.md)也设置为该端口号。

# 在 Elastic Beanstalk 上使用要求文件指定依赖项
<a name="python-configuration-requirements"></a>

本主题介绍如何配置您的应用程序以安装其所需的其他 Python 包。典型的 Python 应用程序要依靠其他第三方的 Python 程序包。使用 Elastic Beanstalk Python 平台，您可以通过多种方法来指定应用程序所依赖的 Python 包。

## 使用 `pip` 和 `requirements.txt`
<a name="python-configuration-requirements.txt"></a>

用于安装 Python 包的标准工具为 `pip`。该工具有一个功能，可让您在一个要求文件中指定所有必需的包（及其版本）。有关需求文件的更多信息，请参阅 pip 文档网站上的[需求文件格式](https://pip.pypa.io/en/latest/reference/requirements-file-format/#requirements-file-format)。

创建名为 `requirements.txt` 的文件，并将该文件放在源包的顶级目录中。以下是 Django 的示例 `requirements.txt` 文件。

```
Django==2.2
mysqlclient==2.0.3
```

在开发环境中，您可以使用 `pip freeze` 命令以生成要求文件。

```
~/my-app$ pip freeze > requirements.txt
```

为确保要求文件仅包含应用程序实际使用的程序包，请使用仅安装了这些程序包的[虚拟环境](python-development-environment.md#python-common-setup-venv)。在虚拟环境外，`pip freeze` 的输出将包括在开发计算机上安装的所有 `pip` 程序包，包括操作系统随附的程序包。

**注意**  
在 Amazon Linux AMI Python 平台版本上，Elastic Beanstalk 本机不支持 Pipenv 或 Pipfiles。如果您使用 Pipenv 管理您应用程序的依赖性，请运行以下命令以生成一个 `requirements.txt` 文件。  

```
~/my-app$ pipenv lock -r > requirements.txt
```
要了解更多信息，请参阅 Pipenv 文档中的[生成 requirements.txt](https://pipenv.readthedocs.io/en/latest/advanced/#generating-a-requirements-txt)。

## 使用 Pipenv 和 `Pipfile`
<a name="python-configuration-requirements.pipenv"></a>

Pipenv 是一个现代化的 Python 打包工具。该工具将软件包安装与创建和管理应用程序的依赖项文件和 virtualenv 结合起来。有关更多信息，请参阅 [Pipenv：适合人工使用的 Python 开发工作流](https://pipenv.readthedocs.io/en/latest/)。

Pipenv 维护两个文件：
+ `Pipfile` – 此文件包含各种类型的依赖项和要求。
+ `Pipfile.lock` – 此文件包含启用确定性构建的版本快照。

您可以在开发环境中创建这些文件，并将这些文件包含在部署到 Elastic Beanstalk 的源包的顶级目录中。有关这两个文件的更多信息，请参阅[示例 Pipfile 和 Pipfile.lock](https://pipenv.pypa.io/en/latest/basics/#)。



下面的示例使用 Pipenv 来安装 Django 和 Django REST 框架。这些命令会创建 `Pipfile` 和 `Pipfile.lock` 文件。

```
~/my-app$ pipenv install django
~/my-app$ pipenv install djangorestframework
```

 

## 优先级
<a name="python-configuration-requirements.precedence"></a>

如果您包含此主题中描述的多个要求文件，则 Elastic Beanstalk 只使用其中一个文件。下面的列表按降序顺序显示优先级。

1. `requirements.txt`

1. `Pipfile.lock`

1. `Pipfile`

**注意**  
从 2023 年 3 月 7 日的 Amazon Linux 2 平台版本开始，如果您提供这些文件中的多个，则 Elastic Beanstalk 将发布一条控制台消息，说明部署期间使用了哪个依赖项文件。

以下步骤描述了 Elastic Beanstalk 在部署实例时安装依赖项所遵循的逻辑。
+ 如果有 `requirements.txt` 文件，则使用命令 `pip install -r requirements.txt`。
+ 从 2023 年 3 月 7 日的 Amazon Linux 2 平台版本开始，如果没有 `requirements.txt` 文件但有 `Pipfile.lock`，则将使用命令 `pipenv sync`。在该版本之前，使用 `pipenv install --ignore-pipfile`。
+ 如果既没有 `requirements.txt` 文件也没有 `Pipfile.lock`，但有 `Pipfile`，则使用命令 `pipenv install --skip-lock`。
+ 如果找不到三个需求文件中的任何一个，则将不会安装任何应用程序依赖项。