ChatGPT解决这个技术问题 Extra ChatGPT

在 AWS Elastic Beanstalk 上的 Nginx conf 中增加 client_max_body_size

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

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

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

这些天默认只有1MB...
作为记录,所有提供的解决方案都不处理 .NET 部署。如果您在 AWS Elastic Beanstalk 中使用 .NET,则必须在项目中配置 IIS 设置。对我来说,我必须在我的 net471 应用程序中配置 web.config。

r
rogerdpack

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

AWS 文档中支持/推荐

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

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

〜/工作区/我的应用程序/

|-- .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

希望这对其他人有帮助!


文件格式记录在 docs.aws.amazon.com/elasticbeanstalk/latest/dg/…。进度记录在 /var/log/cfn-init.log 中。在日志中,您应该会看到类似 2014-xx-xx xx:xx:xx,xxx [DEBUG] Writing content to /etc/nginx/conf.d/proxy.conf 的内容。我不确定,但似乎可能需要重新启动服务器。
和 puma 一起为我工作。不得不像@Will 说的那样重启服务(sudo service nginx reload)。
对于节点 js,第二种方法(文件:)对我有用。第一个没有工作。甚至 AWS 支持都建议对节点 js 使用第二种方法docs.aws.amazon.com/elasticbeanstalk/latest/dg/…
我刚刚测试了 ElasticBeanstalk + Java8 环境的两个选项,第一个对我有用。第二个没有。希望能帮助到你!。
对于任何人来说,Elastic Beanstalk Amazon Linux 2/3.3.1 上 Python 的正确 Nginx conf 路径是 .platform/nginx/conf.d/proxy.conf
J
Jijo Cleetus

我已经尝试了所有添加实施级别配置的 .ebextensions 方法,但它在最新的 Amazon Linux AMI 中对我没有帮助。我做了很多研究,在查看日志后,我发现部署任务运行程序每次都在检查一个名为 .platform 的文件夹,我想添加一个,就像 .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 的一部分创建。

详细的文件夹结构如下。

https://i.stack.imgur.com/aNnIW.jpg


男人!!!!!!!!太感谢了。这是在 AWS EB Amazon linux 中设置 nginx 配置的唯一方法。我浪费了一整天的时间尝试所有可用的解决方案!!!我无法表达如何感谢您花时间详细写下这个答案。祝福你。如果您有某种 patreon 或 buymeacoffee 帐户,我会做出贡献。 @jijo Cleetus
非常感谢。我也使用 .ebextensions 尝试了所有可能的方法,但只有这种方法有效。
为我节省了大量的试验和失败,让它发挥作用。不能感谢你!
有没有人在 AWS 文档中找到对此的任何参考?
不错的作品。这由 AWS 记录,但非常糟糕。 docs.aws.amazon.com/elasticbeanstalk/latest/dg/…。请参阅反向代理配置部分。 “所有 Amazon Linux 2 平台版本都使用 nginx 作为其默认反向代理服务器......要扩展 Elastic Beanstalk 默认 nginx 配置,请将 .conf 配置文件添加到应用程序源中名为 .platform/nginx/conf.d/ 的文件夹中捆”
J
JanDintel

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

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

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

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

another answer 中还提到了 .platform/ 目录,但这仍然需要重新加载 Ngix 配置,不再需要重新加载 Amazon Linux 2。

您可以在 Extending Elastic Beanstalk Linux platforms 文档中找到更多相关选项。


