16

私の現在のフラスコ展開では、uwsgi サーバーをセットアップする必要がありました。これは、uwsgi デーモンを作成した方法です。

sudo vim /etc/init/uwsgi.conf

# file: /etc/init/uwsgi.conf
description "uWSGI server"

start on runlevel [2345]
stop on runlevel [!2345]
respawn

exec /myproject/myproject-env/bin/uwsgi --uid www-data --gid www-data --home /myproject/myproject-env/site/F11/Engineering/  --socket /tmp/uwsgi.sock --chmod-socket --module F11 --callable app --pythonpath /myproject/myproject-env/site/F11/Engineering/ -H /myproject/myproject-env

ただし、これを正常に実行した後:sudo start uwsgi

uwsgi start/running, process 1286

そして、ブラウザ経由でアプリケーションにアクセスしようとしています:

502 Bad Gatewayが表示される

nginx error.log のエラー エントリ:

2013/06/13 23:47:28 [エラー] 743#0: *296 アップストリームからの応答ヘッダーの読み取り中に接続が途中で閉じられました。クライアント: xx.161.xx.228、サーバー: myproject.com、リクエスト: "GET /show_records/2013/6 HTTP/1.1"、アップストリーム: "uwsgi://unix:///tmp/uwsgi.sock:"、ホスト: "myproject.com"

ただし、sock ファイルには必要なアクセス許可があります。

srw-rw-rw- 1 www-data www-data 0 Jun 13 23:46 /tmp/uwsgi.sock

execコマンドラインで上記のコマンドをプロセスとして実行すると、完全に正常に動作します。デーモンが正しく動作しないのはなぜですか?

ところでNginxは次のように実行されています vim /etc/nginx/nginx.conf

user www-data;

vim /etc/nginx/sites-available/default

location / {
                uwsgi_pass   unix:///tmp/uwsgi.sock;
                include        uwsgi_params;
        }

そして、それは次のように開始されますsudo service nginx start

私はこれを実行していUbuntu 12.04 LTSます。

必要なデータがすべて提供されていることを願っています。誰かが私を正しい方向に導いてくれることを願っています。ありがとう。

4

3 に答える 3

21

最後に、2日近く作業した後、この問題を解決しました。この解決策が、同様の問題を経験している他のフラスコ/uwsgi ユーザーに役立つことを願っています。

これを引き起こした2つの大きな問題がありました。

1) デーモンの問題を見つける最善の方法は、明らかにログ ファイルとよりクリーンな構造です。

sudo vim /etc/init/uwsgi.conf

デーモン スクリプトを次のように変更します。

# file: /etc/init/uwsgi.conf
description "uWSGI server"

start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec /home/ubuntu/uwsgi-1.9.12/uwsgi -c /myproject/uwsgi.ini

vim /myproject/uwsgi.ini

[uwsgi]
socket = /tmp/uwsgi.sock
master = true
enable-threads = true
processes = 5
chdir= /myproject/F11/Engineering
module=F11:app
virtualenv = /myproject/myproject-env/
uid =  www-data
gid = www-data
logto = /myproject/error.log

これは、デーモンをセットアップするためのよりクリーンな方法です。また、ログ ファイルのセットアップ方法の最後の行にも注目してください。最初に、ログ ファイルを/var/log/uwsgi/error.log. 多くの汗と涙の後、私はデーモンが として実行されていることにwww-data気付き/var/log/uwsgi/error.logましたroot:root。これにより、uwsgi が静かに失敗しました。

デーモン/myprojectwww-data. また、プロジェクト全体にアクセスできるようにすることを忘れないでください。そうしないとwww-data、デーモンがInternal Server error message. -->

sudo chown www-data:www-data -R /myproject/

uwsgi デーモンを再起動します。

sudo service uwsgi restart

2) これで、3 つのログ ファイルを確認できます。

  • tail -f /var/log/upstart/uwsgi.log --> 起動時のデーモンの問題を表示します

  • tail -f /var/log/nginx/error.log --> wsgi アクセスが拒否された場合のパーミッションの問題を示します。多くの場合、ファイルはではなく/tmp/uwsgi.sockによって所有されているためです。その場合は、単に sock ファイルを削除しますrootwww-datasudo rm /tmp/uwsgi.sock

  • tail -f /myproject/error.log --> アプリケーションで uwsgi によってスローされたエラーを表示します

このログ ファイルの組み合わせは、Flask アプリケーションで Flask-Babel を使用した場合のインポートにも問題があることを理解するのに役立ちました。その意味で、私がライブラリを利用した方法は、日時形式を決定するためにシステムのロケールにフォールバックしていたことです。

File "/myproject/F11/Engineering/f11_app/templates/show_records.html", line 25, in block "body"
    <td>{{ record.record_date|format_date }}</td>
  File "./f11_app/filters.py", line 7, in format_date
    day = babel_dates.format_date(value, "EE")
  File "/myproject/myproject-env/local/lib/python2.7/site-packages/babel/dates.py", line 459, in format_date
    return pattern.apply(date, locale)
  File "/myproject/myproject-env/local/lib/python2.7/site-packages/babel/dates.py", line 702, in apply
    return self % DateTimeFormat(datetime, locale)
  File "/myproject/myproject-env/local/lib/python2.7/site-packages/babel/dates.py", line 699, in __mod__
    return self.format % other
  File "/myproject/myproject-env/local/lib/python2.7/site-packages/babel/dates.py", line 734, in __getitem__
    return self.format_weekday(char, num)
  File "/myproject/myproject-env/local/lib/python2.7/site-packages/babel/dates.py", line 821, in format_weekday
    return get_day_names(width, context, self.locale)[weekday]
  File "/myproject/myproject-env/local/lib/python2.7/site-packages/babel/dates.py", line 69, in get_day_names
    return Locale.parse(locale).days[context][width]
AttributeError: 'NoneType' object has no attribute 'days'

これは、Flask フィルターを使用していた方法です。

import babel.dates as babel_dates

@app.template_filter('format_date')
def format_date(value):
    day = babel_dates.format_date(value, "EE")
    return '{0} {1}'.format(day.upper(), affix(value.day))

最も奇妙な部分は、このコードが開発環境内で完全に正常に機能していることです (!)。コマンド ラインからルート プロセスとして uwsgi を実行すると、問題なく動作します。しかし、www-data デーモンで実行すると失敗します。これは、Flask-Babel がフォールバックしようとしているロケールの設定方法と関係があるはずです。

このようにインポートを変更すると、デーモンで最終的にすべてが機能しました。

from flask.ext.babel import format_date  

@app.template_filter('format_date1')
def format_date1(value):
    day = format_date(value, "EE")
    return '{0} {1}'.format(day.upper(), affix(value.day))

したがって、コード内のクラスに適切な名前空間を選択しようとしている Eclipse/Aptana Studio を使用する場合は注意してください。それは本当に醜いものになる可能性があります。

2 日以来、Amazon Ec2 (Ubuntu 12.04) で uwsgi デーモンとして完全に正常に動作しています。この経験が仲間の Python 開発者に役立つことを願っています。

于 2013-06-16T22:14:40.133 に答える
-1

デーモンtrueコマンドで実行されている単一の行として

gunicorn  app.wsgi:application -b 127.0.0.1:8000 --daemon

アプリを 127.0.0.1:8000 でバインドし、 --deemon で強制的にデーモンとして実行します

ただし、gunicorn_config.cfg ファイルを定義し、-c フラグを付けて実行することをお勧めします

多くのための:

https://gunicorn-docs.readthedocs.org/en/develop/configure.html

于 2016-01-05T12:25:09.660 に答える