AWS Elastic BeanstalkのNginx confでclient_max_body_sizeを増やす


121

私はに実行しているよ「413要求エンティティが大きすぎます」 AWS Elastic Beanstalkで上で実行されている私たちの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

これには2つの方法があります。残念ながら、一部のEBアプリケーションタイプで機能するものと、他の種類で機能するものがあります。

AWSドキュメントでサポート/推奨

Java SEGoNode.js、そして多分Ruby などの一部のアプリケーションタイプ(Rubyについては文書化されていませんが、他のすべてのNginxプラットフォームはこれをサポートしているようです)では、ElasticbeanstalkはNginxの構成方法を組み込みで理解しています。

Elastic Beanstalkのデフォルトのnginx構成を拡張するには、アプリケーションソースバンドルで指定さ.ebextensions/nginx/conf.d/れたフォルダーに.conf構成ファイルを追加します。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;

これにより、/ etc / nginx / conf.dディレクトリ内にproxy.confファイルが生成されます。proxy.confファイルclient_max_body_size 20M;には、トリックを実行する1つのライナーが含まれています。

一部のプラットフォームでは、このファイルは展開中に作成されますが、その後の展開フェーズで削除されることに注意してください。

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 2014

2
プーマで私のために働いています。@Willが言ったようにサービスを再起動する必要がありました(sudo service nginx reload)。
デニス・

1
うまくいけば、しばらく時間がかかったので他の誰かを助けるかもしれません...インデントは重要です-YAML
alexs

1
確認した作業は、確認してください.ebextensionsしていない.ebignore.gitignore🖖私はnginxのサービスを再起動する必要はありませんでした、eb deploy🎉、それが働いた
GabLeRoux

4
ノードjsの場合、2番目の方法(ファイル:)がうまくいきました。最初のものは機能しませんでした。AWSサポートでさえ、ノードjsdocs.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の2つの 'owner:'エントリを参照してください)。なんでも777権限を設定しないでください。ハッキングを楽しんでいない限り、Nginx設定ファイルの所有者をrootに設定してください。

デプロイ後にnginxピックアップをこの変更にするには、以下の回答も参照してください。


22

編集:Nick Parsonsが承認した回答の指示に従ってビルドをデプロイした後、nginxサーバーを再起動して変更を反映する必要がある場合があります。

これを行うには、インスタンスにsshして、

sudo service nginx reload

リロードの詳細については、http://nginx.org/en/docs/beginners_guide.htmlを参照してください。

以前のバージョンのElastic Beanstalkでは、これを行うためにcontainer_commandを追加できましたが、@ cdmckayのように、これがデプロイの失敗の原因であることがわかりました。環境を再構築すると、configファイルにその命令が含まれている限り、client_max_body_size設定が取得されます。


これは必要ですか?これを追加しない場合、どのように再起動しますか?
cdmckay 2015

私の経験では、これが必要だと思いました。
ウィル

@cdmckayは、インスタンスがreloadコマンドによって引き起こされた問題を詳しく説明できますか?
ウィル

あまり詳しく調べませんでしたが、削除するまでサーバーが起動しませんでした。必要ないようです。
cdmckay

3
私の経験ではこれが必要であることがわかりましたが、新しいインスタンスで再起動する前にnginxが実行されているかどうかを確認するチェックを追加する必要がありました-'pgrep nginx && service nginx reload || true '
アレックス

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/
Udo G

Docker ELBを使用していて、nginx confの動作が異なるためです。私の答えは、JavaプリセットELBです。
Raymond26 2017年

elbとjava appを使用しています。私のために働く!ありがとう!
Dimitar Vukman 2017

一時的な存在に注意して、proxy.confファイルが作成されていることをどのように確認できますか?
rogerdpack

9

受け入れられた回答に続いて、nginx設定ファイルをリロードする必要があるかもしれません。

これを行うには、次のコマンドを追加します

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

これは、ebインスタンスにsshしてコマンドで手動で実行するよりも良い方法です。

これと受け入れられた回答を組み合わせると、同じ問題が解決しました。(Rails、Puma、NGINX)


7

私にとってうまくいった唯一のものは、次のように.ebextensions内に「.config」ファイルを作成することでした。

.ebextensions/
           proxy.config

.configファイルにこのコンテンツのみを含める:

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

サブフォルダーの必要なし、アプリケーションサーバーを再起動する必要なしファイルの名前は関係ありませんが、

おかげで:http : //kroltech.com/2014/09/14/quick-tip-increase-upload-size-in-aws-elastic-beanstalk-node-js-env/


4

受け入れられた答えは私にとってはうまくいかなかったので、代わりに私は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を作成して(それが中に無視されていない展開中豆の木にアップロードされた.zipファイルの一部である.gitignoreか、.ebignoreあなたはそれを使用している場合)。


これをありがとう!どのプラットフォームを使用していたのだろうと思っていましたか?なんらかの理由で、zipファイルとgitリポジトリにあるにもかかわらず、Beanstalkは私の `.ebextensions / nginx / nginx.conf`ファイルを検出しません。
Icid

ノートに賛成。私は.ebextensions、受け入れられた人気のある回答が失敗する原因となったものを無視していました。私は🍻ノートのあなたはmentionned他のすべてが、感謝しようとしなかった
GabLeRoux

4

私は.ebextensions実装レベルの設定を追加するすべての方法を試しましたが、最新のAmazon Linux AMIでは役に立ちませんでした。私は多くの調査を行いましたが、ログを調べた後、展開タスクランナーが.platform毎回というフォルダーをチェックしており、.ebextensionsのように1つ追加することを考えていました。以下は、プロジェクトのルートフォルダーで行った設定です。

以下のフォルダー設定をプロジェクトフォルダーのルートレベルに追加します。

フォルダー構造(.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で、2番目のファイルは.configです。

次に、プロジェクトをAmazon Elastic Beanstalkに再デプロイすると、魔法が見えます。この構成は、自動スケーリングの一部として作成されたすべてのEC2インスタンスに追加されます。

以下の詳細なフォルダ構造。

ここに画像の説明を入力してください


2
おとこ!!!!!!!!どうもありがとうございます。これは、AWS EB Amazon linuxでnginx設定を設定する唯一の方法です。利用可能なすべてのソリューションを試して丸一日無駄にした!!! この回答を詳しく書いてくれてありがとうございます。お大事に。あなたが何らかのパトレオンまたはbuymeacoffeeアカウントを持っている場合は、Ilが貢献します。@jijo Cleetus
InfinitePrime

2
どうもありがとう。私もすべての可能なアプローチを試してみましたが、.ebextensionsこのアプローチのみが機能しました。
ArunDhaJ

これを機能させるために多くの試行錯誤を省きました。感謝しきれない!
Jalal El-Shaer

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か?
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/、単純に1つのラインの内側で、私のプロジェクトのルートに:

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. .ebextensionsフォルダーが、awsアカウントのs3bucketにあるビルドのzipフォルダーに含まれていることを確認してください
  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に次の構成(ソース)を追加する必要がありました:

    <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を追加する必要がありました。以下は、2 MBの添付ファイルで機能したドット構成ファイルです。

ファイル: "/etc/nginx/conf.d/proxy.conf":
モード: "000755"
所有者:ルート
グループ:ルート
コンテンツ:|
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 8 256k;
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のintancesとnginxの再起動プロセスを監視する必要があるため、実質的に不可能です良い毎回ではありません
事情Cleetus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.