将大于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相当薄弱,必须有一种手动进行此设置的方法。
Answers:
您可以采用两种方法。不幸的是,有些适用于某些EB应用程序类型,而某些适用于其他类型。
对于某些应用程序类型,例如Java SE,Go,Node.js以及可能是Ruby(尚未针对Ruby进行记录,但其他所有Nginx平台似乎都支持此功能),Elasticbeanstalk对如何配置Nginx具有内在的了解。
要扩展Elastic Beanstalk的默认nginx配置,请将.conf配置文件添加到
.ebextensions/nginx/conf.d/
应用程序源bundle中命名的文件夹中。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文档中概述的其他指令。
希望这对别人有帮助!
2014-xx-xx xx:xx:xx,xxx [DEBUG] Writing content to /etc/nginx/conf.d/proxy.conf
。我不确定,但是似乎必须重新启动服务器。
.ebextensions
它不在,.ebignore
并且.gitignore
🖖我不需要重新启动nginx服务,eb deploy
并且它正常工作🎉–
编辑:在按照尼克·帕森斯接受的答案中的说明部署了构建后,您可能需要重新启动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;
/etc/nginx/conf.d/
对我唯一有效的方法是在.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/
可接受的答案对我不起作用,因此我改用自己的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是创建和部署过程中(它不是在忽视上传到魔豆的.zip文件的一部分,.gitignore
或者.ebignore
如果你使用它)。
.ebextensions
导致公认的答案失败的原因。我没有尝试您提到的所有其他内容,但感谢您提供的note
我尝试了所有.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实例中,并作为自动缩放的一部分创建。
详细的文件夹结构如下。
.ebextensions
,只有这种方法有效。
这是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
对于没有Docker的Golang,我遵循了AWS文档中的以下说明:
配置反向代理
如果要在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
部署压缩包中包含文件夹和子文件夹。无需手动重启Nginx。
我在同一个问题上苦苦挣扎,但无法解决,最终无法解决。
这是我的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文件夹。
这是我的几分钱
经过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文件夹。例如,如果现在将zip jar文件和文件夹压缩并手动上载,它将起作用!
由于我正在使用Jenkins进行部署,特别是使用AWS EBS部署插件 -您需要更改部署中包含的文件/文件夹的设置。现在由于某种原因,我无法包含.ebextensions文件夹,因此我只排除了该文件夹和.jar文件以外的所有内容。
这可行!
除了client_max_body_size之外,我还必须添加client_body_buffer_size。这是适用于2 MB附件的点配置文件:
文件:“ /etc/nginx/conf.d/proxy.conf”:
模式:“ 000755”
所有者:根
组:根
内容:|
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;
如果您正在运行EC2并自己安装了nginx,则最好的解决方案是在以下位置创建一个新文件:
/etc/nginx/conf.d
夹:
sudo nano /etc/nginx/conf.d/proxy.conf
然后在其中添加以下行:
client_max_body_size 20M;
然后保存并重新启动nginx:
sudo systemctl restart nginx