Збільшення client_max_body_size в Nginx conf на AWS Elastic Beanstalk


121

У мене виникають помилки "413 Request Entity Too Large" при публікації файлів розміром більше 10 МБ до нашого API, що працює на AWS Elastic Beanstalk.

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

У когось є думки про те, як я можу досягти межі? 10 Мб досить слабке, має бути спосіб покращити це вручну.


1
За замовчуванням у ці дні лише 1 Мб ...
rogerdpack

Для запису всі надані рішення не вирішують розгортання .NET. Якщо ви використовуєте .NET в AWS Elastic Beanstalk, ви повинні налаштувати параметри IIS у вашому проекті. Для мене мені довелося налаштувати web.config в моєму додатку net471.
SimonH

Відповіді:


223

Для цього можна скористатися двома методами. На жаль, деякі працюють для деяких типів додатків EB, а інші працюють для інших.

Підтримується / рекомендується в документації AWS

Для деяких типів додатків, таких як Java SE , Go , Node.js і, можливо, Ruby (це не документально підтверджено для Ruby, але всі інші платформи Nginx, схоже, підтримують це), Elasticbeanstalk має вбудоване розуміння того, як налаштувати Nginx.

Щоб розширити конфігурацію nginx за замовчуванням Elastic Beanstalk, додайте файли конфігурації .conf у папку, названу .ebextensions/nginx/conf.d/у пакеті джерела програми . Конфігурація nginx Elastic Beanstalk автоматично включає файли .conf у цій папці.

~/workspace/my-app/
|-- .ebextensions
|   `-- nginx
|       `-- conf.d
|           `-- myconf.conf
`-- web.jar

Налаштування зворотного проксі - Java SE

Щоб конкретно збільшити максимальний розмір завантаження, тоді створіть файл, .ebextensions/nginx/conf.d/proxy.confвстановивши максимальний розмір корпусу до потрібного розміру:

client_max_body_size 50M;

Створіть файл конфігурації Nginx безпосередньо

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

Всередині .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/Конфігурація

Сподіваюсь, це допомагає іншим!


2
Формат файлу документується на docs.aws.amazon.com/elasticbeanstalk/latest/dg/… . Прогрес реєструється в /var/log/cfn-init.log. У журналах ви повинні побачити щось подібне 2014-xx-xx xx:xx:xx,xxx [DEBUG] Writing content to /etc/nginx/conf.d/proxy.conf. Я не впевнений, але, здавалося, може знадобитися перезапуск сервера.
h-kippo

2
Працює для мене з пумою. Довелося перезапустити службу, як @Will сказав хоч (sudo service nginx reload).
Денніс

1
Сподіваємось, це може допомогти комусь іншому, оскільки це зайняло у мене деякий час ... відступ важливий - він повинен відповідати специфікації YAML - docs.saltstack.com/en/latest/topics/yaml
alexs

1
Підтверджено працюю, переконайтеся, що .ebextensionsвін не включений, .ebignoreі .gitignore🖖 мені не потрібно було перезапускати службу nginx, eb deployі це спрацювало 🎉
GabLeRoux

4
Для вузла js для мене працював другий метод (файли:). Перший не працював. Навіть AWS підтримка рекомендується використовувати другий метод для вузла Js docs.aws.amazon.com/elasticbeanstalk/latest/dg / ...
Kapil

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

Модифікувавши вищезгадану відповідь задля безпеки (а синтаксис був помилковим, бачте, два записи "власник:" в YAML), хлопці, будь ласка, не встановлюйте 777 дозволів на будь-що. Якщо вам не подобається зламати, і встановити власника файлів конфігурації Nginx на root.

Також див. Відповідь нижче, щоб зробити nginx пікап цю зміну після розгортання.


22

EDIT: Після розгортання збірки з інструкціями у прийнятій відповіді Ніка Парсонса вам може знадобитися перезапустити сервер nginx, щоб отримати зміни.

Для цього ssh до екземпляра і зробіть

sudo service nginx reload

Щоб дізнатися більше про перезавантаження, див. Http://nginx.org/en/docs/beginners_guide.html .

У попередній версії Elastic Beanstalk мені вдалося додати контейнер_команду, щоб досягти цього, але зараз я, як @cdmckay, виявляю, що це спричиняє збій розгортання. Якщо ви відновите своє середовище, він підбере параметри client_max_body_size, а також, поки ця інструкція буде у вашому конфігураційному файлі.


Це потрібно? Якщо цього не додати, як він перезапуститься?
cdmckay

На моєму досвіді я вважав це необхідним.
Буде

@cdmckay, чи можете ви сказати більше про проблеми екземпляра, викликані командою перезавантаження?
Буде

Я не надто придивився до цього, але в основному заважав моєму серверу запускатися, поки я його не видалив. Це здається не потрібним.
cdmckay

3
на моєму досвіді я вважав це необхідним, проте мені довелося додати чек, щоб перевірити, чи працює nginx, перш ніж намагатися перезапустити його для нових екземплярів - 'pgrep nginx && n nindx reload || true '
alexs

16

