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

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

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

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Gunicorn

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

Django

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

nginx

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

5284閲覧

502 errorの対処方法。処理ファイルが大きいとエラーになります。

bunks

総合スコア30

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Gunicorn

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

Django

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

nginx

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

1クリップ

投稿2019/01/01 04:35

編集2019/01/01 09:29

現在djangoで開発している中で502が出る時があり,それは処理するファイルが大きく,実行時間が長い時です。
エラーログは以下の通りで,

errorLog

1upstream prematurely closed connection while reading response header from upstream, client

こちらQiita記事を参考にしたところ,gunicorn側のtimeoutなのではないかと思っています。(アプリ側はdebug=trueですがエラーは出ないです)

そのため,gunicorn.confとnginx.confを以下のように設定しましたが,gunicorn.confの設定でtimeout 3600; を追加するとエラーが出て,またそれ抜きの設定では502になります。

どのようにすれば長い処理でもkillされないtimeoutの設定にできますか?

gunicornConf

1server { 2 listen 80; 3 server_name IPアドレス; 4 keepalive_timeout 3600; 5 timeout 3600; <<この行を追加するとエラーになります 6 location /static { 7 alias /var/www/static; 8 } 9 10 location / { 11 proxy_pass http://127.0.0.1:8000; 12 proxy_set_header Host $http_host; 13 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 14 } 15} 16

nginxConf

1user nginx; 2worker_processes auto; 3error_log /var/log/nginx/error.log; 4pid /run/nginx.pid; 5 6# Load dynamic modules. See /usr/share/nginx/README.dynamic. 7include /usr/share/nginx/modules/*.conf; 8 9events { 10 worker_connections 1024; 11} 12 13http { 14 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 15 '$status $body_bytes_sent "$http_referer" ' 16 '"$http_user_agent" "$http_x_forwarded_for" $request_time'; 17 18 access_log /var/log/nginx/access.log main; 19 20 sendfile on; 21 tcp_nopush on; 22 tcp_nodelay on; 23 keepalive_timeout 3600; 24 proxy_connect_timeout 3600; 25 proxy_send_timeout 3600; 26 proxy_read_timeout 3600; 27 send_timeout 3600; 28 types_hash_max_size 2048; 29 30 include /etc/nginx/mime.types; 31 default_type application/octet-stream; 32 33 # Load modular configuration files from the /etc/nginx/conf.d directory. 34 # See http://nginx.org/en/docs/ngx_core_module.html#include 35 # for more information. 36 include /etc/nginx/conf.d/*.conf; 37 38 server { 39 listen 80 default_server; 40 listen [::]:80 default_server; 41 server_name _; 42 root /usr/share/nginx/html; 43 44 # Load configuration files for the default server block. 45 include /etc/nginx/default.d/*.conf; 46 47 location / { 48 } 49 50 error_page 404 /404.html; 51 location = /40x.html { 52 } 53 54 error_page 500 502 503 504 /50x.html; 55 location = /50x.html { 56 } 57 } 58} 59
nasuko_marakasu👍を押しています

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

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

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

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

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

coco_bauer

2019/01/01 08:22

nginxのログを調べれば、何が起きているのかが判るかもしれません。502が起きる原因は様々なので、まずはログに記録されたエラーを調べてみては如何ですか。
bunks

2019/01/01 09:29

返信ありがとうございます。 ログを見た所,gunicornのtimeout設定が原因のように感じたので,原因調査と対策を合わせて追記しました。未だ解決していないので,再度確認していただけると幸いです。
guest

回答1

0

ベストアンサー

私も同様の問題に遭遇して解決方法を検討している最中なので、
具体的な回答ではないのですが、何か解決策のきっかけにでもなればということで・・・

タイムアウト時間を調整しても、リクエストの数や、サーバーの処理能力、入出力の処理能力によって、想定より増大する可能性があります。また、ブラウザ側でのタイムアウトも関係してくると思います。

サーバーサイドで処理時間がかかってしまう恐れがある処理は、タイムアウト時間を長くして対処するのではなく、フロントエンドからのリクエストには、処理中であること、および、サーバーサイドの処理終了を監視する非同期処理を含んだレスポンスを戻し、サーバーサイドの処理終了を感知したところで、改めて結果のリクエストをするような、非同期の仕組みが必要だと思います。

何らかの画像を生成するリクエストを送った時に、生成のリクエストに対するレスポンスでは、処理パーセントを表示するためのフロントエンドが戻され、そのフロントエンドで、非同期問い合わせを行い処理パーセントを更新、100%になった際に、生成ファイルを要求するためのボタンが有効になる。というような流れがイメージしやすいと思います。

投稿2019/01/01 14:31

Meganezaru

総合スコア715

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

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

bunks

2019/01/02 07:56 編集

ありがとうございます。 httpレスポンスは先に返して,celeryなどを使ってバックグラウンドで処理を実行する形ですね。 ご回答いただいて調べたところ,以下のURLあたりと同じような処置かと。 https://leben.mobi/blog/django_celery1/python/ https://teratail.com/questions/130909 非同期処理について初めて知り,とても参考になりました。 celery導入して,おって追記・回答しようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問