【问题标题】:Nginx client_max_body_size not working in Docker container on AWS Elastic BeanstalkNginx client_max_body_size 在 AWS Elastic Beanstalk 上的 Docker 容器中不起作用
【发布时间】:2015-01-30 13:24:00
【问题描述】:

我遇到了一个问题,nginx 似乎忽略(或覆盖)我在 AWS Elastic Beanstalk 上的 Ubuntu Docker 容器中升级的 client_max_body_size 指令。这会阻止用户上传大于 nginx 默认值 1MB 的文件。

我用了client_max_body_size 10M;在 http、server 和 location 块无济于事时,我仍然在 nginx 日志中看到“客户端打算发送太大的正文”错误。我已经在 AWS EC2 Ubuntu 实例上成功使用了这些设置,但是由于在 Docker 容器中使用相同的设置,我遇到了这个问题。我也尝试使用此处概述的 ebextension Increasing client_max_body_size in Nginx conf on AWS Elastic Beanstalk

应用程序本身是在 Tomcat 容器中运行的 CFML (Railo)。

这里是相关的nginx文件:

完整的未删节文件在这里https://github.com/chapmandu/docker-railo

提前致谢。

nginx 错误日志

2014/12/02 03:02:05 [error] 32116#0: *142 client intended to send too large body: 1290803 bytes, client: 172.31.19.39, server: , request: "POST /listings/35602/images/create HTTP/1.1", host: "staging.svr.com.au", referrer: "http://staging.svr.com.au/listings/35602/images/new"

nginx.conf

daemon off;

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    client_max_body_size 10M;
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    include /etc/nginx/sites-enabled/default;
}

默认

server
{
    listen       80;
    server_name  localhost;

    client_max_body_size 10M;

    # don't rewrite for static files
    location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm|map|ttf|woff)$
    {
        root   /var/www;
    }

    location /
    {
        root   /var/www;
        index  index.cfm;
        client_max_body_size 10M;
        include proxy_params;
    }
}

proxy_params

proxy_redirect off;

# # If you want your server to identify itself only as Tomcat you can pass
# # the Tomcat setting to Nginx telling Nginx not to change it
#proxy_pass_header Server;

# Point Nginx to Tomcat
proxy_pass  http://localhost:8080;

# Send appropriate headers through
# Forward the real ip to Tomcat (and Railo)

proxy_buffers 16 16k;
proxy_buffer_size 32k;

# prevent regular 504 Gateway Time-out message
proxy_connect_timeout       600;
proxy_send_timeout          600;
proxy_read_timeout          600;
send_timeout                600;

# pass headers through
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Query-String $request_uri;
proxy_set_header X-Host $host;
proxy_set_header X-Remote-Addr $remote_addr;
proxy_set_header X-Request-Filename $request_filename;
proxy_set_header X-Request-URI $request_uri;
proxy_set_header X-Server-Name $server_name;
proxy_set_header X-Server-Port $server_port;
proxy_set_header X-Server-Protocol $server_protocol;

proxy_intercept_errors on;

# apparently this is how to disable cache?
expires     -1;

