首页 文章

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

提问于
浏览
89

将大于10MB的文件发布到AWS Elastic Beanstalk上运行的API时,我遇到了 "413 Request Entity Too Large" 错误 .

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

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

9 回答

  • 30

    您可以采用两种方法:

    AWS文档中支持/建议

    对于某些应用程序类型,例如Java SEGoNode.js,以及Ruby(它没有为Ruby记录,但所有其他Nginx平台似乎都支持这一点),Elasticbeanstalk对如何配置Nginx有内在的理解 .

    要扩展Elastic Beanstalk的默认nginx配置,请将.conf配置文件添加到应用程序源包中名为.ebextensions / nginx / conf.d /的文件夹中 . Elastic Beanstalk的nginx配置自动包含此文件夹中的.conf文件 . 〜/工作区/我的应用程序内/
    | - .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/Configuration

    希望这有助于他人!

  • 0
    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获取此更改 .

  • 18

    编辑:在您使用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设置以及配置文件中的该指令 .

  • 7

    接受的答案对我不起作用,因为我有一个基于JVM的应用程序,它似乎以不同的方式进行NGINX配置 . 我会看到在部署期间创建了proxy.conf文件,但之后在部署完成之前删除了该文件 . AWS文档说明了如何configure the proxy

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

  • 3

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

    为此,请添加以下命令

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

    这比使用ssh进入你的eb实例并使用命令手动执行更好 .

    结合已接受的答案为我解决了同样的问题 . (Rails,Puma,NGINX)

  • 1

    接受的答案对我不起作用,所以我用自己的方式覆盖了nginx配置 .

    我在 .ebextensions/nginx/ 目录下创建了一个名为 nginx.conf 的文件

    我连接到我的Beanstalk应用程序的运行实例,并使用 cat /etc/nginx/nginx.conf 复制了 nginx.conf 文件的内容并从终端复制 .

    我将内容粘贴到我之前在 .ebextensions/nginx/ 中创建的 nginx.conf 文件中,并修改了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服务也没有重启环境 .

    Note :确保您的.ebextensions是在部署期间创建并上传到Beanstalk的.zip文件的一部分(如果您正在使用它,则不会在 .gitignore.ebignore 中忽略) .

  • 2

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

  • 180

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

    我在项目的根目录 .ebextensions/nginx/conf.d/ 中创建了文件 proxy.conf ,里面只有一行:

    client_max_body_size 20M;
    

    如果仍然无效,请确保部署zip中包含 .ebextensions 文件夹和子文件夹 . 无需手动重启Nginx .

  • 13

    For Java Platform

    要创建NGINX配置代理文件,您应该添加

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

    内容 client_max_body_size 20M; 在其中 .

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

相关问题