AWS Elastic Beanstalk의 Nginx conf에서 client_max_body_size 늘리기


121

나는 실행 해요 "413 요청 엔티티가 너무 큼" AWS 탄성 콩 줄기에서 실행 우리의 API에 10메가바이트보다 큰 파일을 게시 할 때 오류가 발생합니다.

저는 꽤 많은 연구를 수행 했으며 Nginx에 대한 client_max_body_size늘려야 한다고 생각 하지만 Elastic Beanstalk를 사용하여이를 수행하는 방법에 대한 문서를 찾을 수없는 것 같습니다. 내 생각 엔 ebetension 파일을 사용하여 수정해야한다는 것입니다.

누구든지 내가 어떻게 한도를 올릴 수 있는지에 대한 생각이 있습니까? 10MB는 매우 약합니다. 수동으로 올리는 방법이 있어야합니다.


1
요즘 기본값은 1MB입니다 ...
rogerdpack

기록을 위해 제공된 모든 솔루션은 .NET 배포를 다루지 않습니다. AWS Elastic Beanstalk에서 .NET을 사용하는 경우 프로젝트에서 IIS 설정을 구성해야합니다. 나를 위해 net471 앱에서 web.config를 구성해야했습니다.
SimonH

답변:


223

이를 위해 취할 수있는 두 가지 방법이 있습니다. 불행히도 일부는 일부 EB 응용 프로그램 유형에서 작동하고 일부는 다른 유형에서 작동합니다.

AWS 설명서에서 지원 / 권장

Java SE , Go , Node.js 및 Ruby와 같은 일부 애플리케이션 유형의 경우 (Ruby 용으로 문서화되어 있지 않지만 다른 모든 Nginx 플랫폼에서이를 지원하는 것 같습니다) Elasticbeanstalk는 Nginx 구성 방법에 대한 이해가 내장되어 있습니다.

Elastic Beanstalk의 기본 nginx 구성을 확장하려면 애플리케이션 소스 번들 이라는 폴더에 .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 지원 팀과 많은 연구와 시간을 들여 작업 한 끝에 .ebextensionsnginx 구성을 보완하기 위해 내부에 구성 파일을 만들었습니다 . 이 변경으로 더 큰 게시물 본문 크기가 허용되었습니다.

.ebextensions디렉토리 안에 01_files.config다음 내용으로 라는 파일을 만들었습니다 .

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

그러면 /etc/nginx/conf.d 디렉토리에 proxy.conf 파일이 생성됩니다. 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
퓨마와 함께 일하고 있습니다. @Will과 같은 서비스를 다시 시작해야했습니다 (sudo service nginx reload).
Dennis

1
잠시 시간이 걸렸기 때문에 다른 사람에게 도움이 되기를 바랍니다
alexs

1
확인 작업은 확인 .ebextensions하지 않을 .ebignore.gitignore🖖 내가 Nginx에 서비스를 다시 시작해야하지 않았다 eb deploy🎉 그리고 일
GabLeRoux

4
노드 js의 경우 두 번째 방법 (files :)이 저에게 효과적이었습니다. 첫 번째는 작동하지 않았습니다. 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의 두 개의 'owner :'항목 참조), 여러분, ANYTHING에 777 권한을 설정하지 마십시오. 해킹을 즐기지 않는 한 Nginx 구성 파일의 소유자를 루트로 설정하십시오.

또한 배포 후 nginx 픽업이 변경되도록 아래 답변 을 참조하십시오 .


22

편집 : Nick Parsons가 수락 한 답변의 지침으로 빌드를 배포 한 후 변경 사항을 적용하려면 nginx 서버를 다시 시작해야 할 수 있습니다.

이렇게하려면 인스턴스에 ssh를 실행하고

sudo service nginx reload

다시로드에 대한 자세한 내용은 http://nginx.org/en/docs/beginners_guide.html을 참조 하십시오 .

이전 버전의 Elastic Beanstalk에서는이 작업을 수행하기 위해 container_command를 추가 할 수 있었지만 이제는 @cdmckay와 같이 이로 인해 배포 실패가 발생한다는 것을 알게되었습니다. 환경을 다시 빌드하는 경우 해당 지침이 구성 파일에있는 한 client_max_body_size 설정을 선택합니다.


이것이 필요합니까? 이것을 추가하지 않으면 어떻게 다시 시작됩니까?
cdmckay 2015

내 경험상 나는 이것이 필요하다는 것을 알았다.
Will :

@cdmckay reload 명령으로 인해 발생한 인스턴스 문제에 대해 더 자세히 말할 수 있습니까?
Will

너무 자세히 조사하지는 않았지만 기본적으로 서버를 제거 할 때까지 서버가 시작되지 않았습니다. 필요하지 않은 것 같습니다.
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;


2
불행히도 인스턴스를 재부팅 한 후에도 작동하지 않았습니다 (단일 컨테이너 Docker ELB). SSH를 통해 인스턴스에 로그인하는 것은에서 생성되는 더 proxy.conf 파일이 없습니다/etc/nginx/conf.d/
우도 G

Docker ELB를 사용하고 있으며 nginx conf를 다르게 수행한다는 사실 때문이라고 가정하고 있습니다. 내 대답은 Java 사전 설정 ELB입니다.
Raymond26

elb 및 Java 앱을 사용하고 있습니다. 나를 위해 작동합니다! 감사!
Dimitar Vukman

일시적인 존재에 주목하면서 생성되는 proxy.conf 파일을 어떻게 볼 수 있습니까?
rogerdpack

9

수락 된 답변에 따라 nginx 구성 파일을 다시로드해야 할 수 있습니다.

이렇게하려면 다음 명령을 추가하십시오.

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

