Tăng client_max_body_size trong Nginx conf trên AWS Elastic Beanstalk


121

Tôi đang gặp phải lỗi "413 Đối tượng Yêu cầu Quá lớn" khi đăng các tệp lớn hơn 10MB lên API của chúng tôi đang chạy trên AWS Elastic Beanstalk.

Tôi đã thực hiện khá nhiều nghiên cứu và tin rằng tôi cần nâng cấp client_max_body_size cho Nginx, tuy nhiên, dường như tôi không thể tìm thấy bất kỳ tài liệu nào về cách thực hiện việc này bằng Elastic Beanstalk. Tôi đoán rằng nó cần được sửa đổi bằng cách sử dụng tệp ebetension.

Bất cứ ai có suy nghĩ về cách tôi có thể tăng giới hạn? 10MB là khá yếu, phải có cách để tăng dung lượng này theo cách thủ công.


1
Ngày nay, mặc định chỉ là 1MB ...
rogerdpack

Đối với hồ sơ, tất cả các giải pháp được cung cấp không giải quyết được việc triển khai .NET. Nếu bạn sử dụng .NET trong AWS Elastic Beanstalk, bạn phải định cấu hình cài đặt IIS trong dự án của mình. Đối với tôi, tôi phải định cấu hình web.config trong ứng dụng net471 của mình.
SimonH

Câu trả lời:


223

Có hai phương pháp bạn có thể thực hiện cho việc này. Thật không may, một số hoạt động cho một số loại ứng dụng EB và một số hoạt động cho những loại khác.

Được hỗ trợ / khuyến nghị trong tài liệu AWS

Đối với một số loại ứng dụng, như Java SE , Go , Node.js và có thể là Ruby (nó không được ghi lại cho Ruby, nhưng tất cả các nền tảng Nginx khác dường như hỗ trợ điều này), Elasticbeanstalk có sẵn hiểu biết về cách cấu hình Nginx.

Để mở rộng cấu hình nginx mặc định của Elastic Beanstalk, hãy thêm tệp cấu hình .conf vào thư mục có tên .ebextensions/nginx/conf.d/trong gói nguồn ứng dụng của bạn . Cấu hình nginx của Elastic Beanstalk bao gồm các tệp .conf trong thư mục này tự động.

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

Định cấu hình Reverse Proxy - Java SE

Để tăng kích thước tải lên tối đa một cách cụ thể, sau đó tạo một tệp khi .ebextensions/nginx/conf.d/proxy.confđặt kích thước nội dung tối đa thành bất kỳ kích thước nào bạn muốn:

client_max_body_size 50M;

Tạo trực tiếp tệp cấu hình Nginx

Sau nhiều nghiên cứu và hàng giờ làm việc với nhóm hỗ trợ AWS tuyệt vời, tôi đã tạo một tệp cấu hình bên trong .ebextensionsđể bổ sung cấu hình nginx. Thay đổi này cho phép kích thước nội dung bài đăng lớn hơn.

Bên trong .ebextensionsthư mục, tôi đã tạo một tệp có tên 01_files.configvới nội dung sau:

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

Thao tác này tạo tệp proxy.conf bên trong thư mục /etc/nginx/conf.d. Tệp proxy.conf chỉ chứa một lớp lót client_max_body_size 20M;thực hiện thủ thuật.

Lưu ý rằng đối với một số nền tảng, tệp này sẽ được tạo trong quá trình triển khai, nhưng sau đó sẽ bị xóa trong giai đoạn triển khai sau.

Bạn có thể chỉ định các lệnh khác được nêu trong tài liệu Nginx.

http://wiki.nginx.org/Configuration

Hy vọng điều này sẽ giúp những người khác!


2
Định dạng tệp được ghi lại tại docs.aws.amazon.com/elasticbeanstalk/latest/dg/… . Tiến trình được ghi lại tại /var/log/cfn-init.log. Trong các bản ghi, bạn sẽ thấy một cái gì đó như thế nào 2014-xx-xx xx:xx:xx,xxx [DEBUG] Writing content to /etc/nginx/conf.d/proxy.conf. Tôi không chắc, nhưng có vẻ như việc khởi động lại máy chủ có thể là cần thiết.
h-kippo

2
Làm việc cho tôi với puma. Đã phải khởi động lại dịch vụ như @Will đã nói (tải lại dịch vụ sudo nginx).
Dennis

