2013-09-20 3 views
77

Я столкнулся с «413 Request Entity Too Large» ошибок при отправке файлов размером более 10 МБ в наш API, работающий на AWS Elastic Beanstalk.Увеличение client_max_body_size в Nginx conf на AWS Elastic Beanstalk

Я сделал довольно много исследований, и считаю, что мне нужно, чтобы до client_max_body_size для Nginx, однако я не могу показаться, чтобы найти какой-либо документации о том, как это сделать с помощью Elastic Beanstalk. Я предполагаю, что его нужно модифицировать с помощью файла ebetension.

У кого-нибудь есть мысли о том, как я могу подняться до предела? 10MB довольно слаб, должен быть способ сделать это вручную.

ответ

160

После долгих исследований и часов работы с замечательной командой поддержки AWS я создал файл конфигурации внутри .ebextensions, чтобы изменить конфигурацию nginx. Это изменение позволило увеличить размер тела пациента.

Внутри каталога .ebextensions, я создал файл с именем 01_files.config со следующим содержанием:

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

Это создает файл proxy.conf внутри каталога /etc/nginx/conf.d. Файл proxy.conf просто содержит один лайнер client_max_body_size 20M;, который делает трюк.

Вы можете указать другие директивы, указанные в документации Nginx.

http://wiki.nginx.org/Configuration

Надеется, что это помогает другим!

+2

да очень полезно, рад, что вы смогли исправить свою проблему! –

+2

Формат файла документирован по адресу http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html. Прогресс регистрируется в /var/log/cfn-init.log. В журналах вы должны увидеть что-то вроде '2014-xx-xx xx: xx: xx, xxx [DEBUG] Написание контента в/etc/nginx/conf.d/proxy.conf'. Я не уверен, но, похоже, перезагрузка сервера может оказаться необходимой. –

+0

Нет работы со мной. У меня есть пума. –

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

Модифицированный ответ выше для безопасности (и синтаксис был не прав, см, два «Владелец:» Запись в YAML), ребята, пожалуйста, не задавайте 777 разрешений на НИБУДЬ. Если вам не нравится быть взломанным, и установите для владельца файлов конфигурации Nginx значение root.

14

EDIT: После того, как вы развернули сборку с инструкциями в принятом ответе Ником Парсонсом, вам может потребоваться перезапустить сервер nginx, чтобы получить изменения.

Чтобы сделать это, SSH к экземпляру и сделать

sudo service nginx reload

Чтобы узнать больше о перезапуске см http://nginx.org/en/docs/beginners_guide.html.

В предыдущей версии Elastic Beanstalk я смог добавить команду container_command, чтобы выполнить это, но теперь я нахожу, как @cdmckay, что это приводит к сбою развертывания. Если вы перестроете свою среду, она подберет настройки client_max_body_size так же, как и эта команда в вашем файле конфигурации.

+0

Это необходимо? Если вы не добавите это, как он будет перезагружен? – cdmckay

+0

По моему опыту я нашел это необходимым. – Will

+0

Команда reload вызывает проблемы с экземпляром – cdmckay

10

Принимаемый ответ не работал для меня, так как у меня есть приложение на основе JVM, и, похоже, он имеет конфигурацию NGINX по-разному. Я бы увидел, что файл proxy.conf создается с моими настройками, но по какой-то причине он автоматически удаляется.Я следовал инструкциям в нижней части этой страницы: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-se-platform.html

И создал .ebextensions/nginx/conf.d/proxy.conf файл, содержащий только строку: client_max_body_size 40M;

+1

К сожалению, это не сработало для меня (одноконтейнер * Docker * ELB) - даже после перезагрузки экземпляра. Вход в экземпляр через SSH отсутствует файл proxy.conf, создаваемый в '/ etc/nginx/conf.d /' –

+0

Я предполагаю, что это из-за того, что вы используете ELB Docker, и это делает nginx conf иначе. Мой ответ на Java-preset ELB. – Raymond26

+0

Я использую приложение elb и java. Работает на меня! Благодаря! –

3

В качестве альтернативы вы можете изменить прокси-сервер Apache. Для этого перейдите к разделу «Конфигурация и изменение конфигурации программного обеспечения». Первый вариант здесь - «Прокси-сервер», выберите «apache».

3

В соответствии с принятым ответом вам может потребоваться перезагрузить конфигурационный файл nginx.

Для того, чтобы сделать это добавьте следующую команду

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

Это будет лучше, чем практика ssh'ing в экземпляр Eb и вручную делать это с помощью команды.

Это в сочетании с принятым ответом решило ту же проблему для меня. (Рельсы, Puma, NGINX)

1

Для Golang без Докер я следовал этим инструкциям из AWS документ:

Настройка обратного прокси-сервера

Если вы хотите включить директивы в дополнение к тем, в Nginx .conf http block, вы также можете предоставить дополнительные файлы конфигурации в каталоге .ebextensions/nginx/conf.d/ вашего исходного пакета. Все файлы в этом каталоге должны иметь расширение .conf. http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/go-environment.html#go-complex-apps

Я создал файл proxy.conf в .ebextensions/nginx/conf.d/ в корне моего проекта, с просто 1 линия внутри:

client_max_body_size 20M; 

Если он все еще не работает, убедитесь, что .ebextensions папку и суб- папки включены в ваш zip-развертывание. Не нужно перезапускать Nginx вручную.

0

Принятый ответ не сработал для меня, поэтому вместо этого я изменил конфигурацию nginx своим.

Я создал файл с именем nginx.conf в каталоге .ebextensions/nginx/

Я SSHed в запущенный экземпляр моего Beanstalk приложения, и скопировать содержимое файла nginx.conf, используя cat /etc/nginx/nginx.conf и копирование с терминала.

Я вложил содержимое в файл nginx.conf, который ранее был создан в .ebextensions/nginx/, и модифицировал http-директиву, чтобы включить client_max_body_size 50M;. Я, наконец, перераспределил свое приложение, используя eb deploy, и он сработал. Вы должны получить следующее сообщение во время установки:

INFO: Настройка Nginx обнаружена в '.ebextensions/Nginx' каталога. AWS Elastic Beanstalk больше не будет управлять конфигурацией Nginx для этой среды.

Это содержимое моего .ebextensions/nginx/nginx.conf файла:

# Elastic Beanstalk Nginx Configuration File 

user     nginx; 
error_log    /var/log/nginx/error.log warn; 
pid      /var/run/nginx.pid; 
worker_processes  auto; 
worker_rlimit_nofile 33193; 

events { 
    worker_connections 1024; 
} 

http { 
    include  /etc/nginx/mime.types; 
    default_type application/octet-stream; 

    log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 
         '$status $body_bytes_sent "$http_referer" ' 
         '"$http_user_agent" "$http_x_forwarded_for"'; 

    include  conf.d/*.conf; 

    map $http_upgrade $connection_upgrade { 
     default  "upgrade"; 
    } 

    server { 
     listen  80 default_server; 
     access_log /var/log/nginx/access.log main; 

     client_header_timeout 60; 
     client_body_timeout 60; 
     keepalive_timeout  60; 
     gzip     off; 
     gzip_comp_level  4; 
     gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript; 

     # Include the Elastic Beanstalk generated locations 
     include conf.d/elasticbeanstalk/*.conf; 
    } 

    client_max_body_size 50M; 
} 

у меня не было, чтобы перезапустить службу Nginx, ни окружающей среде.

Примечание: Убедитесь, что .ebextensions является частью файла .zip, созданного и закачанный в Beanstalk во время развертывания (это не игнорируется в .gitignore или .ebignore, если вы используете его).