Прийнята відповідь не працювала для мене, оскільки у мене є додаток на базі JVM і, здається, конфігурація NGINX по-різному. Я побачив би, що файл proxy.conf створюється під час розгортання, але потім видаляється до завершення розгортання. Документація AWS пояснює, як налаштувати проксі :

Створіть .ebextensions/nginx/conf.d/proxy.confфайл, що містить лише рядок:client_max_body_size 40M;


2
На жаль, це не спрацювало для мене (одноконтейнерний Docker ELB) - навіть після перезавантаження екземпляра. Увійшовши до екземпляра через SSH, у ньому не створюється файл proxy.conf/etc/nginx/conf.d/
Udo G

Я припускаю, що це через те, що ви використовуєте Docker ELB, і він робить nginx conf по-різному. Моя відповідь - за попередньо встановлений Java-ELB.
Раймонд26

Я використовую програму elb та java. Для мене працює! Дякую!
Димитар Вукман

Як ви можете бачити файл proxy.conf, який створюється, лише зазначивши його тимчасову присутність?
rogerdpack

9

Виходячи з прийнятої відповіді, вам може знадобитися перезавантажити конфігураційний файл nginx.

Для цього додайте наступну команду

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

Це буде кращою практикою, ніж ssh'ing у вашому eb екземплярі та вручну робити це командою.

Це в поєднанні з прийнятою відповіддю вирішило те саме питання і для мене. (Рейки, Puma, NGINX)


7

Єдине, що для мене працювало - створити файл ".config" всередині .ebextensions на зразок цього:

.ebextensions/
           proxy.config

з лише цим вмістом у файлі .config:

files:
  "/etc/nginx/conf.d/proxy.conf":
     content: |
       client_max_body_size 50M;

немає необхідності в папках, немає необхідності перезавантажувати сервер додатків, зверніть увагу, що це ".config", а не ".conf" файл. не має значення ім'я файлу,

завдяки: http://kroltech.com/2014/09/14/quick-tip-increase-upload-size-in-aws-elastic-beanstalk-node-js-env/


6

Я спробував усі .ebextensionsспособи додавання конфігурації рівня реалізації, і це не допомогло мені в останній Amazon Linux AMI. Я провів багато досліджень, і, пройшовши журнали, я можу знайти завдання розгортання, коли перевірка наявності папки називається .platformкожен раз, і я думав додати її так само, як .ebextensions. Нижче наведено налаштування, які я зробив у своїй кореневій папці свого проекту.

Додайте нижче налаштування папки в кореневому рівні папки вашого проекту.

Структура папки (.platform / nginx / conf.d / proxy.conf)

.platform/
         nginx/
              conf.d/
                    proxy.conf
         00_myconf.config

Вміст файлу 1 - proxy.conf (всередині .platform/nginx/conf.d/папки)

client_max_body_size 50M;

Вміст файлу 2 - 00_myconf.config ( .platform/папка всередині )

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

Повний догляд за розширеннями. Перший файл - .conf, а другий - .config .

Тепер перерозподіліть свій проект на Amazon Elastic Beanstalk, і ви побачите магію. Ця конфігурація буде додана до всіх ваших екземплярів EC2, створених як частина автоматичного масштабування.

Детальна структура папки нижче.

введіть тут опис зображення


2
Людина !!!!!!!! Дуже дякую. Це єдиний спосіб встановити nginx config в Linux AWS EB Amazon. Я витрачав цілий день, пробуючи кожне доступне рішення !!! Я не можу висловити подяку за те, що ви знайшли час, щоб детально написати цю відповідь. Будь здоровий. Якщо у вас є якийсь патріон або рахунок meacoffee, я сприяйте. @jijo Cleetus
InfinitePrime

2
Дуже дякую. Я теж намагався використовувати всі можливі підходи, .ebextensionsі лише цей підхід працював.
ArunDhaJ

Врятувало мене безліч випробувань і невдач, щоб змусити це працювати. Не можу подякувати вам достатньо!
Джалал Ель-Шаер

Велике спасибі, це працювало і для програми Spring Boot; з еластичним бобом Talk працює томат. Випий пиво на моїй вкладці :).
Аві

5

Прийнята відповідь не спрацювала для мене, тому натомість я переставив конфігурацію 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і вона спрацювала. Ви повинні отримати таке повідомлення під час розгортання:

ІНФОРМАЦІЯ: Конфігурація 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якщо ви його використовуєте).


Дякую за це! Мені було цікаво, якою платформою ви користуєтесь? Чомусь Beanstalk не виявляє мій файл `.ebextensions / nginx / nginx.conf`, хоча він знаходиться в zip-файлі та git repo.
Icid

Запрошено до ноти. Я ігнорував, .ebextensionsщо спричинило невдачу прийнятої та популярної відповіді. Я не пробував всього іншого, що ви згадали, але дякую за замітку 🍻
GabLeRoux

3

Це рішення , що надається AWS , і воно працює (підкоригуйте розмір під свої потреби)

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/enact/12_add_nginx_configuration.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      /bin/echo "client_max_body_size 50M;" > /etc/nginx/conf.d/proxy.conf
      /sbin/service nginx reload

2

