it-roy-ru.com

Увеличение client_max_body_size в конфигурации Nginx на AWS Elastic Beanstalk

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

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

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

92
Nick Parsons

Для этого есть два способа:

Поддерживается/рекомендуется в документации 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

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

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

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

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

31
user3217794

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

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

Sudo service nginx reload

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

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

20
Will

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

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

14
Raymond26

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

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

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

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

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

7
ConorB

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

3
kskyriacou

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

2
David Smits

Единственное, что мне помогло, - это создать файл .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/

1
felipe

Для 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/ в корне моего проекта, просто внутри 1 строка:

client_max_body_size 20M;

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

1
pascal

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

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

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

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

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

0
Lyudmyla