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

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

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

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

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Django

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

nginx

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

タイムアウト

タイムアウトはイベント発生から完了までに掛かる経過時間に対する一定の待ち時間を指します。また、特定の時間が経過された場合に発生するイベントを指すこともあります。

Q&A

解決済

1回答

4978閲覧

ファイル容量の制限とタイムアウトに関するnginx.conf及びsettings.pyの設定方法

kwmr8416

総合スコア6

Gunicorn

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

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Django

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

nginx

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

タイムアウト

タイムアウトはイベント発生から完了までに掛かる経過時間に対する一定の待ち時間を指します。また、特定の時間が経過された場合に発生するイベントを指すこともあります。

0グッド

0クリップ

投稿2020/11/17 12:19

編集2020/11/18 00:59

CSVインポート時の不具合を解消したいです。
現状ではAWSに配置したアプリケーションにアクセスし、CSVインポート機能を利用しようとしていますが、大きなサイズのCSVファイルをインポートするのに、
「413 Request Entity Too Large」
がスローされました。そこで、nginx.configに
「client_max_body_size」の値を設定しました。
あと一点、settings.pyに「FILE_UPLOAD_PERMISSIONS = 0o644」も追記しました。
ところが、それでもエラーになり、今度は「nginx error!」がスローされnginxのロゴ画面が表示さるようになってしまいました。
nginxのロゴ画面
動作をいくつか確認していると、ある一定の時間(30秒くらい)でこの「nginx error!」が出力されるのがわかりました。
そこで、タイムアウトに関する設定をnginx.configに行いましたが変化ありません。

環境
インスタンスタイプ:t2.micro
ap:django
web:nginx(gunicorn)
db:PostgreSQL

nginx.conf(ファイルサイズとして3Mバイト、タイムアウトとして9999秒を設定しています※コメントに40Mとかありますが、無視してください)

# For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; # keepalive_timeout 65; keepalive_timeout 9999; types_hash_max_size 4096; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; # 約40Mバイトのファイルをインポートするとエラー(413 Request Entity Too Large)になったため(下記併せ3箇所) client_max_body_size 3M; # タイムアウトに関する設定 proxy_connect_timeout 9999; proxy_send_timeout 9999; proxy_read_timeout 9999; send_timeout 9999; client_body_timeout 9999; client_header_timeout 9999; server { # 80番ポート(HTTP)でリクエストを待機する設定 listen 80; listen [::]:80; # ElasticIPアドレスを指定 server_name xxx.xxx.xxx.xxx; # 公開するディレクトリの設定 root /usr/share/nginx/html; # 約40Mバイトのファイルをインポートするとエラー(413 Request Entity Too Large)になったため client_max_body_size 3M; # 下記は必要な場合とない場合があるが記述しておく client_body_buffer_size 3M; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; # 静的ファイル配置ディレクトリとURLの対応付け location /static { alias /usr/share/nginx/html/static; } location / { # Host:ホスト名を転送 proxy_set_header Host $http_host; # X-Forwarded-For:送信元アドレスを転送 proxy_set_header X-Fowarded-For $proxy_add_x_forwarded_for; # X-Forwarded-Proto:URLスキーム(httpなど)を転送 proxy_set_header X-Fowrded-Proto $scheme; # 約40Mバイトのファイルをインポートするとエラー(413 Request Entity Too Large)になったため(上記併せ3箇所) client_max_body_size 3M; # URLが「/static」に該当しない場合(リバースプロキシ) proxy_pass http://127.0.0.1:8000; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } # Settings for a TLS enabled server. # # server { # listen 443 ssl http2; # listen [::]:443 ssl http2; # server_name _; # root /usr/share/nginx/html; # # ssl_certificate "/etc/pki/nginx/server.crt"; # ssl_certificate_key "/etc/pki/nginx/private/server.key"; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 10m; # ssl_ciphers PROFILE=SYSTEM; # ssl_prefer_server_ciphers on; # # # Load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; # # error_page 404 /404.html; # location = /40x.html { # } # # error_page 500 502 503 504 /50x.html; # location = /50x.html { # } # } }

settings.py(最終行に権限に関する設定を行いました)