1
Hy vọng có thể giúp đỡ này người khác vì nó đã cho tôi một thời gian ... thụt đầu dòng là rất quan trọng - nó phải phù hợp với các các YAML spec - docs.saltstack.com/en/latest/topics/yaml
alexs

1
Làm việc khẳng định, chắc chắn .ebextensionskhông có trong .ebignore.gitignore🖖 Tôi không cần phải khởi động lại nginx dịch vụ, eb deployvà nó làm việc 🎉
GabLeRoux

4
Đối với nút js, phương pháp thứ hai (files:) phù hợp với tôi. Cái đầu tiên không hoạt động. Ngay cả bộ phận hỗ trợ AWS cũng khuyên bạn nên sử dụng phương pháp thứ hai cho nút 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;

Đã sửa đổi câu trả lời ở trên vì lý do bảo mật (và cú pháp sai, hãy xem, hai mục nhập 'chủ sở hữu:' trong YAML), các bạn, vui lòng không đặt quyền 777 trên BẤT CỨ THỨ GÌ. Trừ khi bạn thích bị tấn công và đặt chủ sở hữu của các tệp cấu hình Nginx thành root.

Ngoài ra, hãy xem câu trả lời bên dưới để thực hiện thay đổi nginx này sau khi triển khai.


22

CHỈNH SỬA: Sau khi bạn đã triển khai một bản dựng với các hướng dẫn trong câu trả lời được chấp nhận bởi Nick Parsons, bạn có thể cần phải khởi động lại máy chủ nginx để nhận các thay đổi.

Để thực hiện việc này, hãy chuyển đến phiên bản và thực hiện

sudo service nginx reload

Để tìm hiểu thêm về cách tải lại, hãy xem http://nginx.org/vi/docs/beginners_guide.html .

Trong phiên bản trước của Elastic Beanstalk, tôi đã có thể thêm container_command để thực hiện điều này, nhưng bây giờ tôi phát hiện ra, chẳng hạn như @cdmckay, điều này gây ra lỗi triển khai. Nếu bạn xây dựng lại môi trường của mình, nó sẽ chọn cài đặt client_max_body_size cũng như hướng dẫn đó trong tệp cấu hình của bạn.


Điều này có cần thiết không? Nếu bạn không thêm cái này, nó sẽ khởi động lại như thế nào?
cdmckay

Theo kinh nghiệm của tôi, tôi thấy điều này cần thiết.
Will

@cdmckay bạn có thể nói thêm về các vấn đề phiên bản mà lệnh tải lại gây ra không?
Will

Tôi đã không xem xét nó quá kỹ, nhưng về cơ bản nó đã ngăn máy chủ của tôi khởi chạy cho đến khi tôi xóa nó. Nó dường như không cần thiết.
cdmckay

3
theo kinh nghiệm của tôi, tôi thấy điều này là cần thiết, tuy nhiên, tôi phải thêm một kiểm tra để xem liệu nginx có đang chạy hay không trước khi thử khởi động lại nó cho các phiên bản mới - 'pgrep nginx && service nginx reload || true '
alexs

16

Câu trả lời được chấp nhận không phù hợp với tôi vì tôi có một ứng dụng dựa trên JVM và nó có vẻ thực hiện cấu hình NGINX theo cách khác. Tôi sẽ thấy tệp proxy.conf được tạo trong quá trình triển khai nhưng sau đó bị xóa trước khi quá trình triển khai hoàn tất. Tài liệu AWS giải thích cách định cấu hình proxy :

Tạo một .ebextensions/nginx/conf.d/proxy.conftệp chỉ chứa dòng:client_max_body_size 40M;


2
Thật không may, điều đó không hoạt động với tôi ( Docker ELB một vùng chứa ) - thậm chí không phải sau khi khởi động lại phiên bản. Đăng nhập vào ví dụ thông qua SSH không có tập tin proxy.conf được tạo ra trong/etc/nginx/conf.d/
Udo G

Tôi cho rằng đó là vì thực tế là bạn đang sử dụng Docker ELB và nó hoạt động khác nhau. Câu trả lời của tôi là dành cho ELB cài sẵn Java.
Raymond 26

Tôi đang sử dụng ứng dụng elb và java. Làm việc cho tôi! Cảm ơn!
Dimitar Vukman,

