Максимальный размер тела клиента Nginx не работает в контейнере Docker на AWS Elastic Beanstalk
у меня проблема, когда nginx, похоже, игнорирует (или переопределяет) мою директиву upped client_max_body_size в контейнере Ubuntu Docker на AWS Elastic Beanstalk. Это не позволяет пользователям загружать файлы размером больше, чем значение по умолчанию nginx 1 МБ.
я использовал client_max_body_size 10M; в блоках http, server и location безрезультатно,я все еще вижу ошибки "клиент, предназначенный для отправки слишком большого тела" в журналах nginx. Я успешно использовал эти настройки на экземпляре AWS EC2 Ubuntu, но с использованием той же установки в контейнере Docker у меня возникает эта проблема. Я также попытался использовать ebextension, как описано здесь увеличение client_max_body_size в nginx conf на AWS Elastic Beanstalk
само приложение CFML (Railo) работает в контейнере Tomcat.
вот соответствующие файлы nginx:
полные необрезанные файлы здесь https://github.com/chapmandu/docker-railo
спасибо заранее.
ошибка nginx.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;
}
по умолчанию
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;
3 ответов
оказывается, что AWS использует nginx для прокси-соединений с контейнером docker, необходимо обновить конфигурацию AWS nginx, чтобы установить client_max_body_size. Обратите внимание, что я использую 64bit Amazon Linux 2014.09 v1.0.9 запуск Docker 1.2.0.
Мне нужно создать .ebextensions / 01-клиент-Макс-тело.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)'
ответ, предоставленный super полезная поддержка AWS..
несколько ударов в темноте ... Я заметил, что у вас есть 2 вхождения параметра client_max_body_size в вашем примере и что ваша конфигурация github отличается. Если в конфигурационном файле или include имеется несколько вхождений директивы, nginx будет принимать значение директивы, определенной последней.
другой вариант, чтобы рассмотреть, что файлы загруженные через веб-форму часто имеют больший размер, чем показано в файловой системе. Вы пробовали очень большой настройка, например
client_max_body_size 500m;
Ссылка: Освоение Nginx
принятый ответ не работа для меня, но мне удалось это выяснить.
ранее я использовал встроенный образ docker (размещенный в моем собственном реестре) и указал доступ и url в dockerrun.АРМ.JSON-файл, а затем файл config в .elasticbeanstalk/config.json
следующим образом:
deploy:
artifact: Dockerrun.aws.json
это загрузило только файл dockerrun в качестве артефакта.
чтобы установить client_max_body_size через ebextentions, вы должны переключатель загрузка всей папки через eb deploy
или укажите артефакт zip-файла, содержащий ваш .папка ebextentions
у меня тогда был успех с конфигурационным файлом в .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/2653503, https://stackoverflow.com/a/39829789/2653503 и несколько других, которые я не могу найти прямо сейчас.