from .settings_common import * # SECURITY WARNING: keep the secret key used in production secret! # settings_commonと共通 #SECRET_KEY = '*hto)tc=a23-pbhy@vmj-kpnr#of96n&jgyrqr@)e%9%c(d*nj' os.makedirs(os.path.join(BASE_DIR, 'logs'), exist_ok=True) # SECURITY WARNING: don't run with debug turned on in production! # デバッグモードを有効にするかどうか(本番運用では必ずFalseにする) DEBUG = False # 許可するホスト名のリスト ALLOWED_HOSTS = [os.environ.get('ALLOWED_HOSTS')] # 静的ファイルを配置する場所 STATIC_ROOT = '/usr/share/nginx/html/static' # ロギング LOGGING = { 'version': 1, # 1固定 'disable_existing_loggers': False, # ロガーの設定 'loggers': { # Djangoが利用するロガー 'django': { 'handlers': ['file'], 'level': 'INFO', }, # commonアプリケーションが利用するロガー 'level': 'INFO', }, # setting_worktypemasterアプリケーションが利用するロガー 'level': 'INFO', }, # setting_serialnomasterアプリケーションが利用するロガー 'setting_serialnomaster': { 'handlers': ['file'], 'level': 'INFO', }, }, # ハンドラの設定 'handlers': { 'file': { 'level': 'INFO', 'class': 'logging.handlers.TimedRotatingFileHandler', 'filename': os.path.join(BASE_DIR, 'logs/django.log'), 'formatter': 'prod', 'when': 'D', # ログローテーション(新しいファイルへの切り替え)間隔の 単位(D=日) 'interval': 1, # ログローテーション間隔(1日単位) 'backupCount': 7, # 保存しておくログファイル数 }, }, # フォーマッタの設定 'formatters': { 'prod': { 'format': '\t'.join([ '%(asctime)s', '[%(levelname)s]', '%(pathname)s(Line:%(lineno)d)', '%(message)s' ]) }, } } # エラー 413 (Request Entity Too Large)を回避するため FILE_UPLOAD_PERMISSIONS = 0o644

django.log

2020-11-17 19:52:06,922 [WARNING] /home/app_admin/venv_xxx_project/lib64/python3.7/site-packages/django/utils/log.py(Line:228) Not Found: /nginx-logo.png 2020-11-17 19:52:06,924 [WARNING] /home/app_admin/venv_xxx_project/lib64/python3.7/site-packages/django/utils/log.py(Line:228) Not Found: /poweredby.png 2020-11-17 19:55:16,211 [WARNING] /home/app_admin/venv_xxx_project/lib64/python3.7/site-packages/django/utils/log.py(Line:228) Not Found: /nginx-logo.png 2020-11-17 19:55:16,213 [WARNING] /home/app_admin/venv_xxx_project/lib64/python3.7/site-packages/django/utils/log.py(Line:228) Not Found: /poweredby.png 2020-11-17 19:58:58,605 [WARNING] /home/app_admin/venv_xxx_project/lib64/python3.7/site-packages/django/utils/log.py(Line:228) Not Found: /nginx-logo.png 2020-11-17 19:58:58,606 [WARNING] /home/app_admin/venv_xxx_project/lib64/python3.7/site-packages/django/utils/log.py(Line:228) Not Found: /poweredby.png 2020-11-17 20:20:07,443 [WARNING] /home/app_admin/venv_xxx_project/lib64/python3.7/site-packages/django/utils/log.py(Line:228) Not Found: /nginx-logo.png 2020-11-17 20:20:07,464 [WARNING] /home/app_admin/venv_xxx_project/lib64/python3.7/site-packages/django/utils/log.py(Line:228) Not Found: /poweredby.png

早急に解決したいと思っております。どんなことでも構いません見落としてるポイントなどありましたらコメント頂けますでしょうか。どうかよろしくお願いいたします。

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

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

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

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

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

yu_1985

2020/11/17 18:09

> 大きなサイズのCSVファイル 具体的にどのくらい大きなサイズなんでしょうか
kwmr8416

2020/11/18 00:29

