增加 Nginx 的 client_max_body_size

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

我已经做了相当多的研究,并相信我需要提高 Nginx 的 Client_max_body_size,但我似乎找不到任何文件如何在 Elastic Beanstalk 中做到这一点。我的猜测是,它需要使用一个 ebetension 文件进行修改。

有人知道我怎么才能达到极限吗?10MB 是相当小的,一定有方法来手动提高这个上限。

88230 次浏览

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

AWS 文档中支持/推荐

对于某些应用程序类型,比如 Java SE去吧Node.js,也许还有 Ruby (没有关于 Ruby 的文档,但是所有其他 Nginx 平台似乎都支持这一点) ,Elasticbeanstalk 对于如何配置 Nginx 有内置的理解。

为了扩展 ElasticBean}的默认 nginx 配置,将.conf 配置文件添加到应用程序源代码包中名为 .ebextensions/nginx/conf.d/的文件夹中.ElasticBean}的 nginx 配置自动在该文件夹中包含.conf 文件。

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

配置反向代理 -JavaSE

为了增加最大上传大小,然后在 .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 文件。Conf 文件只包含一行代码 client_max_body_size 20M;

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

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

Http://wiki.nginx.org/configuration

希望这对其他人有所帮助!

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 在部署后拾取此更改。

编辑: 在使用 Nick Parsons 接受的答案中的指令部署了构建之后,可能需要重新启动 nginx 服务器来获取更改。

为此,请对实例执行 ssh 并执行以下操作

sudo service nginx reload

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

在以前版本的 Elastic Bean 中,我可以添加一个 Container _ command 来完成这个任务,但是现在我发现,像@cdmckay 这样,这会导致部署失败。如果您重新构建环境,它将获取 client _ max _ body _ size 设置,只要该指令在配置文件中。

接受的答案不适合我,因为我有一个基于 JVM 的应用程序,它似乎做 NGINX 配置不同。我将看到在部署期间创建了一个 proxy.conf 文件,但随后在部署完成之前删除了该文件。AWS 文档解释了如何使用 配置代理:

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

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

接下来,您可能需要重新加载 nginx 配置文件。

为此,请添加以下命令

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

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

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

对于没有多克的 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,其中只有一行:

client_max_body_size 20M;

如果仍然无效,请确保部署 zip 中包含 .ebextensions文件夹和子文件夹。不需要手动重新启动 Nginx。

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

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

我 SSHed 到我的 Beanstalkapp 的一个正在运行的实例中,并使用 cat /etc/nginx/nginx.conf从终端复制 nginx.conf文件的内容。

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

INFO: 在’. ebextensions/Nginx’中检测到的 Nginx 配置 AWS 弹性豆茎将不再管理 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 服务或环境。

注意 : 确保您的。扩展是。在部署期间创建并上传到 Bean}的 zip 文件(如果您正在使用它,那么在 .gitignore.ebignore中不会忽略它)。

Java 平台

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

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

里面有 client_max_body_size 20M;的内容。

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

对我来说,唯一有效的方法是在.ebeextens 中创建一个“ . config”文件,如下所示:

.ebextensions/
proxy.config

在.config 文件中只包含这些内容:

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

不需要子文件夹,不需要重新启动应用服务器,注意就是一个“。配置“不是”。内部的 conf 文件。扩展和使用适当的缩进以避免在控制台中出现错误,其余的都是一样的,不管文件的名称是什么,

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

我也在为同样的问题而挣扎,但却无法解决它,最终它起作用了。

这是我的配置文件,

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"

问题是,

我使用了一个 Python 脚本作为代码管道,它不包括 在创建生成时访问.ebextensionsfile 文件夹。

这是我的意见,

  1. 确保你的。扩展文件夹包含在构建的 zip 文件夹中,该文件夹位于 aws 帐户的 s3bucket 中
  2. 确保它不在. gitignore 文件中
  3. 如果您使用脚本来生成构建,请确保 包括。扩展

