質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Gunicorn

Gunicorn (Green Unicorn)は、Rubyのunicornをベースに開発されたUNIX向けのPython製HTTPサーバです。他のライブラリとの依存関係がないため、容易にインストールして使用できます。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

3983閲覧

【nginx】 1MB(デフォルト)以上のファイルが送信できません。Request Entity Too Large【django】

Ees1-M38

総合スコア14

Gunicorn

Gunicorn (Green Unicorn)は、Rubyのunicornをベースに開発されたUNIX向けのPython製HTTPサーバです。他のライブラリとの依存関係がないため、容易にインストールして使用できます。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/05/28 01:26

編集2020/05/28 01:47

問題+知りたいこと

Ubuntu + nginx + django + Gunicorn + Ajaxで画像ファイルを送信するウェブアプリを開発していますが、1MB以上の画像ファイルを送信しようとすると、Request Entity Too Large のエラーが出てしまいます。

この問題について調査した結果、/etc/nginx/nginx.conf にて下記のように設定すると改善するとわかりました。

conf

1http{ 2 ****省略*** 3 server{ 4 client_max_body_size 100M; 5 client_body_buffer_size 100M; 6 listen 80; 7 server_name localhost; 8 root /var/www/html/<djangoのproject名>; 9 } 10}

この設定を施し、下記コマンドを実行して設定ファイルの更新処理をしましたが、動きませんでした。

bash

1sudo systemctl reload nginx 2sudo systemctl restart <djangoのproject名> nginx

1MBより大きい画像ファイルをアップロードする場合、どのようにすれば良いのか、ご教授願います。

環境

Ubuntu 18.04.4 LTS
django 3.0.6
nginx version: nginx/1.14.0 (Ubuntu)
gunicorn (version 20.0.4)

エラーログ

path:/var/log/nginx/error.log

log

12020/05/28 09:08:45 [error] 10093#10093: *11 client intended to send too large body: 6373261 bytes, client: 192.168.11.12, server: 192.168.11.100, request: "POST /webapp/ HTTP/1.1", host: "192.168.11.100", referrer: "http://192.168.11.100/webapp/"

Ajaxコード

js

1function ajax_fileupload(){ 2 var fd new FormData($("#main_form").get(0)); 3 $.ajax({ 4 url: "", 5 type: "POST", 6 data: fd, 7 processData: false, 8 contentType: false, 9 dataType: 'json' 10 }) 11 .done( function( data , status , xhr){ 12 //アップロード成功時の処理、送信成功したファイルの名前が返ってくる 13 } 14*******以下略******* 15}

djangoのviews.py

python

1 2*****以上略(各種必要なライブラリのimport)******* 3 4class WebappView(View): 5 def get(self, request, *args, **kwargs): 6 #GET時の処理 7 def post(self, request, *args, **kwargs): 8 #ファイルアップロード処理 9 if request.FILES: 10 11 try: 12 if "file_1" in request.FILES: 13 uploaded_file = request.FILES["file_1"] 14 15 _,file_ext = os.path.splitext(uploaded_file.name) 16 17 uploaded_filename = timezone.now().strftime("%Y%m%d%H%M%S%f") + file_ext 18 19 #ファイル名は"年月日時分秒マイクロ秒.拡張子"とする 20 file_name = default_storage.save(uploaded_filename , uploaded_file) 21 22 except Exception as e: 23 print("アップロードエラー:{}".format(e)) 24 25 return JsonResponse({"file_name":file_name})

フォーム内の画像を、POST文のAjaxを利用して送信。ファイルを/var/www/<djangoのproject名>/media/に保存する仕組みです。保存が成功したら、ファイル名がAjaxによって返却されます。

補足

  1. この1MB以上のファイルが送信できない問題は、**manage.pyの仮想サーバーでは発生しませんでした。**前述の本番環境にデプロイした途端、この問題が発生しました。
  2. djangoのモデル、テンプレート等には容量制限の指定は行っておりません。
  3. 通信はhttp通信、サーバーはローカルネットワークにあります。

【以下参考にしたサイト・書籍】
https://hacknote.jp/archives/27367/
https://stackoverflow.com/questions/36994828/413-request-entity-too-large-nginx-django
現場で使える Django の教科書《基礎編》
現場で使える Django の教科書《実践編》

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。しかし、これは最適解ではないかもしれません。

<before> ```conf http{ ****省略*** server{ client_max_body_size 100M; client_body_buffer_size 100M; listen 80; server_name localhost; root /var/www/html/<djangoのproject名>; } } ``` ↓ ↓ ↓ <after> ```conf http{ ****省略***

#↓以下を追加
client_max_body_size 100M;

server{
client_max_body_size 100M;
client_body_buffer_size 100M;
listen 80;
server_name localhost;
root /var/www/html/<djangoのproject名>;
}
}

--- おそらく、サーバーごとの指定で100MBを上限としても、デフォルトの指定が1MBになっているため、それが優先されてしまうのだと思われます。 server以下に10M指定をしたとしても、デフォルトの100Mが働き、100MBまでのファイルが通ってしまいます。 --- 補足 server_nameをサーバーのIPアドレスに当たる、192.168.11.100にしたり、http://192.168.11.100にしてもserverで指定したclient_max_body_sizeの指定が適応されませんでした。

投稿2020/05/28 02:19

編集2020/05/29 02:35
Ees1-M38

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukky1201

2020/05/28 15:27

server{ server_name localhost; } に記載で効いてないならば、そこの設定が使われてないということではないでしょうか。ほかにserver{ }設定しているところがあるのではないでしょうか。 http://localhost/***** でアクセスしたときに、該当のserver{ }設定が適用されますが、それ以外のときは別な個所のserver{ }設定が適用されるはずです。
Ees1-M38

2020/05/29 02:36

補足を加えました。サーバーのIPアドレスも直に指定してみましたが、うまくいきませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問