【问题标题】:AWS Elastic Beanstalk, Rails, Carrierwave- 413 request entity too largeAWS Elastic Beanstalk、Rails、Carrierwave-413 请求实体太大
【发布时间】:2016-02-05 15:58:15
【问题描述】:

我有一个托管在 AWS Elastic Beanstalk 上的 Rails/Postgres 应用程序。向我的应用程序发布数据的一种形式还允许用户选择多张照片,其中照片在同一请求中使用 Carrierwave 直接上传到 Amazon S3。虽然它在开发中有效,但在生产中会引发“413 Request Entity Is Too Large”错误。

我尝试使用有关 Stack Overflow 帖子的一些建议来配置我的应用程序,以增加请求的最大正文大小,但似乎没有任何效果。不确定我是否应该使用容器命令。不知道这是在做什么。

.ebextensions/01_files.config

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

files:
  "/etc/nginx/conf.d/proxy.conf" :
    mode: "000755"
    owner: root
    group: root
    content: |
        http {
          client_max_body_size 20M;
        }

【问题讨论】:

  • 您遇到过这种情况吗?我在同一条船上
  • 不...我最终只是选择了一个不同版本的 Carrierwave 。这是一个非常烦人的问题,从未得到解决

标签: ruby-on-rails amazon-web-services amazon-s3 amazon-ec2 amazon-elastic-beanstalk


【解决方案1】:

我在使用自己的基于 docker 的配置时遇到了同样的问题 为我清除它的更改是添加

client_max_body_size 20M;

在我容器的 nginx 的 nginx.conf 文件中的每个级别。

但是,我的 nginx.conf 比你的要复杂得多。 我不明白您的如何仅使用 http 子句。

这是我的 nginx.conf 的样子:

upstream myapp {
  server unix:///var/run/myapp.sock;
}

  client_max_body_size 20M;

        server {
          listen 80;
          server_name mayapp.com;

          # path for static files
          root /usr/src/app/public;

          location / {
              try_files $uri @proxy;
              client_max_body_size 20M;
          }

          location @proxy {
              proxy_pass  http://myapp;
              proxy_set_header Host      $host;
              proxy_set_header X-Real-IP $remote_addr;
              client_max_body_size 20M;
          }

          client_max_body_size 20M;
        }

【讨论】:

    【解决方案2】:

    这两种非常常用的解决方案都不适合我 - 添加 proxy.conf 文件。

    client_max_body_size 20M;
    

    或与相同的 proxy.conf 文件。

    http {
          client_max_body_size 20M;
        }
    

    第一个实际上并没有删除 413 响应代码/工作,第二个在 nginx 重新启动时返回了一个错误,表明它是一个错误的指令。

    "http" directive is not allowed here in /etc/nginx/conf.d/proxy.conf:1
    

    我不喜欢我的解决方案,但它确实摆脱了 413... 在 /etc/nginx/conf.d 中有一个名为 webapp.conf 的符号链接文件 - 我用 ebextension 文件覆盖了它。该文件似乎是相当静态的,但这会破坏由弹性beantalk 补丁对文件产生的任何更改。提前计划!

    我修改后的文件如下所示(注意最后一行)复制你自己的,以防万一它们不同。

    .ebextensions/01_files.config
    files:
      "/etc/nginx/conf.d/webapp.conf" :
        mode: "000755"
        owner: root
        group: root
        content: |
       upstream my_app {
          server unix:///var/run/puma/my_app.sock;
        }
    
        server {
          listen 80;
          server_name _ localhost; # need to listen to localhost for worker tier
    
          location / {
            proxy_pass http://my_app; # match the name of upstream directive which is defined above
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          }
    
          location /assets {
            alias /var/app/current/public/assets;
            gzip_static on;
            gzip on;
            expires max;
            add_header Cache-Control public;
          }
    
          location /public {
            alias /var/app/current/public;
            gzip_static on;
            gzip on;
            expires max;
            add_header Cache-Control public;
          }
    
         client_max_body_size 100M;
        }
    

    【讨论】:

    • 输入后我真的不喜欢这个解决方案,所以我回去查看它。一个标准的 proxy.conf,只有 'client_max_body_size 20M;'将起作用 - 如果您在写入文件后重新加载 nginx - 否则在读入该配置之前启动 nginx - 添加一个容器命令,该命令运行 proxy.conf 写入操作之后,一切都很好。
    猜你喜欢
    • 2020-10-21
    • 2015-02-21
    • 2014-12-30
    • 2014-12-23
    • 2021-05-16
    • 2020-11-18
    • 2012-09-23
    • 2015-10-04
    相关资源
    最近更新 更多