将大于10MB的文件发布到AWS Elastic Beanstalk上运行的API时,我遇到“413请求实体太大”错误。
我做了很多研究并且认为我需要为Nginx提供 client_max_body_size ,但是我似乎无法找到有关如何使用Elastic Beanstalk执行此操作的任何文档。我的猜测是它需要使用ebetension文件进行修改。
任何人都有关于如何达到极限的想法? 10MB非常弱,必须有一种方法可以手动启动它。
答案 0 :(得分:196)
您可以采取两种方法。不幸的是,有些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
希望这有助于其他人!
答案 1 :(得分:41)
我尝试了所有添加实现级别配置的.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实例中,并作为自动缩放的一部分创建。
下面的详细文件夹结构。
答案 2 :(得分:32)
files:
"/etc/nginx/conf.d/proxy.conf" :
mode: "000755"
owner: root
group: root
content: |
client_max_body_size 20M;
为了安全起见修改了上面的答案(并且语法错误,请参阅YAML中的两个'owner:'条目),伙计们,请不要在ANYTHING上设置777权限。除非你喜欢被黑客攻击,否则将Nginx配置文件的所有者设置为root。
另请参阅below answer以使nginx在部署后获得此更改。
答案 3 :(得分:20)
编辑:在您使用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设置,只要该指令在您的配置文件中。
答案 4 :(得分:14)
接受的答案对我来说不起作用,因为我有一个基于JVM的应用程序,它似乎以不同的方式进行NGINX配置。我会看到在部署期间创建了proxy.conf文件,但之后在部署完成之前删除了该文件。 AWS文档说明了如何configure the proxy:
创建一个仅包含以下行的.ebextensions/nginx/conf.d/proxy.conf
文件:client_max_body_size 40M;
答案 5 :(得分:8)
从接受的答案开始,您可能需要重新加载nginx配置文件。
为此,请添加以下命令
container_commands:
01_reload_nginx:
command: "service nginx reload"
这比使用ssh进入你的eb实例并使用命令手动执行它更好。
这与已接受的答案相结合,为我解决了同样的问题。 (Rails,Puma,NGINX)
答案 6 :(得分:7)
当您使用使用 Amazon Linux AMI 的旧 Elastic Beanstalk 环境时,accepted answer 是正确的。较新的 Elastic Beanstalk 环境使用 Amazon Linux 2 AMI。
使用 Amazon Linux 2 时,您需要在 .platform/
目录而不是 .ebextensions/
目录中指定自定义 Nginx 配置。
这意味着您需要使用内容 .platform/nginx/conf.d/proxy.conf
创建文件 client_max_body_size 50M;
。
another answer 中也提到了 .platform/
目录,但这仍然需要重新加载 Ngix 配置,不再需要重新加载 Amazon Linux 2。
您可以在 Extending Elastic Beanstalk Linux platforms 文档中找到更多关于此的选项。
答案 7 :(得分:5)
这是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
答案 8 :(得分:3)
接受的答案对我不起作用,所以我用我自己的方式覆盖了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
重新部署了我的应用程序并且它有效。您应该在部署期间收到以下消息:
INFO:在'.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
,则不会忽略它重新使用它。)
答案 9 :(得分:2)
适用于 Amazon Linux 2 的超级简单解决方案:
这是基于 AWS NGINX "Reverse proxy configuration" Documentation。
(这适用于在 64 位 Amazon Linux 2/3.2.0 上运行的 Django 3.1.4 + Python 3.7)
答案 10 :(得分:2)
经过3天的努力,我终于与出色的AWS支持团队联系了,他们给了我一些解决方法的线索。 首先,我的项目在JAVA中,我使用maven和spring boot通过Elastic Beanstalk(EBS)运行它。
如AWS' documentation所述,您需要将自定义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文件夹。例如,如果现在将zip jar文件和文件夹压缩并手动上传,它将起作用!
由于我正在使用Jenkins进行部署,特别是AWS EBS Deployment Plugin-您需要更改部署中包含的文件/文件夹的设置。 现在由于某种原因,我无法包含.ebextensions文件夹,因此我只排除了该文件夹和.jar文件以外的所有内容。
这行得通!
答案 11 :(得分:2)
或者,您可以将代理服务器更改为Apache。 为此,请转到配置和编辑软件配置。这里的第一个选项是“代理服务器”,选择“apache”。
答案 12 :(得分:1)
对我唯一有效的方法是在.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/
答案 13 :(得分:1)
除了client_max_body_size,我还必须添加 client_body_buffer_size 。这是适用于2 MB附件的点配置文件:
文件:“ / etc / nginx / conf.d / proxy.conf”:
模式:“ 000755”
所有者:root
组:根
内容:|
proxy_buffering开启;
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;
答案 14 :(得分:1)
直接在.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(更改#以满足您的需要)。
答案 15 :(得分:1)
对于没有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/
,内部只有一行:
client_max_body_size 20M;
如果仍然无效,请确保部署zip中包含.ebextensions
文件夹和子文件夹。无需手动重启Nginx。
答案 16 :(得分:1)
对于那些在这里磕磕绊绊的人:
我遵循了 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 进行部署的人员添加了注释:
确保在 .platform/**/*
-> buildspec.yaml
部分中包含 artifacts
答案 17 :(得分:0)
我在同一个问题上苦苦挣扎,但无法解决它,最终无法解决问题。
这是我的congfig文件,
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脚本进行代码管道,其中不包括 创建版本时使用.ebextensions文件夹。
这是我的几分钱,
答案 18 :(得分:0)
如果您正在运行EC2并自己安装了nginx,那么最好的解决方案是在
中创建一个新文件。/etc/nginx/conf.d
文件夹:
sudo nano /etc/nginx/conf.d/proxy.conf
,然后在其中添加以下行:
client_max_body_size 20M;
然后保存并重新启动nginx:
sudo systemctl restart nginx
答案 19 :(得分:0)
适用于Java平台
要创建NGINX配置代理文件,您只需添加
.ebextension/nginx/conf.d/proxy.conf
档案
其中包含client_max_body_size 20M;
个内容。
“proxy.conf”将部署到“/etc/nginx/conf.d/proxy.conf”并由NGINX配置自动包含。
答案 20 :(得分:0)
晚会,但对于 .NET Core,以下解决方案有效:
在 /.platform/nginx/conf.d/proxy.conf 中创建一个文件,内容如下:
client_max_body_size 100M;
确保在 Visual Studio 的属性中,将此文件的复制到输出目录设置为“始终”,并且构建操作为“内容”。