Làm thế nào bạn có thể thấy tệp proxy.conf đang được tạo, chỉ cần ghi nhận sự hiện diện tạm thời của nó?
rogerdpack

9

Tiếp theo từ câu trả lời được chấp nhận, bạn có thể cần tải lại tệp cấu hình nginx.

Để thực hiện việc này, hãy thêm lệnh sau

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

Điều này sẽ là cách thực hành tốt hơn là ssh'ing vào phiên bản eb của bạn và thực hiện thủ công bằng lệnh.

Điều này kết hợp với câu trả lời được chấp nhận đã giải quyết cùng một vấn đề cho tôi. (Rails, Puma, NGINX)


7

Điều duy nhất phù hợp với tôi là tạo tệp ".config" bên trong .ebextensions như thế này:

.ebextensions/
           proxy.config

chỉ với nội dung này trong tệp .config:

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

không cần thư mục con, không cần khởi động lại máy chủ ứng dụng, hãy chú ý rằng đó là tệp ".config" không phải là tệp ".conf" bên trong .ebextensions và việc sử dụng thụt lề thích hợp để tránh lỗi trong bảng điều khiển aws, phần còn lại là giống nhau không quan trọng tên của tệp,

cảm ơn: http://kroltech.com/2014/09/14/quick-tip-increase-upload-size-in-aws-elastic-beanstalk-node-js-env/


6

Tôi đã thử tất cả các .ebextensionsphương pháp thêm cấu hình cấp độ triển khai và nó không giúp được tôi trong Amazon Linux AMI mới nhất. Tôi đã nghiên cứu rất nhiều và sau khi xem qua nhật ký, tôi có thể tìm thấy trình chạy tác vụ triển khai đang kiểm tra một thư mục có tên .platformmọi lúc và tôi đã nghĩ đến việc thêm một thư mục giống như .ebextensions. Dưới đây là cài đặt tôi đã thực hiện trong thư mục gốc của dự án của mình.

Thêm thiết lập thư mục bên dưới trong cấp độ gốc của thư mục dự án của bạn.

Cấu trúc thư mục (.platform / nginx / conf.d / proxy.conf)

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

Nội dung của Tệp 1 - proxy.conf ( .platform/nginx/conf.d/Thư mục bên trong )

client_max_body_size 50M;

Nội dung của Tệp 2 - 00_myconf.config ( .platform/Thư mục bên trong )

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

Chăm sóc đầy đủ với các phần mở rộng. Tệp đầu tiên là .conf và tệp thứ hai là .config .

Bây giờ hãy triển khai lại dự án của bạn với Amazon Elastic Beanstalk và bạn sẽ thấy điều kỳ diệu. Cấu hình này sẽ được thêm vào tất cả các phiên bản EC2 của bạn, được tạo như một phần của quy mô tự động.

Cấu trúc thư mục chi tiết bên dưới.

nhập mô tả hình ảnh ở đây


2
Đàn ông!!!!!!!! Cảm ơn bạn rất nhiều. Đây là cách duy nhất để đặt cấu hình nginx trong AWS EB Amazon linux. Tôi đã lãng phí cả ngày để thử mọi giải pháp có sẵn !!! Tôi không thể diễn tả bằng cách nào để cảm ơn bạn đã dành thời gian để viết câu trả lời này một cách chi tiết. Chúc phúc cho bạn. Nếu bạn có một số loại patreon hoặc tài khoản buymeacoffee, Il đóng góp. @jijo Cleetus
InfinitePrime

2
Cảm ơn rất nhiều. Tôi cũng đã thử tất cả các phương pháp có thể sử dụng .ebextensionsvà chỉ cách tiếp cận này hoạt động.
ArunDhaJ

Đã tiết kiệm cho tôi rất nhiều thử nghiệm và thất bại khi làm việc này. Không thể cảm ơn đủ!
Jalal El-Shaer

Cảm ơn rất nhiều, điều này cũng hoạt động cho một ứng dụng Spring Boot; với Elastic Beans Talk đang chạy tomcat. Có một cốc bia trên tab của tôi :).
Awi

5

Câu trả lời được chấp nhận không hoạt động với tôi, vì vậy thay vào đó tôi đã ghi đè cấu hình nginx bằng chính cấu hình của mình.