이것은 eb 인스턴스에 ssh'ing하고 명령을 사용하여 수동으로 수행하는 것보다 더 나은 방법입니다.

이것은 받아 들인 대답과 결합되어 나에게 동일한 문제를 해결했습니다. (레일, 퓨마, NGINX)


7

나를 위해 일한 유일한 것은 다음과 같이 .ebextensions 안에 ".config"파일을 만드는 것입니다.

.ebextensions/
           proxy.config

.config 파일에이 내용 만 포함 :

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

하위 폴더가 필요하지 않고, 애플리케이션 서버를 다시 시작할 필요가 없습니다. .ebextensions 내부의 ".conf"파일이 아닌 ".config"에주의하고 aws 콘솔에서 오류를 방지하기 위해 적절한 들여 쓰기를 사용하면 나머지는 동일합니다. 파일 이름은 중요하지 않습니다.

덕분에 : 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에 다시 배포하면 마술을 볼 수 있습니다. 이 구성은 Auto Scaling의 일부로 생성 된 모든 EC2 인스턴스에 추가됩니다.

아래에 자세한 폴더 구조가 있습니다.

여기에 이미지 설명 입력


2
남자!!!!!!!! 정말 고맙습니다. 이것이 AWS EB Amazon Linux에서 nginx 구성을 설정하는 유일한 방법입니다. 나는 사용 가능한 모든 솔루션을 시도하면서 하루 종일 낭비했습니다 !!! 시간을내어이 답변을 자세히 작성해 주셔서 감사합니다. 축복합니다. 어떤 종류의 patreon 또는 buymeacoffee 계정이 있으면 기여합니다. @jijo Cleetus
InfinitePrime

2
감사합니다. 나도 사용 가능한 모든 접근 방식을 시도했지만 .ebextensions이 접근 방식 만 작동했습니다.
ArunDhaJ

이 작업을 수행하는 데 많은 시도와 실패를 저장했습니다. 충분히 감사 할 수 없습니다!
Jalal El-Shaer

감사합니다. 이것은 Spring Boot 애플리케이션에서도 작동했습니다. Tomcat을 실행하는 Elastic Beans Talk로. 내 탭에서 맥주를 ​​마셔 :).
Awi

5

받아 들여진 대답이 나를 위해 작동하지 않았으므로 대신 nginx 구성을 내 구성으로 덮어 썼습니다.

nginx.conf디렉토리 아래에 라는 파일을 만들었습니다..ebextensions/nginx/

내 Beanstalk 앱의 실행중인 인스턴스에 SSH로 연결하고 nginx.conf 사용 cat /etc/nginx/nginx.conf하고 터미널에서 사용 및 복사 하여 파일 .

nginx.conf이전에에서 만든 파일에 내용을 붙여넣고 다음 .ebextensions/nginx/을 포함하도록 http 지시문을 수정했습니다.client_max_body_size 50M; . 마침내 사용하여 내 앱을 재배포 eb deploy했고 작동했습니다. 배포 중에 다음 메시지를 받아야합니다.

정보 : '.ebextensions / nginx'디렉토리에서 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가 배포 중에 생성되고 Beanstalk에 업로드 된 .zip 파일의 일부인지 확인하십시오 ( 사용중인 경우 .gitignore또는 에서 무시되지 않음 .ebignore).


감사합니다! 그래도 어떤 플랫폼을 사용하고 있는지 궁금합니다. 어떤 이유로 Beanstalk는 zip 파일과 git repo에 있더라도 내`.ebextensions / nginx / nginx.conf` 파일을 감지하지 못합니다.
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에는 업로드 된 파일의 최대 크기를 설정하는 자체 LimitRequestBody 지시문이 있습니다.
Tom Harvey

@TomHarvey 가능한 경우 사용 사례에 대한 전체 예제를 친절하게 제공 LimitRequestBody하시겠습니까?
Hasan

1

Docker가없는 Golang의 경우 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/.

client_max_body_size 20M;

그래도 작동하지 않으면 .ebextensions폴더 및 하위 폴더가 배포 zip에 포함되어 있는지 확인하십시오 . 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"

문제는

빌드를 생성하는 동안 .ebextensions 폴더를 포함하지 않는 코드 파이프 라인에 Python 스크립트를 사용하고있었습니다.

여기 내 몇 센트가 있습니다.

  1. aws 계정의 s3bucket에있는 빌드의 zip 폴더에 .ebextensions 폴더가 포함되어 있는지 확인하십시오.
  2. .gitignore 파일에 없는지 확인하십시오.
  3. 스크립트를 사용하여 빌드를 생성하는 경우 .ebextensions가 포함되어 있는지 확인하십시오.

1

3 일 동안이 문제를 해결하려고 노력한 끝에 놀라운 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에 다음 구성 ( source ) 을 추가해야 했습니다.

    <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. 배포, 특히 AWS EBS 배포 플러그인에 Jenkins를 사용 하고 있으므로 배포에 포함하는 파일 / 폴더의 설정을 변경해야합니다. 이제 어떤 이유로 .ebextensions 폴더를 포함 할 수 없었기 때문에 폴더와 .jar 파일을 제외한 다른 모든 항목을 제외했습니다. 여기에 이미지 설명 입력

작동합니다!


1

client_max_body_size 외에도 client_body_buffer_size 를 추가해야했습니다 . 다음은 2MB 첨부 파일에 대해 작동하는 도트 구성 파일입니다.

파일 : "/etc/nginx/conf.d/proxy.conf":
모드 : "000755"
소유자 : 루트
그룹 : 루트
콘텐츠 : |
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 8256k;
client_body_buffer_size 2M;
proxy_busy_buffers_size 256k;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
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 구성에 자동으로 포함됩니다.


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.