Nginx client_max_body_size not working in Docker container on AWS Elastic Beanstalk

I have a problem where nginx seems to ignore (or override) my increased client_max_body_size directive in a Ubuntu Docker container on AWS Elastic Beanstalk. This prevents users from downloading files larger than nginx by default 1 MB.

I used client_max_body_size 10M; in the http, server and location blocks is useless, I still see the "client designed to send too large body errors" in nginx logs. I have successfully used these settings in an AW2 EC2 Ubuntu instance, but since I use the same setting in the Docker container, I am having this problem. I also tried using ebextension as described here Increasing client_max_body_size in Nginx conf on AWS Elastic Beanstalk

The application itself is CFML (Railo) running in a Tomcat container.

Here are the relevant nginx files:

Full unabridged files here https://github.com/chapmandu/docker-railo

Thanks in advance.

nginx error.log

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; } 

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; 
+8
source share
4 answers

It turns out that AWS uses nginx for proxy connections in the docker container, you need to update your AWS nginx configuration to set client_max_body_size. Please note that I am using 64-bit Amazon Linux 2014.09 v1.0.9 working with Docker 1.2.0.

I needed to create .ebextensions / 01-client-max-body.config with the content below.

The important line is "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 -is\/EB_CONFIG_NGINX_UPSTREAM_PORT\/$EB_CONFIG_NGINX_UPSTREAM_PORT\/ \/tmp\/custom-nginx.conf \nsed -is\/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)' 

The answer is provided by super-useful AWS support ..

+10
source

The accepted answer did not work for me, but I managed to figure it out.

I used to use a ready-made docker image (located in my own registry) and set the access and url in the dockerrun.aws.json file, and then had the configuration file in .elasticbeanstalk/config.json with the following:

 deploy: artifact: Dockerrun.aws.json 

This only loaded the dockerrun file as an artifact.

To set client_max_body_size via ebextentions, you must switch to download the entire folder via eb deploy or specify the artifact of the zip file containing your .ebextentions folder

Then I was successful with the configuration file in .ebextentions/size.config containing:

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

I came up with this answer thanks to fooobar.com/questions/82997 / ... , fooobar.com/questions/82997 / ... and a few others that I can not find now.

+4
source

Several topics in the dark ... I notice that you have 2 occurrences of the client_max_body_size parameter in your example and that your github configuration is different. If the configuration file has more than one directive occurrence or is included, nginx will take the value of the last defined directive.

Another possibility to consider is that files uploaded via a web form often have a larger file size than a file on a file system. Have you tried setting too large, for example

client_max_body_size 500m;

Link: Mastering Nginx

+1
source

Here is another option that I came across, apparently modifying the built-in nginx.conf file: create this ebextensions file:

 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 
0
source

Source: https://habr.com/ru/post/978987/


All Articles