Увеличивает клиент_макс_body_size в Nginx conf на AWS Elastic Beanstalk

Я столкнулся с ошибками 413 "Запросить сущность слишком больших" при отправке файлов размером более 10 МБ в наш API, работающий на AWS Elastic Beanstalk.

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

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

Ответ 1

Для этого есть два способа. К сожалению, некоторые из них работают для некоторых типов приложений EB, а некоторые - для других.

Поддерживается/рекомендуется в документации AWS

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

Чтобы расширить конфигурацию nginx Elastic Beanstalk по умолчанию, добавьте файлы конфигурации .conf в папку с именем .ebextensions/nginx/conf.d/ в вашем исходном пакете приложения. Конфигурация Elastic Beanstalk nginx автоматически включает файлы .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

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

Изменил приведенный выше ответ в целях безопасности (и синтаксис был неправильным, см. Две записи "владелец:" в YAML), ребята, пожалуйста, не устанавливайте 777 разрешений для НИЧЕГО. Если вам не нравится взлом, и установите владельца конфигурационных файлов Nginx как root.

Также смотрите ответ ниже, чтобы nginx смог выполнить это изменение после развертывания.

Ответ 3

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

Для этого ssh в экземпляр и do

sudo service nginx reload

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

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

Ответ 4

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

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

Ответ 5

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

Чтобы сделать это, добавьте следующую команду

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

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

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

Ответ 6

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

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

I 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, если вы его используете).

Ответ 7

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

Ответ 8

Для Golang без Докера я выполнил эти инструкции из aws doc:

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

Если вы хотите включить директивы в дополнение к файлам в блоке 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 вручную.

Ответ 9

Единственное, что мне помогло, - это создать файл .config внутри .ebextensions, например так:

.ebextensions/
           proxy.config

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

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

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

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

Ответ 10

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

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

.ebextension/nginx/conf.d/proxy.conf

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

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