问题描述
我遇到了一个问题,nginx似乎忽略了(或覆盖了)我在AWS Elastic Beanstalk上的Ubuntu Docker容器中升级的client_max_body_size指令.这样可以防止用户上传大于nginx默认值1MB的文件.
I'm having a problem where nginx seems to be ignoring (or overriding) my upped client_max_body_size directive in a Ubuntu Docker container on AWS Elastic Beanstalk. This is preventing users from uploading files any larger than the nginx default of 1MB.
我已使用client_max_body_size 10M;在http,服务器和位置阻止均无济于事,我仍然在nginx日志中看到客户端打算发送太大的正文"错误.我已经在AWS EC2 Ubuntu实例上成功使用了这些设置,但是由于在Docker容器中使用了相同的设置,因此出现了这个问题.我还尝试过使用此处概述的ebextension
I have used the client_max_body_size 10M; in http, server,and location blocks to no avail, I am still seeing "client intended to send too large body" errors in the nginx logs. I have successfully used these settings on an AWS EC2 Ubuntu instance, but since using the same setup in a Docker container I am having this problem. I've also tried using an ebextension as outlined here Increasing client_max_body_size in Nginx conf on AWS Elastic Beanstalk
该应用程序本身是运行在Tomcat容器中的CFML(Railo).
The app itself is CFML (Railo) running in a Tomcat container.
以下是相关的nginx文件:
Here are the relevant nginx files:
完整的未删节文件在这里 https://github.com/chapmandu/docker-railo
The full unabridged files are here https://github.com/chapmandu/docker-railo
谢谢.
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;
推荐答案
事实证明,AWS使用nginx代理到Docker容器的连接,必须更新AWS Nginx配置才能设置client_max_body_size.请注意,我正在使用运行Docker 1.2.0的64位Amazon Linux 2014.09 v1.0.9.
It turns out that AWS uses nginx to proxy connections to the docker container, it's necessary to update the AWS nginx configuration in order to set client_max_body_size. Note that I am using 64bit Amazon Linux 2014.09 v1.0.9 running Docker 1.2.0.
我需要使用以下内容创建.ebextensions/01-client-max-body.config.
I needed to create .ebextensions/01-client-max-body.config with the contents below.
重要的一行是服务器127.0.0.1:EB_CONFIG_NGINX_UPSTREAM_PORT;"
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 -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支持提供的答案.
Answer provided by super helpful AWS support..
这篇关于Nginx client_max_body_size在AWS Elastic Beanstalk上的Docker容器中不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!