经过三天漫长的努力,我终于找到了解决这个问题的办法,我立刻接到了一个电话,与令人惊讶的 AWS 支持团队通了电话,他们给了我一些如何解决这个问题的线索。 首先,我的项目是在 JAVA 中,我使用 maven 和 spring boot 通过 ElasticBean}(EBS)运行它。

  1. 正如在 AWS 的文档中解释的那样,您需要将自定义 nginx 设置存储在项目的根级别中。 为此,我创建了一个 client _ max _ body _ size. conf 文件,并将其放置在以下路径中: Myprojectname /src/main/resources/ebextended/nginx/conf/client _ max _ body _ size. conf 此文件只包含以下行:

    client_max_body_size 10M;
    
  2. Configure maven to add this file in the root folder of my project during the build. This was a bit tricky, I needed to add the following configuration (source) in my POM.xml:

    <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. Now it's the tricky part. When you upload it to EBS, your file should contain only the SNAPSHOT.jar file and the .ebextensions folder. For example, if now you will zip the jar file and the folder and upload it manually, it will work!

  5. Since I am using Jenkins for my deployment, and specifically the AWS EBS Deployment Plugin - you need to change the settings of the files/folder you include in the deployment. Now for some reason I wasn't able to include the .ebextensions folder so I just excluded everything else except the folder and the .jar file. enter image description here

This works!

这是 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

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

/etc/nginx/conf.d

文件夹:

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

然后在这里添加以下一行:

client_max_body_size 20M;

然后保存并重新启动 nginx:

sudo systemctl restart nginx

我尝试了所有的 .ebextensions方法来添加实现级别的配置,但是在最新的 Amazon Linux AMI 中没有帮助到我。我做了很多研究,通过日志,我可以找到部署任务运行程序正在检查一个名为 .platform的文件夹每次,我想添加一个就像。扩展。下面是我在项目的根文件夹中完成的设置。

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

文件夹结构 (. Platform/nginx/conc.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

现在将您的项目重新部署到 AmazonElasticBean} ,您将看到其中的神奇之处。这个配置将被添加到所有 EC2实例中,作为自动伸缩的一部分创建。

下面是详细的文件夹结构。

enter image description here

除了 client _ max _ body _ size 之外,我还必须添加 Client _ body _ buffer _ size。下面是适用于2MB 附件的点配置文件:

文件: “/etc/nginx/conf. d/proxy.conf”:
模式: “000755”
所有者: root
组: 根
内容: |
代理缓冲;
Xy _ buffer _ size 128k;
Xy _ buffer 8256k;
Client _ body _ buffer _ size 2M;
Xy _ busy _ buffer _ size 256k;
Fastcgi _ buffer 1616k;
Fastcgi _ buffer _ size 32k;
Client _ max _ body _ size 3M;

中创建文件。直接扩展是我使用过的唯一 我找到了方法。创建一个名为01 _ files 的新文件。配置和粘贴如下:

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

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

当使用 AmazonLinux2时(无论平台如何)

在使用使用 AmazonLinuxAMI 的较老的 ElasticBean}环境时,接受的答案是正确的。较新的 Elastic Bean}环境使用 AmazonLinux2AMI。

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

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

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

您可以在 扩展弹性豆茎 Linux 平台文档中找到关于这方面的更多选项。

对于那些在这里跌跌撞撞的人:

我按照 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来确认这一点,nginx -T将打印正在运行的配置,以验证是否包含了我的自定义配置。

在这里我还看到,默认的应用程序代理配置名为 00_application.conf,nginx 包含字母顺序文件,因此以前缀数字命名。

添加了对通过代码管道进行部署的用户的说明: 确保在 buildspec.yaml-> artifacts部分包括 .platform/**/*

对于.NET Core 来说,下面的解决方案是可行的:

在/. Platform/nginx/config.d/proxy.conf 中创建一个文件,其内容如下:

client_max_body_size 100M;

请确保在 VisualStudio 的属性中,将“复制到输出目录”设置为此文件的“总是”,并且生成操作是“内容”

甚至在这里尝试所有的解决方案都有很多麻烦。我得到了错误消息: 在网络引擎中未知的指令“ client _ max _ body _ size”。木头

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

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

希望这个能帮助那些遇到同样问题的人。

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. 发射! !

这是基于 “反向代理配置”文档的。

(在64位 Amazon Linux 2/3.2.0上运行的 w/Django 3.1.4 + Python 3.7是可行的)

上述任何一种选择可能有效,也可能无效,

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

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

但是我们的 AWS 实例都是 Linux,它们期望 Unix (LF)结束。

所以,当 Linux 尝试读取文件时,它失败了... ... 它甚至没有给我们在事件或日志中一个合适的错误,它只是说失败了。

也许是最后一件要检查的事情,如果没有其他的工作:)

在 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

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

上一个答案使用。平台是 AWS Linux 2所必需的,但是,与。扩展,则不能包括。平台目录在胖的 jar 中-它必须在 Java jar 之外。

这篇有用的文章描述了如何设置 Maven 来创建用于部署的 AWS 胖罐。

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

注意: 不需要像前面的答案那样创建重新启动 nginx 服务器的脚本。