Крім того, ви можете змінити проксі-сервер на Apache. Для цього перейдіть до конфігурації та відредагуйте конфігурацію програмного забезпечення. Перший варіант тут - “Проксі-сервер”, виберіть “apache”.


Apache має власну директиву LimitRequestBody щодо встановлення максимального розміру завантажуваних файлів.
Том Харві

@TomHarvey Якщо є, будь ласка, надайте повний приклад для випадку використання LimitRequestBody?
Хасан

1

Для Golang без Docker я дотримувався цих інструкцій від aws doc:

Налаштування зворотного проксі

Якщо ви хочете включити директиви на додаток до директив блоку nginx.conf http, ви також можете надати додаткові файли конфігурації в .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папка та підпапки включені у поштовий індекс розгортання. Не потрібно перезавантажувати Nginx вручну.


1

Я боровся з тим самим питанням, але не зміг його вирішити, нарешті, він працював.

ось мій файл congfig,

files:
  "/etc/nginx/conf.d/01_proxy.conf":
    mode: "000755"
    owner: root
    group: root
    content: |
      client_max_body_size 50M;
      client_body_buffer_size 16k;

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

Проблема полягала в тому,

Я використовував сценарій python для конвеєра коду, який не включає папку .ebextensions під час створення збірки.

Ось мої кілька центів,

  1. переконайтеся, що ваша папка .ebextensions включена в zip-папку вашої збірки, яка знаходиться в s3bucket вашого облікового запису aws
  2. переконайтеся, що його немає у файлі .gitignore
  3. якщо ви використовуєте сценарій для створення збірки, переконайтеся, що він включає .ebextensions

1

Після 3-х довгих днів спроб розібратися в цьому, я заскочив на дзвінок із дивовижною командою підтримки AWS, і вони дали мені підказки щодо того, як це вирішити. По-перше, мій проект знаходиться в JAVA, і я використовую завантажувач Maven та Spring, щоб запустити його через Elastic Beanstalk (EBS).

  1. Як пояснено в документації AWS , вам потрібно мати власні налаштування nginx, що зберігаються в кореневому рівні вашого проекту. Для цього я створив файл client_max_body_size.conf і розмістив його таким чином: myprojectname /src/main/resources/ebextensions/nginx/conf.d/client_max_body_size.conf Цей файл містить лише такий рядок:

    client_max_body_size 10M;
    
  2. Налаштуйте maven для додавання цього файлу в кореневу папку мого проекту під час збирання. Це було трохи хитро, мені потрібно було додати таку конфігурацію ( джерело ) у свій POM.xml:

    <plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <id>copy-resources</id>
            <!-- here the phase you need -->
            <phase>validate</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <outputDirectory>${basedir}/target/.ebextensions</outputDirectory>
                <resources>
                    <resource>
                        <directory>src/main/resources/ebextensions</directory>
                        <filtering>true</filtering>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
    

  3. Тепер ви вже можете створити свій проект локально та запустити таку команду SSH, щоб перевірити, чи він фактично розташований у корені проекту:

    jar tf main-1.0-SNAPSHOT.jar | grep .ebextensions
    
  4. Тепер це складна частина. Завантажуючи його на EBS, ваш файл повинен містити лише файл SNAPSHOT.jar та папку .ebextensions. Наприклад, якщо зараз ви скопіюєте файл jar та папку та завантажте її вручну, вона буде працювати!

  5. Оскільки я використовую Jenkins для свого розгортання, а саме плагін AWS EBS Deployment Plugin - вам потрібно змінити налаштування файлів / папок, які ви включаєте до розгортання. Тепер я чомусь не зміг включити папку .ebextensions, тому я просто виключив усе інше, крім папки та файлу .jar. введіть тут опис зображення

Це працює!


1

Окрім client_max_body_size, мені довелося додати client_body_buffer_size . Ось точковий конфігураційний файл, який працював, для вкладення 2 Мб:

файли: "/etc/nginx/conf.d/proxy.conf":
режим: "000755"
власник: коренева
група: корінний
вміст: |
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 8 256k;
client_body_buffer_size 2М;
proxy_busy_buffers_size 256k;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
client_max_body_size 3М;


0

Для платформи Java

Для створення конфігураційного проксі-файлу NGINX слід просто додати

.ebextension/nginx/conf.d/proxy.conf файл

із вмістом client_max_body_size 20M;у ньому.

"proxy.conf" буде розгорнуто до "/etc/nginx/conf.d/proxy.conf" і автоматично включено в конфігурацію NGINX.


0

Якщо ви самі запускаєте EC2 та встановлюєте nginx, найкращим рішенням буде створити новий файл в

/etc/nginx/conf.d

папка:

sudo nano /etc/nginx/conf.d/proxy.conf

а потім додайте туди наступний рядок:

client_max_body_size 20M;

потім збережіть і перезапустіть nginx:

sudo systemctl restart nginx

Це обробка, але, якщо Elastic Beanstalk створює нові екземпляри, вам потрібно надати цю конфігурацію в кожному екземплярі. І це практично неможливо, оскільки нам потрібно постійно контролювати дані про EC2, а процес перезавантаження nginx - це не завжди добре
Jijo Cleetus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.