Tôi đã tạo một tệp có tên nginx.conftrong thư mục.ebextensions/nginx/

Tôi đã SSH vào một phiên bản đang chạy của ứng dụng Beanstalk của mình và sao chép nội dung của nginx.conftệp, sử dụng cat /etc/nginx/nginx.confvà sao chép từ thiết bị đầu cuối.

Tôi đã dán nội dung vào nginx.conftệp mà tôi đã tạo trước đó .ebextensions/nginx/và sửa đổi chỉ thị http để đưa vào client_max_body_size 50M;. Cuối cùng tôi đã triển khai lại ứng dụng của mình bằng cách sử dụng eb deployvà nó đã hoạt động. Bạn sẽ nhận được thông báo sau trong quá trình triển khai:

THÔNG TIN: Đã phát hiện cấu hình Nginx trong thư mục '.ebextensions / nginx'. AWS Elastic Beanstalk sẽ không quản lý cấu hình Nginx cho môi trường này nữa.

Đây là nội dung trong .ebextensions/nginx/nginx.conftệp của tôi :

# 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;
}

Tôi không phải khởi động lại dịch vụ nginx cũng như môi trường.

Lưu ý : Đảm bảo rằng .ebextensions của bạn là một phần của tệp .zip được tạo và tải lên Beanstalk trong quá trình triển khai (nó không bị bỏ qua trong .gitignorehoặc .ebignorenếu bạn đang sử dụng).


Cảm ơn vì điều đó! Tôi đã tự hỏi bạn đang sử dụng nền tảng nào? Vì một số lý do Beanstalk không phát hiện ra tệp `.ebextensions / nginx / nginx.conf` của tôi mặc dù nó nằm trong tệp zip và git repo.
Icid

Đã ủng hộ cho ghi chú. Tôi đã bỏ qua nguyên .ebextensionsnhân khiến câu trả lời được chấp nhận và phổ biến không thành công. Tôi đã không thử mọi thứ khác mà bạn đã đề cập, nhưng cảm ơn vì đã ghi chú 🍻
GabLeRoux

3

Đây là giải pháp được AWS cung cấp và nó hoạt động (điều chỉnh kích thước theo nhu cầu của bạn)

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

Ngoài ra, bạn có thể thay đổi máy chủ proxy thành Apache. Để thực hiện việc này, hãy đi tới Cấu hình và Chỉnh sửa Cấu hình Phần mềm. Tùy chọn đầu tiên ở đây là “Máy chủ proxy”, chọn “apache”.


Apache có chỉ thị LimitRequestBody của riêng nó để đặt kích thước tối đa của các tệp được tải lên.
Tom Harvey,

@TomHarvey Nếu có, bạn vui lòng cung cấp một ví dụ đầy đủ cho trường hợp sử dụng với LimitRequestBody?
Hasan

1

Đối với Golang không có Docker, tôi đã làm theo các hướng dẫn sau từ tài liệu aws:

Định cấu hình Reverse Proxy

Nếu bạn muốn bao gồm các lệnh ngoài các lệnh trong khối http nginx.conf, bạn cũng có thể cung cấp các tệp cấu hình bổ sung trong .ebextensions/nginx/conf.d/thư mục của gói nguồn của mình. Tất cả các tệp trong thư mục này phải có phần mở rộng .conf. http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/go-enosystem.html#go-complex-apps

Tôi đã tạo tệp proxy.conftrong thư .ebextensions/nginx/conf.d/mục gốc của dự án của mình, chỉ với 1 dòng bên trong:

client_max_body_size 20M;

Nếu nó vẫn không hoạt động, hãy đảm bảo rằng .ebextensionsthư mục và các thư mục con được bao gồm trong zip triển khai của bạn. Không cần phải khởi động lại Nginx theo cách thủ công.


1

Tôi đã vật lộn với cùng một vấn đề nhưng không thể giải quyết nó, cuối cùng nó đã hoạt động.

đây là tệp congfig của tôi,

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"

Vấn đề là,

Tôi đang sử dụng tập lệnh python cho đường ống mã không bao gồm thư mục .ebextensions trong khi tạo bản dựng.