【问题讨论】:

    标签: ubuntu nginx docker amazon-elastic-beanstalk railo


    【解决方案1】:

    事实证明,AWS 使用 nginx 代理与 docker 容器的连接,因此必须更新 AWS nginx 配置才能设置 client_max_body_size。请注意,我使用的是运行 Docker 1.2.0 的 64 位 Amazon Linux 2014.09 v1.0.9。

    我需要使用以下内容创建 .ebextensions/01-client-max-body.config。

    重要的一行是“server 127.0.0.1:EB_CONFIG_NGINX_UPSTREAM_PORT;”

    files:
      "/tmp/custom-nginx.conf":
        mode: "00644"
        owner: "root"
        group: "root"
        content: |
          upstream docker {
            server 127.0.0.1:EB_CONFIG_NGINX_UPSTREAM_PORT;
            keepalive 256;
          }
    
          server {
            listen EB_CONFIG_HTTP_PORT;
            client_max_body_size 10M;
    
            location / {
              proxy_pass      http://docker;
              proxy_http_version      1.1;
              proxy_set_header Host                $host;
              proxy_set_header X-Real-IP           $remote_addr;
              proxy_set_header X-Forwarded-For     $proxy_add_x_forwarded_for;
            }
          }
    
    container_commands:
      01_remove_orig_config:
        command: 'sed -i ''/EOF/,/EOF/d'' /opt/elasticbeanstalk/hooks/appdeploy/enact/00flip.sh '
      02_add_new_conf:
        command: 'sed -i ''/# set up nginx/a sed -i s\/EB_CONFIG_NGINX_UPSTREAM_PORT\/$EB_CONFIG_NGINX_UPSTREAM_PORT\/ \/tmp\/custom-nginx.conf \nsed -i s\/EB_CONFIG_HTTP_PORT\/$EB_CONFIG_HTTP_PORT\/ \/tmp\/custom-nginx.conf \ncat \/tmp\/custom-nginx.conf > \/etc\/nginx\/sites-available\/elasticbeanstalk-nginx-docker.conf'' /opt/elasticbeanstalk/hooks/appdeploy/enact/00flip.sh'
        test: 'test ! $(grep custom-nginx.conf /opt/elasticbeanstalk/hooks/appdeploy/enact/00flip.sh)'
    

    由超级有用的 AWS 支持提供的答案..

    【讨论】:

    • 这是对我在 beanstalk 上使用 python 环境时有用的相关问题的答案。不确定它是否也适用于 docker 环境,但解决方案更简单,它只是将另一个文件添加到 conf.d 目录:stackoverflow.com/a/18951706/933245
    • 干杯,我发布的解决方案适用于 Docker 1.2。我从 AWS supprt 收到的针对 Docker 1.3+ 的解决方案与您的链接几乎完全相同。
    • 我看到 nginx 配置与上面报告的完全不同,如果它只是用来增加客户端主体,那么重置整个上游代理似乎有点过头了(另外,它已经在 /etc/nginx/conf.d/elasticbeanstalk-nginx-docker-upstream.conf 中定义了)尺寸。这个答案:stackoverflow.com/a/28313384/515153 应该可以解决问题
    • 这是我设法在 Elastic Beanstalk 上使用 docker 使其工作的唯一方法。
    • 我试过了,但它仍然没有解决我的问题.....我的想法已经用完了
    【解决方案2】:

    接受的答案对我不起作用,但我设法弄明白了。

    之前我使用了一个预构建的 docker 镜像(托管在我自己的注册表中),并在 dockerrun.aws.json 文件中指定了访问权限和 url,然后在 .elasticbeanstalk/config.json 有一个配置文件,内容如下:

    deploy:
      artifact: Dockerrun.aws.json
    

    这仅将 dockerrun 文件作为工件上传。

    为了通过 ebextentions 设置 client_max_body_size,您必须切换到通过 eb deploy 上传整个文件夹或指定包含您的 .ebextentions 文件夹的 zip 文件工件

    然后我在.ebextentions/size.config 的配置文件中取得了成功,其中包含:

    files:
      /etc/nginx/conf.d/proxy.conf:
        content: |
          client_max_body_size 50M;
    container_commands:
       01_reload_nginx:
         command: "service nginx reload"
    

    感谢https://stackoverflow.com/a/23587371/2653503https://stackoverflow.com/a/39829789/2653503 以及我现在找不到的其他一些问题,我得到了这个答案。

    【讨论】:

    • 为了澄清这一点,您所要做的就是在源包 zip 中包含 .ebextensions 文件夹以及 dockerrun json 文件。然后你仍然可以像以前一样使用预构建的 docker 镜像。
    【解决方案3】:

    黑暗中的一些刺...我注意到您的示例中出现了 2 次 client_max_body_size 参数,并且您的 github 配置不同。如果在配置文件或包含中多次出现指令,nginx 将采用最后定义的指令的值。

    另一种需要考虑的可能性是,通过网络表单上传的文件通常比文件系统中显示的文件大。你有没有试过超大的设置,比如

    client_max_body_size 500m;

    参考:掌握 Nginx

    【讨论】:

    • 我已经尝试了 client_max_body_size 指令的所有组合。上面发布的只是最新的。我目前有 10mb 的限制,但我不能上传任何超过 1000kb 的东西(即使是轻微的)。我真的不想将限制增加到 500M,因为我实际上想将上传限制为 10M。
    【解决方案4】:

    这是我遇到的另一个选项,显然,修改 nginx.conf 内联:创建这个 ebextensions 文件:

    commands:
      01_filesize:
        cwd: /etc/nginx
        test: "! grep client_max_body_size nginx.conf"
        command: sed -i -e 's/http {/http {\n    client_max_body_size 0;\n/' nginx.conf
      02_filesize:
        cwd: /etc/nginx/sites-available
        test: "! grep client_max_body_size elasticbeanstalk-nginx-docker-proxy.conf"
        command: sed -i -e 's/server {/server {\n        client_max_body_size 0;\n/'  elasticbeanstalk-nginx-docker-proxy.conf;sed -i -e 's/location \/ {/location \/ {\n            client_max_body_size 0;\n/' elasticbeanstalk-nginx-docker-proxy.conf
    

    【讨论】:

      猜你喜欢
      • 2013-09-25
      • 2020-08-12
      • 2021-03-16
      • 2020-11-05
      • 2015-06-29
      • 2021-11-24
      • 2017-07-26
      • 2019-04-20
      • 2015-03-13
      相关资源
      最近更新 更多