AWS Elastic Beanstalkで実行されているAPIに10MBを超えるファイルを送信すると、"413 Request Entity Too Large"エラーが発生します。
私はかなりの研究を行っており、Nginxでclient_max_body_sizeを上げる必要があると考えていますが、Elastic Beanstalkを使用してこれを行う方法についてのドキュメントを見つけることができないようです。私の推測では、ebetensionファイルを使用して変更する必要があると思います。
誰が私が制限をどのように上げることができるかについて考えていますか? 10MBはかなり弱いので、これを手動で上げる方法が必要です。
これには2つの方法があります。残念なことに、一部のEBアプリケーションタイプで機能するものと、他のタイプで機能するものがあります。
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
最大アップロードサイズを具体的に増やすには、.ebextensions/nginx/conf.d/proxy.conf
でファイルを作成し、最大ボディサイズを任意のサイズに設定します。
client_max_body_size 50M;
多くの調査と何時間もの素晴らしい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ファイルには、トリックを行う1つのライナーclient_max_body_size 20M;
が含まれています。
一部のプラットフォームでは、このファイルは展開中に作成されますが、その後の展開フェーズで削除されることに注意してください。
Nginxのドキュメントで概説されている他のディレクティブを指定できます。
http://wiki.nginx.org/Configuration
これが他の人に役立つことを願っています!
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が展開後にこの変更をピックアップするようにします。
編集: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設定が取得されます。
JVMベースのアプリを持っているので、受け入れられた答えは私にとってはうまくいきませんでした。NGINXの設定は異なるようです。デプロイ中にproxy.confファイルが作成されますが、デプロイが完了する前に後で削除されます。 AWSドキュメントでは、 プロキシを設定する の方法を説明しています:
.ebextensions/nginx/conf.d/proxy.conf
行のみを含むファイル:client_max_body_size 40M;
受け入れられた回答に続いて、nginx構成ファイルを再ロードする必要があります。
これを行うには、次のコマンドを追加します
container_commands:
01_reload_nginx:
command: "service nginx reload"
これは、ebインスタンスにsshし、コマンドを使用して手動で実行するよりも良い方法です。
受け入れられた答えと組み合わせて、私にとって同じ問題を解決しました。 (レール、プーマ、NGINX)
受け入れられた答えは私にとってはうまくいかなかったので、代わりに私は自分で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
で無視されません) )。
または、プロキシサーバーをApacheに変更することもできます。これを行うには、構成に移動し、ソフトウェア構成を編集します。最初のオプションは「プロキシサーバー」で、「Apache」を選択します。
私のために働いた唯一のことは、このような.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/
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を手動で再起動する必要はありません。
Javaプラットフォームの場合
NGINX構成プロキシファイルを作成するには、追加するだけです
.ebextension/nginx/conf.d/proxy.conf
ファイル
コンテンツclient_max_body_size 20M;
初期化。
「proxy.conf」は「/etc/nginx/conf.d/proxy.conf」にデプロイされ、NGINX構成によって自動的に組み込まれます。