173

在将大于 10MB 的文件发布到我们在 AWS Elastic Beanstalk 上运行的 API 时,我遇到了“413 Request Entity Too Large”错误。

我已经做了很多研究,并认为我需要为 Nginx 增加client_max_body_size,但是我似乎找不到任何关于如何使用 Elastic Beanstalk 执行此操作的文档。我的猜测是它需要使用 ebetension 文件进行修改。

有人对我如何提高极限有想法吗?10MB 太弱了,必须有办法手动增加。

4

25 回答 25

252

为此,您可以采取两种方法。不幸的是,有些适用于某些 EB 应用程序类型,有些适用于其他类型。

AWS 文档中支持/推荐

对于某些应用程序类型,例如Java SEGoNode.js和可能的 Ruby(Ruby 没有文档,但所有其他 Nginx 平台似乎都支持这一点),Elasticbeanstalk 对如何配置 Nginx 有一个内置的理解。

要扩展 Elastic Beanstalk 的默认 nginx 配置,请将 .conf 配置文件添加到应用程序源包中命名的文件夹.ebextensions/nginx/conf.d/中。Elastic Beanstalk 的 nginx 配置自动在此文件夹中包含 .conf 文件。

~/workspace/my-app/
|-- .ebextensions
|   `-- nginx
|       `-- conf.d
|           `-- myconf.conf
`-- web.jar

配置反向代理 - Java SE

要专门增加最大上传大小,然后在.ebextensions/nginx/conf.d/proxy.conf将最大正文大小设置为您喜欢的任何大小时创建一个文件:

client_max_body_size 50M;

直接创建 Nginx 配置文件

对于其他一些应用程序类型,经过大量研究并与出色的 AWS 支持团队合作数小时后,我在其中创建了一个配置文件.ebextensions来补充 nginx 配置。此更改允许更大的帖子正文大小。

.ebextensions目录中,我创建了一个名为的文件01_files.config,其内容如下:

files:
    "/etc/nginx/conf.d/proxy.conf" :
        mode: "000755"
        owner: root
        group: root
        content: |
           client_max_body_size 20M;

这会在 /etc/nginx/conf.d 目录中生成一个 proxy.conf 文件。proxy.conf 文件只包含一个行之有效client_max_body_size 20M;的方法。

请注意,对于某些平台,此文件将在部署期间创建,但在稍后的部署阶段会删除。

您可以指定 Nginx 文档中概述的其他指令。

http://wiki.nginx.org/Configuration

希望这对其他人有帮助!

于 2013-09-23T04:19:49.620 回答
127

我已经尝试了所有.ebextensions添加实施级别配置的方法,但它在最新的 Amazon Linux AMI 中对我没有帮助。我做了很多研究,在查看日志后,我可以发现部署任务运行程序正在检查一个名为.platformeverytime 的文件夹,我想添加一个,就像 .ebextensions 一样。以下是我在项目的根文件夹中所做的设置。

在项目文件夹的根级别添加以下文件夹设置。

文件夹结构(.platform/nginx/conf.d/proxy.conf)

.platform/
         nginx/
              conf.d/
                    proxy.conf
         00_myconf.config

文件 1 的内容 - proxy.conf.platform/nginx/conf.d/文件夹内)

client_max_body_size 50M;

文件 2 的内容 - 00_myconf.config.platform/文件夹内)

container_commands:
  01_reload_nginx:
    command: "service nginx reload"

小心扩展。第一个文件是.conf,第二个文件是.config

现在将您的项目重新部署到 Amazon Elastic Beanstalk,您将看到神奇之处。此配置将添加到您的所有 EC2 实例中,作为 Auto Scaling 的一部分创建。

详细的文件夹结构如下。

在此处输入图像描述

于 2020-05-21T20:50:18.503 回答
37
files:
    "/etc/nginx/conf.d/proxy.conf" :
        mode: "000755"
        owner: root
        group: root
        content: |
           client_max_body_size 20M;

