問題+知りたいこと
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によって返却されます。
補足
- この1MB以上のファイルが送信できない問題は、**manage.pyの仮想サーバーでは発生しませんでした。**前述の本番環境にデプロイした途端、この問題が発生しました。
- djangoのモデル、テンプレート等には容量制限の指定は行っておりません。
- 通信はhttp通信、サーバーはローカルネットワークにあります。
【以下参考にしたサイト・書籍】
https://hacknote.jp/archives/27367/
https://stackoverflow.com/questions/36994828/413-request-entity-too-large-nginx-django
現場で使える Django の教科書《基礎編》
現場で使える Django の教科書《実践編》
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/28 15:27
2020/05/29 02:36