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


121

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

我已经做了大量研究,并认为我需要为Nginx 升级client_max_body_size,但是我似乎找不到任何有关如何使用Elastic Beanstalk的文档。我的猜测是,需要使用ebetension文件对其进行修改。

有人对我如何达到极限有想法吗?10MB相当薄弱,必须有一种手动进行此设置的方法。


1
这些天的默认值仅为1MB ...
rogerdpack '19

根据记录,所有提供的解决方案均不能解决.NET部署。如果在AWS Elastic Beanstalk中使用.NET,则必须在项目中配置IIS设置。对我来说,我必须在net471应用程序中配置web.config。
SimonH

Answers:


223

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

AWS文档中受支持/推荐

对于某些应用程序类型,例如Java SEGoNode.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

配置反向代理-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/配置

希望这对别人有帮助!


2
文件格式在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。我不确定,但是似乎必须重新启动服务器。
h-kippo 2014年

2
和彪马一起为我工作。不得不像@Will一样重启服务(sudo服务nginx重新加载)。
丹尼斯

1
希望这对我花了一段时间可能会有所帮助...缩进很重要-它必须符合YAML规范 -docs.saltstack.com/en/latest/topics/yaml
Alexs

1
确认工作正常,请确保.ebextensions它不在,.ebignore并且.gitignore🖖我不需要重新启动nginx服务,eb deploy并且它正常工作🎉–
GabLeRoux

4
对于节点js,第二种方法(文件:)对我有用。第一个没有用。甚至AWS支持都建议对节点js使用第二种方法docs.aws.amazon.com/elasticbeanstalk/latest/dg/…–
Kapil,

33
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在部署后进行此更改。


22

编辑:在按照尼克·帕森斯接受的答案中的说明部署了构建后,您可能需要重新启动Nginx服务器以获取更改。

为此,将ssh转到实例并执行

sudo service nginx reload

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

在Elastic Beanstalk的早期版本中,我能够添加container_command来完成此操作,但是现在我发现像@cdmckay一样,这会导致部署失败。如果您重建环境,则只要选择了配置文件中的指令,它就会选择client_max_body_size设置。


这有必要吗?如果不添加它,它将如何重新启动?
cdmckay 2015年

根据我的经验,我认为这是必要的。
2015年

@cdmckay您能详细说明一下reload命令引起的实例问题吗?
2015年

我没有仔细研究它,但是直到删除它,它基本上阻止了我的服务器启动。似乎没有必要。
cdmckay,2015年

3
以我的经验,我发现这是必要的,但是,在尝试为新实例重新启动它之前,我必须添加一个检查以查看nginx是否正在运行-'pgrep nginx && service nginx reload || true”
Alexs

16

接受的答案对我不起作用,因为我有一个基于JVM的应用程序,而且似乎对NGINX的配置有所不同。我会看到在部署期间创建了proxy.conf文件,但随后在部署完成之前将其删除。AWS文档说明了如何配置代理

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


2
不幸的是,这对我(单容器Docker ELB)不起作用-即使在实例重启后也是如此。通过SSH登录到实例时,没有创建任何proxy.conf文件/etc/nginx/conf.d/
Udo G

我假设这是因为您使用的是Docker ELB,并且它对nginx conf的处理方式有所不同。我的答案是针对Java预设的ELB。
Raymond26年

我正在使用elb和java应用程序。为我工作!谢谢!
Dimitar Vukman

您如何看到正在创建的proxy.conf文件,仅注意其临时存在?
rogerdpack '19

9

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

为此,请添加以下命令

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

这比将ssh放入eb实例并使用命令手动执行更好。

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


7

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


4

可接受的答案对我不起作用,因此我改用自己的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如果你使用它)。


谢谢你!我想知道您正在使用哪个平台?由于某种原因,即使Beanstalk位于zip文件和git repo中,也无法检测到我的`.ebextensions / nginx / nginx.conf`文件。
Icid

为笔记投票。我忽略了.ebextensions导致公认的答案失败的原因。我没有尝试您提到的所有其他内容,但感谢您提供的note
GabLeRoux

4

我尝试了所有.ebextensions添加实现级别配置的方法,但在最新的Amazon Linux AMI中并没有帮助我。我做了很多研究,浏览日志后,我发现部署任务运行程序正在检查一个名为.platformEverytime 的文件夹,我想到了像.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
男子!!!!!!!!非常感谢。这是在AWS EB Amazon Linux中设置nginx配置的唯一方法。我浪费了一整天的时间尝试所有可用的解决方案!!!我无法表达感谢您抽出宝贵时间写出这个答案的方法。祝福你。如果您有某种赞助人或buymeacoffee帐户,则可以提供Il。@jijo Cleetus
InfinitePrime

2
非常感谢。我也尝试过使用所有可能的方法.ebextensions,只有这种方法有效。
6

节省了我很多尝试和失败,使其无法正常工作。感激不尽!
贾拉勒·谢尔

3

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

2

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


Apache有自己的LimitRequestBody指令来设置上传文件的最大大小。
汤姆·哈维

@TomHarvey如果可用,请提供一个完整的用例示例LimitRequestBody
哈桑

1

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


1

我在同一个问题上苦苦挣扎,但无法解决,最终无法解决。

这是我的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文件夹。

这是我的几分钱

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

1

经过3天的努力,我终于与出色的AWS支持团队联系了,他们给了我一些解决方法的线索。首先,我的项目在JAVA中,我使用maven和spring boot通过Elastic Beanstalk(EBS)运行它。

  1. 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;
    
  2. 配置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>
    

  3. 现在,您已经可以在本地构建项目,并运行以下SSH命令以验证它是否真正位于项目的根目录中:

    jar tf main-1.0-SNAPSHOT.jar | grep .ebextensions
    
  4. 现在是棘手的部分。当您将其上传到EBS时,您的文件应仅包含SNAPSHOT.jar文件和.ebextensions文件夹。例如,如果现在将zip jar文件和文件夹压缩并手动上载,它将起作用!

  5. 由于我正在使用Jenkins进行部署,特别是使用AWS EBS部署插件 -您需要更改部署中包含的文件/文件夹的设置。现在由于某种原因,我无法包含.ebextensions文件夹,因此我只排除了该文件夹和.jar文件以外的所有内容。 在此处输入图片说明

这可行!


1

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


0

对于Java平台

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

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

与内容 client_max_body_size 20M;

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


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

这是一种解决方法,但是如果Elastic Beanstalk创建一个新实例,则需要在每个实例中都提供此配置。它实际上是不可能的,因为我们需要不断监测EC2 intances和nginx的重新启动过程并不好,每次
Jijo Cleetus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.