コメントありがとうございます。 当初40MバイトほどのCSVファイルを読み込んだ際に 「413 Request Entity Too Large」 がスローされたため、 nginx.confに 「client_max_body_size」の値として1000Mなど大きな値を設定しましたが、 「413 Request Entity Too Large」はスローされなくなりましたが、 質問にある通り、 「nginx. error!」のnginxのロゴが表示されるようになりました。 細かな対応としては、問題を切り分けるために 「client_max_body_size」の値を1M→2M→3Mと増やしていって インポートするCSVファイルも設定値の上限に合わせて、動作確認を行いました。 結果としては、 「client_max_body_size」が 1Mバイト(以下バイトは省略)の設定で1MまでのCSVファイルは読み取れるが1Mを超えるCSVファイルを読み込もうとすると、 「413 Request Entity Too Large」がスローされる。 2Mの設定でも同様の結果。 3Mの設定で上限の3M以内のCSVファイルを読み込んで30秒ほどの所で 「nginx error!」がスローされnginxのロゴ画面が表示される。 具体的には約2.6Mまでなら読み込めるが約2.8M以上のファイルは 読み込みだしてから「nginx error!」がスローされる。 3Mの設定で3Mを超えるCSVファイルは 「413 Request Entity Too Large」がスローされる。 長くなりましたが、よろしくお願いいたします。
guest

回答1

0

自己解決

昨夜質問してからうすうす気付いていたんですが、gunicornの設定が必要です。
gunicornの起動コマンドとして

「$ gunicorn --bind 127.0.0.1:8000 プロジェクト名.wsgi -D」

でgunicornを起動していましたが、
オプションに「--timeoout」を付けることで、今回の問題は解消できそうです(これから動作確認します)。
よって、実際のコマンドとしては

「$ gunicorn --bind 127.0.0.1:8000 プロジェクト名.wsgi -D --timeout 9999」

などとすれば40Mバイトのファイルでも問題なく読み込めると思います。
デフォルトはおそらく30秒位ですね。

また、不具合ありましたら、お知らせいたします。

追記
上記の通りgunicornのタイムアウトが今回の不具合の原因でした。
gunicornの起動コマンドオプションに
「--log-level=DEBUG」を加えログを出力するようにし、CSVインポートを3件ほど行いました。
以下がターミナルの表示内容です。
前半に設定情報が表示され、後半のログ情報に「WORKER TIMEOUT」が表示されているのがわかります。

