web-dev-qa-db-ja.com

Nginx Django and Gunicorn。Gunicorn sock file is missing?

私はansibleをプロビジョニングしていますVM https://github.com/jcalazan/ansible-Django-stack ですが、何らかの理由でGunicornを起動しようとすると、次のエラー:

/path/to/my/gunicorn.sockに接続できません

そしてnginxログファイルで:

上流への接続中にunix:/path/to/my/gunicorn.sockへのconnect()が失敗しました(2:そのようなファイルまたはディレクトリはありません)

そして実際には、指定されたディレクトリにソケットファイルがありません。ディレクトリの権限を確認しましたが、問題ありません。

これが私のgunicorn_startスクリプトです。

NAME="{{ application_name }}"
DJANGODIR={{ application_path }}
SOCKFILE={{ virtualenv_path }}/run/gunicorn.sock
USER={{ gunicorn_user }}
GROUP={{ gunicorn_group }}
NUM_WORKERS={{ gunicorn_num_workers }}

# Set this to 0 for unlimited requests. During development, you might want to
# set this to 1 to automatically restart the process on each request (i.e. your
# code will be reloaded on every request).
MAX_REQUESTS={{ gunicorn_max_requests }}

echo "Starting $NAME as `whoami`"

# Activate the virtual environment.
cd $DJANGODIR
. ../../bin/activate

# Set additional environment variables.
. ../../bin/postactivate

# Create the run directory if it doesn't exist.
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

# Programs meant to be run under supervisor should not daemonize themselves
# (do not use --daemon).
exec gunicorn \
    --name $NAME \
    --workers $NUM_WORKERS \
    --max-requests $MAX_REQUESTS \
    --user $USER --group $GROUP \
    --log-level debug \
    --bind unix:$SOCKFILE \
    {{ application_name }}.wsgi

誰かが欠落しているソケットファイルを引き起こす可能性がある他のものを提案できますか?

ありがとう

13
kalo

ええと、私にはコメントするのに十分な担当者がいないので、ここでは、ソケットの欠如による具体的な提案は多くないことを述べますが、私がどのようにして靴を履いて始めて、作業。

それの長くて短いことは、upistartによって実行されたときにgunicornが問題に遭遇し、立ち上がって実行されなかったか、シャットダウンされなかったことです。問題を追跡するための詳細情報を取得するのに役立ついくつかの手順を次に示します。

  • 私の場合、これが起こったとき、gunicornはエラーロギングを実行することはできなかったため、他の場所を探す必要がありました。 ps auxf | grep gunicornを試して、ワーカーがいるかどうかを確認します。私はしませんでした。
  • スタートアップからの苦情をSyslogで調べたところ、grep init: /var/log/syslogは、リスポーンが速すぎたため、gunicornサービスが停止していたことがわかりましたが、 conf。とにかく、あなたはそこに何かを見つけるかもしれません。
  • Gunicornが実行に失敗したか、エラーをログに記録していないことを確認した後、コマンドラインから実行することにしました。 manage.pyが存在するディレクトリに移動し、gunicornインスタンスに対してupstartコマンドの拡張バージョンを実行します。次のようなもの(私が使用するゴミの代わりに、すべての変数を適切な同腹子に置き換えます)。

    /path/to/your/virtualenv/bin/gunicorn --name myapp --workers 4 --max-requests 10 --user appuser --group webusers --log-level debug --error-logfile /somewhere/I/can/find/error.log --bind unix:/tmp/myapp.socket myapp.wsgi

  • 運が良ければ、pythonトレースバックを取得するか、コマンドを手動で実行した後、gunicornエラーログで何かを見つけることができます。

    • Djangoエラー(設定モジュールの読み込みに問題があるかもしれません)。 wsgi.pyがサーバー上の適切な設定モジュールを参照していることを確認してください。
    • upstartスクリプトの空白の問題。物事を壊すスペースの間にタブが隠れていました。
    • ユーザー/権限の問題。最後に、コマンドラインでrootとしてgunicornを実行できましたが、upstart構成を介して非rootユーザーとして実行することはできませんでした。

お役に立てば幸いです。このことを追跡するのに数日かかった。

22
swendr

Michal Karzynskiのすばらしいガイド ' Django Nginx、Gunicorn、virtualenv、supervisorおよびPostgreSQLを使用してセットアップ 'を実行した後、同じ問題が発生しました。

そして、これが私がそれを解決した方法です。

スーパーバイザ(myapp/bin/gunicorn_start)を介してgunicornを起動するために使用されるbashスクリプトにこの変数がありました:

SOCKFILE={{ myapp absolute path }}/run/gunicorn.sock

これは、bashスクリプトを初めて実行するときに、「run」フォルダーとsockファイルroot権限を使用を作成します。そのため、私はSudoでrunフォルダーを削除してから、Sudo権限と出来上がりなしで再作成しました!これで、GunicornまたはSupervisorを再実行しても、迷惑なsockファイルが見つからないというエラーメッセージはもう表示されません。

TL; DR

  1. Sudo実行フォルダーを削除します。
  2. Sudo権限なしで再作成します。
  3. Gunicornをもう一度実行します。
  4. ????
  5. 利益

私は同じ問題を抱えていて、Django_SETTINGS_MODULEをgunicornスクリプトの本番用設定に設定しており、wsgi設定がdevを使用していることがわかりました。

Django_SETTINGS_MODULEにdevを指定すると、すべてが機能しました。

1
Henry Lynx

ええと、私は1週間以上この問題に取り組み、ついにそれを理解することができました。 Digital Ocean からのリンクをたどってください。ただし、それらには重要な問題が含まれています

  1. アップストリームに接続している間、ライブアップストリームはありません
  2. * 4上流への接続中にunix:/myproject.sockへのconnect()が失敗しました(13:権限が拒否されました)
  3. gunicorn OSError:[Errno 1]操作は許可されていません
  4. * 1 unix:/tmp/myproject.sockへのconnect()が失敗しました(2:そのようなファイルまたはディレクトリはありません)

    etc。

これらの問題は基本的にNginxとGunicornの間の接続に関する権限の問題です。物事を簡単にするために、私は作成するすべてのfile/project/pythonプログラムに同じnginx権限を与えることをお勧めします。

すべての問題を解決するには、このアプローチに従います。最初のことは次のとおりです。

  1. Rootユーザーとしてシステムにログインします
  2. / home/nginxディレクトリを作成します。
  3. これを実行した後、 websitentilに従って実行します。アップスタートスクリプトを作成します。
  4. Chown -R nginx:nginx/home/nginxを実行します。
  5. Upstartスクリプトの場合、最後の行で次の変更を行います。exec gunicorn --workers 3 --bind unix:myproject.sock -u nginx -g nginx wsgi DONT ADD -m permission as it up socket。 Gunicornのドキュメントから、-mがデフォルトの場合、pythonが最適なアクセス許可を見つけます
  6. 起動スクリプトを開始します
  7. /etc/nginx/nginx.confファイルに移動します。サーバーモジュールに移動して追加します。

    場所/ {proxy_paramsを含める; proxy_pass http <>:<> // unix:/home/nginx/myproject.sock; } REMOVE <>ここからDigitaloceanの記事をフォローしない

    1. ここでnginxサーバーを再起動してください。
0
Shravan Shetty