Đây là vài xu của tôi,

  1. đảm bảo rằng thư mục .ebextensions của bạn được bao gồm trong thư mục zip của bản dựng nằm trong s3bucket của tài khoản aws của bạn
  2. đảm bảo rằng nó không có trong tệp .gitignore
  3. nếu bạn đang sử dụng một tập lệnh để tạo bản dựng, hãy đảm bảo rằng nó bao gồm .ebextensions

1

Sau 3 ngày dài cố gắng tìm ra vấn đề này, tôi đã thực hiện một cuộc gọi với nhóm hỗ trợ AWS tuyệt vời và họ đã cho tôi một số manh mối về cách giải quyết nó. Đầu tiên, dự án của tôi là trong JAVA và tôi sử dụng maven và spring boot để chạy nó thông qua Elastic Beanstalk (EBS).

  1. Như đã giải thích trên tài liệu của AWS , bạn cần có cài đặt nginx tùy chỉnh được lưu trữ trong cấp cơ sở của dự án. Để làm điều đó, tôi đã tạo một tệp client_max_body_size.conf và đặt nó trong đường dẫn sau: myprojectname /src/main/resources/ebextensions/nginx/conf.d/client_max_body_size.conf Tệp này chỉ chứa dòng sau:

    client_max_body_size 10M;
    
  2. Định cấu hình maven để thêm tệp này vào thư mục gốc của dự án của tôi trong quá trình xây dựng. Điều này hơi phức tạp, tôi cần thêm cấu hình sau ( nguồn ) vào POM.xml của mình:

    <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. Bây giờ bạn đã có thể xây dựng dự án của mình cục bộ và chạy lệnh SSH sau để xác thực nó thực sự nằm trong thư mục gốc của dự án của bạn:

    jar tf main-1.0-SNAPSHOT.jar | grep .ebextensions
    
  4. Bây giờ là phần khó khăn. Khi bạn tải nó lên EBS, tệp của bạn chỉ nên chứa tệp SNAPSHOT.jar và thư mục .ebextensions. Ví dụ: nếu bây giờ bạn nén tệp jar và thư mục và tải lên theo cách thủ công, nó sẽ hoạt động!

  5. Vì tôi đang sử dụng Jenkins cho việc triển khai của mình và cụ thể là Plugin triển khai AWS EBS - bạn cần thay đổi cài đặt của tệp / thư mục bạn đưa vào triển khai. Bây giờ vì một số lý do, tôi không thể bao gồm thư mục .ebextensions vì vậy tôi chỉ loại trừ mọi thứ khác ngoại trừ thư mục và tệp .jar. nhập mô tả hình ảnh ở đây

Những công việc này!


1

Ngoài client_max_body_size, tôi phải thêm client_body_buffer_size . Đây là tệp cấu hình chấm đã hoạt động, cho tệp đính kèm 2 MB:

files: "
/etc/nginx/conf.d/proxy.conf ": mode: "000755"
owner: root
group: root
content: |
proxy_buffering đang bật;
proxy_bộ_chung 128k;
bộ đệm_mua proxy 8 256k;
client_body_buffer_size 2M;
proxy_bộ_bộ_môi_thước 256k;
fastcgi_bánh_giá 16 16k;
fastcgi_bánh_giá 32k;
khách_hàng 3M;


0

Đối với nền tảng Java

Để tạo tệp proxy cấu hình NGINX, bạn chỉ cần thêm

.ebextension/nginx/conf.d/proxy.conf tập tin

với nội dung client_max_body_size 20M;trong đó.

"proxy.conf" sẽ được triển khai tới "/etc/nginx/conf.d/proxy.conf" và được cấu hình NGINX tự động đưa vào.


0

Nếu bạn đang chạy EC2 và tự cài đặt nginx, giải pháp tốt nhất của bạn là tạo một tệp mới trong

/etc/nginx/conf.d

thư mục:

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

và sau đó thêm dòng sau vào đó:

client_max_body_size 20M;

sau đó lưu và khởi động lại nginx:

sudo systemctl restart nginx

Đây là một công việc xung quanh nhưng trong trường hợp Elastic Beanstalk tạo một phiên bản mới, bạn cần cung cấp cấu hình này trong mỗi trường hợp. Và thực tế là không thể thực hiện được vì chúng ta cần liên tục theo dõi các hoạt động của EC2 và quá trình khởi động lại nginx không phải lúc nào cũng tốt
Jijo Cleetus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.