(venv_xxx_project) [app_admin@ip-172-31-36-217 xxx_project]$ gunicorn --bind 127.0.0.1:8000 xxx_project.wsgi --timeout 33 --log-level=DEBUG [2020-11-18 10:55:10 +0900] [10999] [DEBUG] Current configuration: config: None bind: ['127.0.0.1:8000'] backlog: 2048 workers: 1 worker_class: sync threads: 1 worker_connections: 1000 max_requests: 0 max_requests_jitter: 0 timeout: 33 graceful_timeout: 30 keepalive: 2 limit_request_line: 4094 limit_request_fields: 100 limit_request_field_size: 8190 reload: False reload_engine: auto reload_extra_files: [] spew: False check_config: False preload_app: False sendfile: None reuse_port: False chdir: /home/app_admin/venv_xxx_project/xxx_nippo_20201102/venv_xxx_project/xxx_project daemon: False raw_env: [] pidfile: None worker_tmp_dir: None user: 1001 group: 1001 umask: 0 initgroups: False tmp_upload_dir: None secure_scheme_headers: {'X-FORWARDED-PROTOCOL': 'ssl', 'X-FORWARDED-PROTO': 'https', 'X-FORWARDED-SSL': 'on'} forwarded_allow_ips: ['127.0.0.1'] accesslog: None disable_redirect_access_to_syslog: False access_log_format: %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" errorlog: - loglevel: DEBUG capture_output: False logger_class: gunicorn.glogging.Logger logconfig: None logconfig_dict: {} syslog_addr: udp://localhost:514 syslog: False syslog_prefix: None syslog_facility: user enable_stdio_inheritance: False statsd_host: None dogstatsd_tags: statsd_prefix: proc_name: None default_proc_name: xxx_project.wsgi pythonpath: None paste: None on_starting: <function OnStarting.on_starting at 0x7f6cc9a7cd40> on_reload: <function OnReload.on_reload at 0x7f6cc9a7ce60> when_ready: <function WhenReady.when_ready at 0x7f6cc9a7cf80> pre_fork: <function Prefork.pre_fork at 0x7f6cc9a8f0e0> post_fork: <function Postfork.post_fork at 0x7f6cc9a8f200> post_worker_init: <function PostWorkerInit.post_worker_init at 0x7f6cc9a8f320> worker_int: <function WorkerInt.worker_int at 0x7f6cc9a8f440> worker_abort: <function WorkerAbort.worker_abort at 0x7f6cc9a8f560> pre_exec: <function PreExec.pre_exec at 0x7f6cc9a8f680> pre_request: <function PreRequest.pre_request at 0x7f6cc9a8f7a0> post_request: <function PostRequest.post_request at 0x7f6cc9a8f830> child_exit: <function ChildExit.child_exit at 0x7f6cc9a8f950> worker_exit: <function WorkerExit.worker_exit at 0x7f6cc9a8fa70> nworkers_changed: <function NumWorkersChanged.nworkers_changed at 0x7f6cc9a8fb90> on_exit: <function OnExit.on_exit at 0x7f6cc9a8fcb0> proxy_protocol: False proxy_allow_ips: ['127.0.0.1'] keyfile: None certfile: None ssl_version: 2 cert_reqs: 0 ca_certs: None suppress_ragged_eofs: True do_handshake_on_connect: False ciphers: None raw_paste_global_conf: [] strip_header_spaces: False [2020-11-18 10:55:10 +0900] [10999] [INFO] Starting gunicorn 20.0.4 [2020-11-18 10:55:10 +0900] [10999] [DEBUG] Arbiter booted [2020-11-18 10:55:10 +0900] [10999] [INFO] Listening at: http://127.0.0.1:8000 (10999) [2020-11-18 10:55:10 +0900] [10999] [INFO] Using worker: sync [2020-11-18 10:55:10 +0900] [11002] [INFO] Booting worker with pid: 11002 [2020-11-18 10:55:10 +0900] [10999] [DEBUG] 1 workers [2020-11-18 10:55:33 +0900] [11002] [DEBUG] POST /working_listworkinglistimport/ [2020-11-18 10:56:07 +0900] [10999] [CRITICAL] WORKER TIMEOUT (pid:11002) [2020-11-18 10:56:07 +0900] [11002] [INFO] Worker exiting (pid: 11002) [2020-11-18 10:56:07 +0900] [11007] [INFO] Booting worker with pid: 11007 [2020-11-18 10:56:07 +0900] [11007] [DEBUG] GET /nginx-logo.png [2020-11-18 10:56:07 +0900] [11007] [DEBUG] GET /poweredby.png [2020-11-18 10:56:35 +0900] [11007] [DEBUG] POST /working_listworkinglistimport/ [2020-11-18 10:57:09 +0900] [11007] [DEBUG] GET /working_list [2020-11-18 10:57:35 +0900] [11007] [DEBUG] GET /boaform/admin/formLogin [2020-11-18 10:57:57 +0900] [11007] [DEBUG] GET /working_listworkinglistimport/ [2020-11-18 10:58:38 +0900] [11007] [DEBUG] POST /working_listworkinglistimport/ [2020-11-18 10:59:08 +0900] [11007] [DEBUG] GET /working_list [2020-11-18 10:59:14 +0900] [11007] [DEBUG] GET /working_listworkinglistimport/ [2020-11-18 10:59:27 +0900] [11007] [DEBUG] POST /working_listworkinglistimport/ [2020-11-18 11:00:00 +0900] [10999] [CRITICAL] WORKER TIMEOUT (pid:11007) [2020-11-18 11:00:00 +0900] [11007] [INFO] Worker exiting (pid: 11007) [2020-11-18 11:00:00 +0900] [11025] [INFO] Booting worker with pid: 11025 [2020-11-18 11:00:00 +0900] [11025] [DEBUG] GET /poweredby.png [2020-11-18 11:00:00 +0900] [11025] [DEBUG] GET /nginx-logo.png

以上で今回の件は、解決とさせていただきます。
ありがとうございました。

投稿2020/11/18 00:53

編集2020/11/18 02:16
kwmr8416

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問