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

时间:2013-09-20 03:37:03

标签: amazon-web-services nginx amazon-ec2 elastic-beanstalk

将大于10MB的文件发布到AWS Elastic Beanstalk上运行的API时,我遇到“413请求实体太大”错误。

我做了很多研究并且认为我需要为Nginx提供 client_max_body_size ,但是我似乎无法找到有关如何使用Elastic Beanstalk执行此操作的任何文档。我的猜测是它需要使用ebetension文件进行修改。

任何人都有关于如何达到极限的想法? 10MB非常弱,必须有一种方法可以手动启动它。

21 个答案:

答案 0 :(得分:196)

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

AWS文档中支持/推荐

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

Configuring the Reverse Proxy - 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/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实例中,并作为自动缩放的一部分创建。

下面的详细文件夹结构。

enter image description here

答案 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 2 时(无论平台如何)

当您使用使用 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 的超级简单解决方案:

  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. 部署!!

这是基于 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)运行它。

  1. 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;
    
  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 Deployment Plugin-您需要更改部署中包含的文件/文件夹的设置。 现在由于某种原因,我无法包含.ebextensions文件夹,因此我只排除了该文件夹和.jar文件以外的所有内容。 enter image description here

这行得通!

答案 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文件夹。

这是我的几分钱,

  1. 请确保您的.ebextensions文件夹包含在构建帐户的zip文件夹中,该文件夹位于aws帐户的s3bucket中
  2. 确保它不在.gitignore文件中
  3. 如果您使用脚本来生成构建,请确保它 包括.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 的属性中,将此文件的复制到输出目录设置为“始终”,并且构建操作为“内容”。