为了安全起见,修改了上述答案(语法错误,请参阅 YAML 中的两个 'owner:' 条目),伙计们,请不要在任何东西上设置 777 权限。除非你喜欢被黑,否则将 Nginx 配置文件的所有者设置为 root。

另请参阅以下答案以使 nginx 在部署后获取此更改。

于 2014-05-10T23:25:18.867 回答
35

使用 Amazon Linux 2 时(无论平台如何)

当您通过 Amazon Linux AMI 使用较旧的 Elastic Beanstalk 环境时,接受的答案是正确的。较新的 Elastic Beanstalk 环境使用 Amazon Linux 2 AMI。

使用 Amazon Linux 2 时,您需要在.platform/目录中指定自定义 Nginx 配置,而不是.ebextensions/.

这意味着您需要创建.platform/nginx/conf.d/proxy.conf包含内容的文件client_max_body_size 50M;

另一个答案.platform/中也提到了该目录,但这仍然需要重新加载 Ngix 配置,不再需要重新加载 Amazon Linux 2。

您可以在扩展 Elastic Beanstalk Linux 平台文档中找到更多相关选项。

于 2021-01-06T10:33:24.213 回答
23

编辑:使用 Nick Parsons 接受的答案中的说明部署构建后,您可能需要重新启动 nginx 服务器以获取更改。

为此,请 ssh 到实例并执行

sudo service nginx reload

要了解有关重新加载的更多信息,请参阅http://nginx.org/en/docs/beginners_guide.html

在以前版本的 Elastic Beanstalk 中,我能够添加一个 container_command 来完成此操作,但现在我发现,就像 @cdmckay 一样,这会导致部署失败。如果您重建您的环境,它将获取 client_max_body_size 设置,只要该指令在您的配置文件中。

于 2015-02-04T04:15:10.413 回答
19

接受的答案对我不起作用,因为我有一个基于 JVM 的应用程序,而且它似乎以不同的方式进行 NGINX 配置。我会看到在部署期间创建了一个 proxy.conf 文件,但后来在部署完成之前被删除。AWS 文档解释了如何配置代理

创建一个.ebextensions/nginx/conf.d/proxy.conf仅包含以下行的文件:client_max_body_size 40M;

于 2015-12-09T20:48:07.853 回答
11

适用于 Amazon Linux 2 的超级简单解决方案:

  1. 在 和 的同一级别上.ebextensions.elasticbeanstalk创建一个名为的目录.platform
  2. 在此目录下创建一个文件(显示完整路径),名为:.platform/nginx/conf.d/client_max_body_size.conf
  3. 将这一行添加到client_max_body_size.conf文件中:client_max_body_size 20M;
  4. 部署!!

这基于AWS NGINX“反向代理配置”文档

(这适用于在 64 位 Amazon Linux 2/3.2.0 上运行的 Django 3.1.4 + Python 3.7)

于 2021-06-11T22:36:59.170 回答
9

从接受的答案开始,您可能需要重新加载 nginx 配置文件。

为此,添加以下命令

   container_commands:
      01_reload_nginx:
        command: "service nginx reload"

这比 ssh 进入您的 eb 实例并使用命令手动执行要好得多。

这与接受的答案相结合,为我解决了同样的问题。(Rails, Puma, NGINX)

于 2016-10-03T10:47:11.303 回答
8

接受的答案对我不起作用,所以我用自己的覆盖了 nginx 配置。

nginx.conf我在目录下创建了一个文件.ebextensions/nginx/

我通过 SSH 连接到我的 Beanstalk 应用程序的一个运行实例,并复制了nginx.conf文件的内容,使用cat /etc/nginx/nginx.conf终端并从终端复制。

我将内容粘贴到nginx.conf我之前创建的文件中.ebextensions/nginx/,并将 http 指令修改为包含client_max_body_size 50M;. 我终于使用重新部署了我的应用程序eb deploy并且它有效。您应该在部署期间收到以下消息:

信息:在“.ebextensions/nginx”目录中检测到 Nginx 配置。AWS Elastic Beanstalk 将不再管理此环境的 Nginx 配置。

这些是我的.ebextensions/nginx/nginx.conf文件的内容:

# Elastic Beanstalk Nginx Configuration File

user                    nginx;
error_log               /var/log/nginx/error.log warn;
pid                     /var/run/nginx.pid;
worker_processes        auto;
worker_rlimit_nofile    33193;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    include       conf.d/*.conf;

    map $http_upgrade $connection_upgrade {
        default     "upgrade";
    }

    server {
        listen        80 default_server;
        access_log    /var/log/nginx/access.log main;

        client_header_timeout 60;
        client_body_timeout   60;
        keepalive_timeout     60;
        gzip                  off;
        gzip_comp_level       4;
        gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        # Include the Elastic Beanstalk generated locations
        include conf.d/elasticbeanstalk/*.conf;
    }

    client_max_body_size 50M;
}

我不必重新启动 nginx 服务或环境。

注意:确保您的 .ebextensions 是在部署期间创建并上传到 Beanstalk 的 .zip 文件的一部分(如果您正在使用它,它不会被忽略.gitignore.ebignore

于 2017-08-31T08:07:23.957 回答
8

唯一对我有用的是在 .ebextensions 中创建一个“.config”文件,如下所示:

.ebextensions/
           proxy.config

.config 文件中只有此内容:

files:
  "/etc/nginx/conf.d/proxy.conf":
     content: |
       client_max_body_size 50M;

不需要子文件夹,不需要重新启动应用程序服务器,注意 .ebextensions 中是“.config”而不是“.conf”文件,并使用适当的缩进来避免 aws 控制台中的错误,其余的都是一样的文件名无所谓,

感谢: http: //kroltech.com/2014/09/14/quick-tip-increase-upload-size-in-aws-elastic-beanstalk-node-js-env/

于 2019-04-18T02:31:15.847 回答
5

这是AWS 提供的解决方案,它可以工作(根据您的需要调整大小)

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/enact/12_add_nginx_configuration.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      /bin/echo "client_max_body_size 50M;" > /etc/nginx/conf.d/proxy.conf
      /sbin/service nginx reload
于 2020-01-08T16:39:43.527 回答
4

对于那些在这里绊倒的人:

我按照Jijo Cleetus 的回答但没有工作,但绝对指向了正确的方向。

但我在解释为​​什么,因为如果我看到nginx.conf文件,它确实包含include conf.d/*.conf所以它应该包含代理文件作为提到答案。

此外,在 80 上侦听并标记为的默认服务器default_server具有include conf.d/elasticbeanstalk/*.conf

但是这个答案确实解决了这个问题,要点是,.conf文件目录必须.platform/nginx/conf.d/elasticbeanstalk代替.platform/nginx/conf.d/.

所以:

.platform/nginx/conf.d/elasticbeanstalk/01-request-body.conf .platform/nginx/conf.d/elasticbeanstalk/02-timeouts.conf

是一些例子

我还通过登录 ec2 实例并运行nginx -T它来确认它,它会打印正在运行的配置以验证是否包含我的自定义配置。

我还看到,默认应用程序代理配置被命名00_application.conf,并且 nginx 按字母顺序包含文件,因此通过前缀数字命名。

为通过 CodePipeline 部署的人员添加了注释: 确保包含.platform/**/*buildspec.yaml->artifacts部分

于 2021-01-20T07:30:03.523 回答
4

