Увеличение client_max_body_size в Nginx conf на AWS Elastic Beanstalk

124

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

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

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

Ник Парсонс
источник
1
В наши дни по умолчанию используется всего 1
МБ
Следует отметить, что все предоставленные решения не поддерживают развертывание .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. Это изменение позволило увеличить размер тела сообщения.

Внутри .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
Формат файла задокументирован по адресу 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
У меня работает с puma. Пришлось перезапустить службу, как сказал @Will (sudo service nginx reload).
Деннис
1
Надеюсь, это может помочь кому-то другому, так как это заняло у меня время ... отступ важен - он должен соответствовать спецификации YAML - docs.saltstack.com/en/latest/topics/yaml
alexs
4
Для node js у меня сработал второй метод (files :). Первый не сработал. Даже служба поддержки AWS посоветовала использовать второй метод для node js docs.aws.amazon.com/elasticbeanstalk/latest/dg/…
Капил
2
Я только что протестировал оба варианта среды ElasticBeanstalk + Java8, и первый мне помог. Второй - нет. Надеюсь, поможет!.
Рафаэль Лариос
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 принять это изменение после развертывания.

user3217794
источник
22

РЕДАКТИРОВАТЬ: после того, как вы развернули сборку с инструкциями в принятом ответе Ника Парсонса, вам может потребоваться перезапустить сервер nginx, чтобы принять изменения.

Для этого подключитесь к экземпляру по ssh и выполните

sudo service nginx reload

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

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

Будет
источник
Это необходимо? Если этого не добавить, как он перезапустится?
cdmckay
По своему опыту я счел это необходимым.
Уилл
@cdmckay, можете ли вы подробнее рассказать о проблемах экземпляра, вызванных командой перезагрузки?
Уилл
Я не рассматривал это слишком внимательно, но в основном это мешало моему серверу запускаться, пока я не удалил его. В этом нет необходимости.
cdmckay
3
по своему опыту я обнаружил, что это необходимо, однако мне пришлось добавить проверку, чтобы увидеть, работает ли nginx, прежде чем пытаться перезапустить его для новых экземпляров - 'pgrep nginx && service nginx reload || true '
Alexs
16

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

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

Raymond26
источник
2
К сожалению, у меня это не сработало (одноконтейнерный Docker ELB) - даже после перезагрузки экземпляра. Вход в экземпляр через SSH, в котором не создается файл proxy.conf/etc/nginx/conf.d/
Удо Дж,
Я предполагаю, что это из-за того, что вы используете Docker ELB, а nginx conf по-другому. Мой ответ касается ELB с предустановкой Java.
Raymond26 08
Я использую приложение elb и java. Работает для меня! Спасибо!
Димитар Вукман
Как вы можете увидеть создаваемый файл proxy.conf, просто отметив его временное присутствие?
rogerdpack
9

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

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

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

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

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

ConorB
источник
9

Я испробовал все .ebextensionsспособы добавления конфигурации уровня реализации, и это не помогло мне в последней версии AMI Amazon Linux. Я провел много исследований и после просмотра журналов обнаружил, что средство выполнения задач развертывания проверяет наличие папки, называемой .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, созданным в рамках автоматического масштабирования.

Подробная структура папок ниже.

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

Джиджо Клитус
источник
4
Мужчина!!!!!!!! Огромное спасибо. Это единственный способ установить конфигурацию nginx в AWS EB Amazon linux. Я потратил целый день, пробуя все доступные решения !!! Я не могу выразить, как поблагодарить вас за то, что вы нашли время написать этот ответ подробно. Будьте здоровы. Если у вас есть какая-то учетная запись patreon или buymeacoffee, я внесу свой вклад. @jijo Cleetus
InfinitePrime
3
Большое спасибо. Я тоже перепробовал все возможные подходы, .ebextensionsи только этот подход сработал.
ArunDhaJ
1
Сэкономил мне массу испытаний и неудач, заставив это работать. Не могу вас отблагодарить!
Джалал Эль-Шаер,
2
Большое спасибо, это сработало и для приложения Spring Boot; с Elastic Beans Talk под управлением кота. Выпей пива на моей вкладке :).
Awi
1
Кто-нибудь нашел ссылку на это в документах AWS?
ионутаб
7

Единственное, что у меня сработало, это создать файл ".config" внутри .ebextensions следующим образом:

.ebextensions/
           proxy.config

только с этим содержимым в файле .config:

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

нет необходимости во вложенных папках, нет необходимости перезапускать сервер приложений, обратите внимание, что внутри .ebextensions находится файл «.config», а не «.conf», и используйте правильный отступ, чтобы избежать ошибок в консоли aws, в остальном все то же не имеет значения имя файла,

спасибо: http://kroltech.com/2014/09/14/quick-tip-increase-upload-size-in-aws-elastic-beanstalk-node-js-env/

Эд Виейра
источник
5

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

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

Я подключился по SSH к работающему экземпляру моего приложения 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вами).

kskyriacou
источник
Спасибо за это! Мне было интересно, какую платформу вы использовали? По какой-то причине Beanstalk не обнаруживает мой файл `.ebextensions / nginx / nginx.conf`, даже если он находится в zip-файле и репозитории git.
Icid
Проголосовали за заметку. Я игнорировал то, .ebextensionsчто привело к тому, что принятый и популярный ответ потерпел неудачу. Я не пробовал все остальное, что вы упомянули, но спасибо за заметку Gab
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:

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

Если вы хотите включить директивы в дополнение к директивам в http-блоке nginx.conf, вы также можете предоставить дополнительные файлы конфигурации в .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/корне моего проекта, просто с одной строкой внутри:

client_max_body_size 20M;

Если это по-прежнему не работает, убедитесь, что .ebextensionsпапка и подпапки включены в ZIP-архив развертывания. Нет необходимости перезапускать Nginx вручную.

паскаль
источник
1

Я боролся с той же проблемой, но не смог ее решить, наконец, она заработала.

вот мой файл конфигурации,

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

После трех долгих дней попыток разобраться в этой проблеме я сразу же позвонил в замечательную службу поддержки AWS, и они дали мне несколько подсказок о том, как ее решить. Во-первых, мой проект находится на JAVA, и я использую maven и spring boot, чтобы запустить его через 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, вам необходимо изменить настройки файлов / папки, которые вы включаете в развертывание. По какой-то причине мне не удалось включить папку .ebextensions, поэтому я просто исключил все остальное, кроме папки и файла .jar. введите описание изображения здесь

Это работает!

Янир Чалисар
источник
1

В дополнение к client_max_body_size мне пришлось добавить client_body_buffer_size . Вот файл конфигурации точек, который работал для вложения 2 МБ:

файлы: "/etc/nginx/conf.d/proxy.conf":
режим: "000755"
владелец: корневая
группа: корневое
содержимое: |
proxy_buffering включен;
proxy_buffer_size 128k;
proxy_buffers 8 256k;
client_body_buffer_size 2M;
proxy_busy_buffers_size 256 КБ;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32 КБ;
client_max_body_size 3M;

Норма
источник
0

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

Чтобы создать прокси-файл конфигурации NGINX, вам нужно просто добавить

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

с содержанием client_max_body_size 20M;в нем.

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

Lyudmyla
источник
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
Aerodynamika
источник
Это обходной путь, но если Elastic Beanstalk создает новые экземпляры, вам необходимо предоставить эту конфигурацию для каждого экземпляра. И это практически невозможно, так как нам нужно постоянно следить за состояниями EC2, а процесс перезапуска nginx не
всегда