在将大于 10MB 的文件发布到我们在 AWS Elastic Beanstalk 上运行的 API 时,我遇到了“413 Request Entity Too Large”错误。
我已经做了很多研究,并认为我需要为 Nginx 增加client_max_body_size,但是我似乎找不到任何关于如何使用 Elastic Beanstalk 执行此操作的文档。我的猜测是它需要使用 ebetension 文件进行修改。
有人对我如何提高极限有想法吗?10MB 太弱了,必须有办法手动增加。
在将大于 10MB 的文件发布到我们在 AWS Elastic Beanstalk 上运行的 API 时,我遇到了“413 Request Entity Too Large”错误。
我已经做了很多研究,并认为我需要为 Nginx 增加client_max_body_size,但是我似乎找不到任何关于如何使用 Elastic Beanstalk 执行此操作的文档。我的猜测是它需要使用 ebetension 文件进行修改。
有人对我如何提高极限有想法吗?10MB 太弱了,必须有办法手动增加。
为此,您可以采取两种方法。不幸的是,有些适用于某些 EB 应用程序类型,有些适用于其他类型。
对于某些应用程序类型,例如Java SE、Go、Node.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
要专门增加最大上传大小,然后在.ebextensions/nginx/conf.d/proxy.conf
将最大正文大小设置为您喜欢的任何大小时创建一个文件:
client_max_body_size 50M;
对于其他一些应用程序类型,经过大量研究并与出色的 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
希望这对其他人有帮助!
我已经尝试了所有.ebextensions
添加实施级别配置的方法,但它在最新的 Amazon Linux AMI 中对我没有帮助。我做了很多研究,在查看日志后,我可以发现部署任务运行程序正在检查一个名为.platform
everytime 的文件夹,我想添加一个,就像 .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 的一部分创建。
详细的文件夹结构如下。
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 在部署后获取此更改。
当您通过 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 平台文档中找到更多相关选项。
编辑:使用 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 设置,只要该指令在您的配置文件中。
接受的答案对我不起作用,因为我有一个基于 JVM 的应用程序,而且它似乎以不同的方式进行 NGINX 配置。我会看到在部署期间创建了一个 proxy.conf 文件,但后来在部署完成之前被删除。AWS 文档解释了如何配置代理:
创建一个.ebextensions/nginx/conf.d/proxy.conf
仅包含以下行的文件:client_max_body_size 40M;
适用于 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;
(这适用于在 64 位 Amazon Linux 2/3.2.0 上运行的 Django 3.1.4 + Python 3.7)
从接受的答案开始,您可能需要重新加载 nginx 配置文件。
为此,添加以下命令
container_commands:
01_reload_nginx:
command: "service nginx reload"
这比 ssh 进入您的 eb 实例并使用命令手动执行要好得多。
这与接受的答案相结合,为我解决了同样的问题。(Rails, Puma, NGINX)
接受的答案对我不起作用,所以我用自己的覆盖了 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
。
唯一对我有用的是在 .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/
这是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
对于那些在这里绊倒的人:
我按照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
部分
经过 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中添加以下配置( 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>
您现在可以在本地构建您的项目并运行以下 SSH 命令来验证它实际上位于项目的根目录中:
jar tf main-1.0-SNAPSHOT.jar | grep .ebextensions
现在是棘手的部分。当您将其上传到 EBS 时,您的文件应仅包含 SNAPSHOT.jar 文件和 .ebextensions 文件夹。例如,如果现在您将压缩 jar 文件和文件夹并手动上传,它将起作用!
由于我使用 Jenkins 进行部署,特别是AWS EBS 部署插件- 您需要更改部署中包含的文件/文件夹的设置。现在由于某种原因,我无法包含 .ebextensions 文件夹,所以我只是排除了除该文件夹和 .jar 文件之外的所有其他内容。
这行得通!
如果您正在运行 EC2 并自己安装了 nginx,那么最好的解决方案是在
/etc/nginx/conf.d
文件夹:
sudo nano /etc/nginx/conf.d/proxy.conf
然后在此处添加以下行:
client_max_body_size 20M;
然后保存并重启nginx:
sudo systemctl restart nginx
对于没有 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。
我一直在努力解决同样的问题,但无法解决它,最后它的工作。
这是我的配置文件,
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 脚本。
这是我的几分钱,
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."
或者,您可以将代理服务器更改为 Apache。为此,请转到配置并编辑软件配置。这里的第一个选项是“代理服务器”,选择“apache”。
直接在 .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(更改 # 以满足您的需要)。
即使在这里尝试了所有解决方案,也遇到了很多麻烦。我收到错误消息:eb-engine.log 中的未知指令“client_max_body_size”
此页面帮助我解决问题:https ://forums.aws.amazon.com/thread.jspa?threadID=334637
Visual Studio 以导致问题的某种编码创建了文件,我可以将文件保存/转换为 ANSI 编码,它按预期工作。
希望这可以帮助遇到同样问题的人。
Java平台
要创建 NGINX 配置代理文件,您只需添加
.ebextension/nginx/conf.d/proxy.conf
文件
里面的内容client_max_body_size 20M;
。
“proxy.conf”将部署到“/etc/nginx/conf.d/proxy.conf”,并自动包含在 NGINX 配置中。
上述任何选项可能有效,也可能无效,
...但是如果您的 proxy.config 文件的行尾不正确,那么 AWS 在尝试将您的代码部署到实例时只会出错。
我们创建了 .platform/nginx/conf.d/proxy.config 文件,但是因为我们是在 Windows 平台上开发和构建代码,所以行尾设置为 Windows (CRLF)。
但是我们的 AWS 实例都是 Linux 的,它们都希望以 Unix (LF) 结尾。
因此,当 Linux 尝试读取文件时它只是失败了……它甚至没有在事件或日志中给我们一个像样的错误,它只是说失败了。
也许最后一件事要检查是否没有其他工作:)
除了 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;
对于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 服务器。
在 EBS 中为 Nginx 创建自动配置
由于 EBS 是自动缩放的,我们无法手动增加大小和请求超时,因此我们必须在您的源代码中添加 conf 文件,该文件会自动包含在 EBS 的 nginx 配置中