经过 3 天的漫长尝试来解决这个问题后,我与出色的 AWS 支持团队打了个电话,他们给了我一些关于如何解决它的线索。首先,我的项目在 JAVA 中,我使用 maven 和 spring boot 通过 Elastic Beanstalk (EBS) 运行它。

  1. AWS 文档中所述,您需要将自定义 nginx 设置存储在项目的根级别。为此,我创建了一个 client_max_body_size.conf 文件并将其放置在以下路径中: myprojectname /src/main/resources/ebextensions/nginx/conf.d/client_max_body_size.conf 该文件仅包含以下行:

    client_max_body_size 10M;
    
  2. 配置 maven 以在构建期间将此文件添加到我的项目的根文件夹中。这有点棘手,我需要在我的 POM.xml中添加以下配置( source ):

    <plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <id>copy-resources</id>
            <!-- here the phase you need -->
            <phase>validate</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <outputDirectory>${basedir}/target/.ebextensions</outputDirectory>
                <resources>
                    <resource>
                        <directory>src/main/resources/ebextensions</directory>
                        <filtering>true</filtering>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
    

  3. 您现在可以在本地构建您的项目并运行以下 SSH 命令来验证它实际上位于项目的根目录中:

    jar tf main-1.0-SNAPSHOT.jar | grep .ebextensions
    
  4. 现在是棘手的部分。当您将其上传到 EBS 时,您的文件应仅包含 SNAPSHOT.jar 文件和 .ebextensions 文件夹。例如,如果现在您将压缩 jar 文件和文件夹并手动上传,它将起作用!

  5. 由于我使用 Jenkins 进行部署,特别是AWS EBS 部署插件- 您需要更改部署中包含的文件/文件夹的设置。现在由于某种原因,我无法包含 .ebextensions 文件夹,所以我只是排除了除该文件夹和 .jar 文件之外的所有其他内容。 在此处输入图像描述

这行得通!

于 2020-01-08T11:51:44.633 回答
3

如果您正在运行 EC2 并自己安装了 nginx,那么最好的解决方案是在

/etc/nginx/conf.d

文件夹:

sudo nano /etc/nginx/conf.d/proxy.conf

然后在此处添加以下行:

client_max_body_size 20M;

然后保存并重启nginx:

sudo systemctl restart nginx
于 2020-04-25T10:55:06.420 回答
3

对于没有 Docker 的 Golang,我遵循了 aws doc 中的这些说明:

配置反向代理

如果您想在 nginx.conf http 块中包含指令之外的指令,您还可以在.ebextensions/nginx/conf.d/源包的目录中提供其他配置文件。此目录中的所有文件都必须具有 .conf 扩展名。 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/go-environment.html#go-complex-apps

proxy.conf我在项目的根目录中创建了文件.ebextensions/nginx/conf.d/,里面只有 1 行:

client_max_body_size 20M;

如果它仍然不起作用,请确保.ebextensions文件夹和子文件夹包含在您的部署 zip 中。无需手动重启 Nginx。

于 2017-03-24T05:34:35.303 回答
3

我一直在努力解决同样的问题,但无法解决它,最后它的工作。

这是我的配置文件,

files:
  "/etc/nginx/conf.d/01_proxy.conf":
    mode: "000755"
    owner: root
    group: root
    content: |
      client_max_body_size 50M;
      client_body_buffer_size 16k;

container_commands:
  01_reload_nginx:
    command: "sudo service nginx reload"

问题是,

我在创建构建时使用了不包含 .ebextensions 文件夹的代码管道的 python 脚本。

这是我的几分钱,

  1. 确保您的 .ebextensions 文件夹包含在构建的 zip 文件夹中,该文件夹位于您的 aws 帐户的 s3bucket 中
  2. 确保它不在 .gitignore 文件中
  3. 如果您使用脚本生成构建,请确保它包含 .ebextensions
于 2019-11-20T08:39:40.030 回答
2

Late to the party but for .NET Core the following solution works:

Make a file in /.platform/nginx/conf.d/proxy.conf with the content:

client_max_body_size 100M;

Make sure in properties on Visual Studio that Copy to output directory is set to "Always" for this file and that the build action is "content."

于 2021-03-11T12:36:48.173 回答
2