为 Amazon Linux 2 和 Node.js 工作!
请记住将 .platform/* 与源包中的其余源文件一起包含在内。
@Kieran 的重要收获,在我使用 Java Spring Boot 的示例中,我必须在同一级别上一起创建 jar 和 .platform/* 文件夹的 zip
@JanDintel 另一个 .platform 答案和您在重新加载 Nginx 配置时有点不一致。所以最后不需要重新加载配置,而是由 AWS 完成?
@AleksandarT 使用此方法时不再需要添加后挂钩来重新加载 Nginx 配置
L
Lenin Raj Rajasekaran
files:
    "/etc/nginx/conf.d/proxy.conf" :
        mode: "000755"
        owner: root
        group: root
        content: |
           client_max_body_size 20M;

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

另请参阅 below answer 以使 nginx 在部署后拾取此更改。


W
Will

编辑:使用 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 设置,只要该指令在您的配置文件中。


这是必要的吗?不加这个怎么重启?
根据我的经验,我发现这是必要的。
@cdmckay 您能否详细说明 reload 命令导致的实例问题?
我没有仔细研究它,但它基本上阻止了我的服务器启动,直到我删除它。似乎没有必要。
根据我的经验,我发现这是必要的,但是,在尝试为新实例重新启动 nginx 之前,我必须添加一个检查以查看它是否正在运行 - 'pgrep nginx && service nginx reload ||真的'
D
Daniel Compton

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

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


不幸的是,这对我不起作用(单容器 Docker ELB)——即使在实例重新启动后也不行。通过 SSH 登录到实例,在 /etc/nginx/conf.d/ 中没有创建 proxy.conf 文件
我假设这是因为您使用的是 Docker ELB 并且它以不同的方式执行 nginx conf。我的答案是针对 Java 预设的 ELB。
我正在使用 elb 和 java 应用程序。为我工作!谢谢!
你怎么能看到正在创建的 proxy.conf 文件,只是注意到它的临时存在?
这适用于 Amazon Linux 1(仅限旧实例),对于 Amazon Linux 2,将 ebextensions 更改为 .platform
S
Shashank Agrawal

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

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

这是基于 AWS NGINX "Reverse proxy configuration" Documentation

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


也适用于在 Amazon Linux 2 上运行的 NodeJS!
这似乎对我不起作用...我也尝试过 .ebextensions 中的相同目录
C
Conor

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

为此,添加以下命令

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

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

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


k
kkyr

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

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

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

我将内容粘贴到之前在 .ebextensions/nginx/ 中创建的 nginx.conf 文件中,并修改了 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 中被忽略)。


谢谢你!我想知道您使用的是哪个平台?出于某种原因,Beanstalk 没有检测到我的 `.ebextensions/nginx/nginx.conf` 文件,即使它位于 zip 文件和 git repo 中。
为笔记点赞。我忽略了导致被接受和流行的答案失败的 .ebextensions。我没有尝试您提到的所有其他方法,但感谢您的注意🍻
它可以用于在 64 位 Amazon Linux 上运行的 Node.js 吗?
E
Ed Vieira

唯一对我有用的是在 .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/


T
Tony BenBrahim

这是 AWS provided solution,它可以工作(根据您的需要调整大小)

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

Y
Yanir Calisar

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

如 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;配置 maven 以在构建期间将此文件添加到我的项目的根文件夹中。这有点棘手,我需要在我的 POM.xml 中添加以下配置(源代码): maven-resources-plugin 3.1.0 copy-resources validate copy-resources ${basedir}/target/.ebextensions src/main/resources/ebextensions true 您现在可以在本地构建您的项目并运行以下 SSH 命令来验证它实际上位于项目的根目录中:jar tf main-1.0-SNAPSHOT .jar | grep .ebextensions 现在是棘手的部分。当您将其上传到 EBS 时,您的文件应仅包含 SNAPSHOT.jar 文件和 .ebextensions 文件夹。例如,如果现在您将压缩 jar 文件和文件夹并手动上传,它将起作用!由于我使用 Jenkins 进行部署,特别是 AWS EBS 部署插件 - 您需要更改部署中包含的文件/文件夹的设置。现在由于某种原因我无法包含 .ebextensions 文件夹,所以我只是排除了除文件夹和 .jar 文件之外的所有其他内容。

这行得通!


A
Aerodynamika

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

/etc/nginx/conf.d

文件夹:

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

然后在此处添加以下行:

client_max_body_size 20M;

然后保存并重启nginx:

sudo systemctl restart nginx

这是一种解决方法,但如果 Elastic Beanstalk 创建一个新实例,您需要在每个实例中提供此配置。这实际上是不可能的,因为我们需要不断监控 EC2 实例,并且每次 nginx 重启过程都不是很好
谢谢这对我有用。在头痛 2 小时后找到了解决方案。
A
Anubhab Maji

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

我遵循了Jijo Cleetus的答案,但没有奏效,但绝对指向了正确的方向。

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

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

this answer 确实解决了这个问题,总的来说,.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 部署的人员添加了注释:确保在 buildspec.yaml 中包含 .platform/**/* -> artifacts 部分


谢谢,这让我可以替换 Elastic Beanstalk 用于 ASP.NET Core Web 应用程序的 Nginx 转发代理的库存 00_application.conf。我还必须将该文件添加到 Visual Studio 中的 ASP.NET Core 项目中,否则它不会发布(确保您看到它包含在 bin/Release 文件夹中以及上传到 S3 的已部署 zip 中)。
我正在使用代码管道进行部署,您为 .platform 添加工件的出色指导解决了这个问题。
p
pascal

对于没有 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

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

client_max_body_size 20M;

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


这对我使用 Amazon Linux 实例(版本 1)运行 Java 8 应用程序很有用
h
harshal jadhav

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

这是我的配置文件,

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 脚本。

这是我的几分钱,

确保您的 .ebextensions 文件夹包含在构建的 zip 文件夹中,该文件夹位于您的 aws 帐户的 s3bucket 中 如果您使用脚本生成构建,请确保它不在 .gitignore 文件中 确保它包含 .ebextensions


p
peter.swallow

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

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

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

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

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

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


D
David Smits

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


Apache 有自己的 LimitRequestBody 指令来设置上传文件的最大大小。
@TomHarvey 如果可以,您能否提供一个完整的 LimitRequestBody 用例示例?
S
Shaun

迟到了,但对于 .NET Core,以下解决方案有效:

在 /.platform/nginx/conf.d/proxy.conf 中创建一个文件,其内容为:

client_max_body_size 100M;

确保在 Visual Studio 的属性中,将此文件的“复制到输出目录”设置为“始终”,并且生成操作为“内容”。


L
Lyudmyla

Java平台

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

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

其中包含内容 client_max_body_size 20M;

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


N
Norm

除了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;


J
JasonZ

直接在 .ebextensions 中创建文件是唯一对我有用的方法 I found。创建一个名为 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(更改 # 以满足您的需要)。


m
moccasine

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

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

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

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


L
Locutus

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

在 AWS Linux 2 中需要使用 .platform 的 previous answer,但与 .ebextensions 不同,您不能将 .platform 目录包含在 fat jar 中 - 它必须位于 Java jar 之外。

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

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

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


链接的答案包括多余的额外步骤,请参阅我对文章的评论。
A
AkshayKrison

在 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


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