2016-11-01 5 views
0

いつものように、別に非常に奇妙な問題があります。私はどこからでもアクセス可能なNGINXウェブサーバーを持っています。これは、私のpythonファイルをuWSGIの助けを借りて提供しています。 pythonファイル内では、mysql-connectorライブラリを使用して、同じマシン上で実行されているmysqlデータベースから情報を取得します。 (マシンはraspbianを実行しているラズベリーパイです)。私は文字列を返すインデックスページと、データベースに接続して/ resourcesページを持っていて、jsonでいくつかの情報を返します。Python Flaskタイムアウト? FLASK + NGINX + UWSGI

15分を与えるかまたは取ると、すべてが故障します。サーバーが応答しなくなり、「不良ゲートウェイ」エラーまたは「タイムアウトが発生しました」というエラーが表示されます。私は原因を絞り込むためにuWSGIを再起動し、そうすることで私のアプリは再びオンラインに戻ります。これは、それが何とか私のフラスコサーバーであることを意味します。

私は次のリンクを使用:私はそれが非常に困難なこのについての情報を見つけるために見つけるhttp://vladikk.com/2013/09/12/serving-flask-with-nginx-on-ubuntu/

:私は、次のリンクを使用していました。 何ができますか?どうすればこの問題を解決できますか?可能な修正は何ですか?

UWSGIログファイル

クロックソース:UNIX CPUコアの検出数:4 現在の作業ディレクトリ:/ホーム/ PI 検出されたバイナリのパス:は/ usr/local/binに/ uwsgi !内部ルーティングのサポートなし、pcreサポートによる再構築! *警告:あなたはそのマスタープロセスマネージャなしuWSGIを実行している あなたのプロセス数の制限がある7336 あなたのメモリ・ページ・サイズが4096バイト は、最大ファイルディスクリプタ数検出である:65536 ロックエンジン:pthreadの堅牢なミューテックスを 雷ロック: (--thunder-lockで有効にできます) uwsgiソケット0がUNIXアドレスにバインドされています/var/www/demoapp/demoapp_uwsgi.sock fd 3 Pythonバージョン:2.7.9(デフォルト、Sep 17 2016、20:55 :23)[GCC 4.9.2] PythonHomeを/ var/www/demoapp/venvに設定します。 Pythonスレッドのサポートは無効です。 0x67b490 サーバーソケットで初期化--enable-スレッド Pythonのメインインタプリタがバックログが は64256バイト(62キロバイト)をマッピングされた労働者の優雅な操作のために、あなたの慈悲は60秒です 100個の接続に制限されて聞くとあなたはそれを有効にすることができます1コア 動作モード:シングルプロセス 追加/ var/www/demoapp/to pythonpath。 WSGIアプリは0(マウントポイント= '')インタプリタ0x67b490 PIDに0秒で準備:32459(デフォルトアプリ) uWSGIは、複数のインタプリタモードで実行されている* はuWSGIワーカー1(とのみ)(PIDを生み出し:32459 、コア:1)

+0

Mmmm ...興味深い。何人のuWSGIワーカーまたはスレッドを実行していますか?少なくとも3人の労働者がいなければなりません。また、ログファイル(NGINX、uWSGI、フラスコ)には何か情報がありますか? –

+0

時間を割いていただきありがとうございます。ログファイルの最後の2行を追加しました。それは私はちょうど1人の労働者がいるようだ。どのようにして1人のワーカーがすぐにブロックされますか?そして、どうすれば追加できますか? – Stephen

+1

通常、あなたがリクエストを受け入れるワーカーと、I/O操作を実行する、つまりあなたのケースのデータベースから読み取ることがあるので、1人のワーカーがブロックされます。あなたは1人の労働者しか持たないので、これは問題になります。いくつかのヒントについては、[docs](http://uwsgi-docs.readthedocs.io/en/latest/ThingsToKnow.html)を参照してください(このページで 'processes'を検索することができます)。コマンドラインから '-p num'オプションを使うか、設定ファイルから' processes = num'(numは必要なプロセスの整数)を使ってワーカーの数を増やすことができます。追加の説明が必要な場合はお知らせください。 –

答えて

2

これはワーカーのブロック問題です。

ワーカーは、通常、リクエストを受け入れるワーカーと、I/O操作を実行する、つまりケースのデータベースから読み取ることになるため、ブロックされます。あなたは1人の労働者しか持たないので、これは問題になります。

いくつかのヒントについては、docsを参照してください(このページではprocessesを検索することがあります)。コマンドラインから-p numオプションを使用するか、構成ファイルからprocesses = numを使用して、ワーカーの数を増やすことができます(numは、必要なプロセスの整数)。

関連する問題