或者,您可以将代理服务器更改为 Apache。为此,请转到配置并编辑软件配置。这里的第一个选项是“代理服务器”,选择“apache”。

于 2016-05-30T10:28:01.893 回答
1

直接在 .ebextensions 中创建文件是我发现的唯一对我有用的方法。创建一个名为 01_files.config 的新文件并粘贴以下内容:

files:
"/etc/nginx/conf.d/proxy.conf" :
    mode: "000755"
    owner: root
    group: root
    content: |
       client_max_body_size 20M;

这将在部署时为您创建一个配置文件,将 client_max_body_size 设置为 20MB(更改 # 以满足您的需要)。

于 2020-08-31T19:36:28.100 回答
1

即使在这里尝试了所有解决方案,也遇到了很多麻烦。我收到错误消息:eb-engine.log 中的未知指令“client_max_body_size”

此页面帮助我解决问题:https ://forums.aws.amazon.com/thread.jspa?threadID=334637

Visual Studio 以导致问题的某种编码创建了文件,我可以将文件保存/转换为 ANSI 编码,它按预期工作。

希望这可以帮助遇到同样问题的人。

于 2021-05-20T20:29:58.627 回答
1

Java平台

要创建 NGINX 配置代理文件,您只需添加

.ebextension/nginx/conf.d/proxy.conf文件

里面的内容client_max_body_size 20M;

“proxy.conf”将部署到“/etc/nginx/conf.d/proxy.conf”,并自动包含在 NGINX 配置中。

于 2018-04-24T10:30:07.497 回答
1

上述任何选项可能有效,也可能无效,

...但是如果您的 proxy.config 文件的行尾不正确,那么 AWS 在尝试将您的代码部署到实例时只会出错。

我们创建了 .platform/nginx/conf.d/proxy.config 文件,但是因为我们是在 Windows 平台上开发和构建代码,所以行尾设置为 Windows (CRLF)。

但是我们的 AWS 实例都是 Linux 的,它们都希望以 Unix (LF) 结尾。

因此,当 Linux 尝试读取文件时它只是失败了……它甚至没有在事件或日志中给我们一个像样的错误,它只是说失败了。

也许最后一件事要检查是否没有其他工作:)

于 2021-10-12T15:04:34.223 回答
1

除了 client_max_body_size 之外,我还必须添加client_body_buffer_size。这是 2 MB 附件的有效点配置文件:

文件:“/etc/nginx/conf.d/proxy.conf”:
模式:“000755”
所有者:根
组:根
内容:|
代理缓冲开启;
proxy_buffer_size 128k;
proxy_buffers 8 256k;
client_body_buffer_size 2M;
proxy_busy_buffers_size 256k;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
client_max_body_size 3M;

于 2020-06-22T05:45:07.960 回答
1

对于AWS Beanstalk 上的 Spring Boot / Java / Fat-Jar部署:

在 AWS Linux 2 中需要使用 .platform的先前答案,但是,与 .ebextensions 不同,您不能在 fat jar 中包含 .platform 目录 - 它必须在 Java jar 之外。

这篇有用的文章描述了如何设置 Maven 来创建 AWS fat jar 进行部署。

https://www.coderdreams.com/deploying-spring-boot-app-to-aws-beanstalk-with-nginx-customization/

注意:不需要像上一个答案那样创建脚本来重新启动 nginx 服务器。

于 2022-01-09T17:19:34.177 回答
0

在 EBS 中为 Nginx 创建自动配置

由于 EBS 是自动缩放的,我们无法手动增加大小和请求超时,因此我们必须在您的源代码中添加 conf 文件,该文件会自动包含在 EBS 的 nginx 配置中

https://akshaykrisonz.medium.com/fix-413-request-entity-too-large-nginx-error-on-aws-elastic-beanstalk-via-ebs-configuration-7533ad28ac06

于 2021-12-06T07:01:29.983 回答