web-dev-qa-db-ja.com

wsgi nginxエラー:アップストリームへの接続中にアクセス許可が拒否されました

StackOverflowにはこれについて多くの質問があるようですが、残念ながら何もうまくいきませんでした。

Nginxで502の不正なゲートウェイが発生し、ログに次のように表示されます:connect() to ...myproject.sock failed (13: Permission denied) while connecting to upstream

私はwsginginxubuntuを実行しており、 Digital Oceanのこのガイド をフォローしています。 uwsgi -s myproject.sock --http 0.0.0.0:8000 --module app --callable appが機能したため、wsgiを正しく構成したようですが、nginx権限拒否エラーが発生し続け、理由がわかりません。

この質問この他の質問 に出くわした後、.iniファイルを変更し、chown-socketchmod-socketuidgidパラメーター(最初の2つ、または、およびいくつかの異なるアクセス許可設定を設定しようとしましたが、最も許容度の高いものでも機能しませんでした)。

これは有望に見えました ですが、selinuxがUbuntuにインストールされているとは思いません(Sudo apt-get remove selinuxを実行すると、「パッケージ 'selinux'がインストールされていないため、削除されません」とfind / -name "selinux"何も表示されません)。念のため、私は この投稿 推奨されるものも試しました。 apparmorSudo apt-get install apparmor)のアンインストールも機能しませんでした。

変更を加えるたびにSudo service nginx restartを実行しますが、502ゲートウェイエラー(およびログを読み取ったときにアクセス許可が拒否されたエラー)しか表示されません。

これは私のnginx構成ファイルです:

server {
    listen 80;
    server_name 104.131.110.156;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/user/myproject/web_server/myproject.sock;
    }
}

.confファイル:

description "uWSGI server instance configured to serve myproject"

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

setuid user
setgid www-data

env PATH=/root/.virtualenvs/my-env/bin
chdir /home/user/myproject/web_server
exec uwsgi --ini /home/user/myproject/web_server/myproject.ini

.iniファイル:

[uwsgi]
module = wsgi

master = true
processes = 5

socket = /home/user/myproject/web_server/myproject.sock
chown-socket=www-data:www-data
chmod-socket = 664
uid = www-data
gid = www-data

vacuum = true
die-on-term = true

(それが助けになるなら、これらは私のデジタルオーシャンマシンの仕様です:Linux 3.13.0-43-generic #72-Ubuntu SMP Mon Dec 8 19:35:06 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

何か私にできることがあれば教えてください、そしてどうもありがとうございました。

7
aralar

私もそのチュートリアルに従い、同じ問題に遭遇しました。かなりの試行錯誤の末、次の手順でuWSGIとnginxを正常に実行できました。

私のnginx.configファイル:

server {
    listen 80;
    server_name localhost;

    location / { try_files @yourapplication; }
    location @yourapplication; {
        include uwsgi_params;
        uwsgi_pass unix:/PATH_TO_PROJECT/PROJECT.sock;
    }
}

私の.iniファイルはうまく機能していなかったので、利用可能なuWSGIの広範な引数を利用することにしました。これが私が使用したものです:

uwsgi -s /PATH_TO_PROJECT/PROJECT.sock -w wsgi:app -H /PATH_TO_PROJECT/venv --http-processes=4 --chmod-socket=666 --master &

どこ:

-s /PATH_TO_PROJECT/PROJECT.sock = .sockファイルの場所

-w wsgi:app =私のwsgi.pyファイルの場所、およびappは私のFlaskオブジェクトの名前)

-H /PATH_TO_PROJECT/venv =仮想環境の場所

--http-processes=4 = uWSGIが作成するhttpプロセスの数

--chmod-socket=666 =ソケットに設定する権限

--master = uWSGIをマスタープロセスマネージャーで実行できるようにする

& =バックグラウンドでuWSGIを実行する

お役に立てれば!

7
brandorags

パス:unix:/PATH_TO_PROJECT/PROJECT.sock/tmpに配置する必要があります。これで問題が解決しました。

6
JZ.

このスレッドのすべてのアドバイスに従った後、私はまだ許可エラーを受け取っていました。最後に欠けていたのは、/etc/nginx/nginx.confファイルのnginxuserを修正することでした。

# old: user  nginx;
user  www-data;
6
ChrisFreeman

(13:許可が拒否されました)

これは、権限の問題のためにNginxがuWSGIソケットに接続できなかったことを示しています。通常、これは、制限された環境でソケットが作成されている場合、またはアクセス許可が間違っている場合に発生します。 uWSGIプロセスはソケットファイルを作成できますが、Nginxはそれにアクセスできません。

これは、ルートディレクトリ(/)ソケットファイル間の任意の時点でアクセス許可が制限されている場合に発生する可能性があります。 nameiコマンドにソケットファイルへの絶対パスを渡すことにより、ソケットファイルとその各親ディレクトリのアクセス許可と所有権の値を確認できます。

namei -nom /PATH_TO_YOUR_SOCKET_FILE/YOUR_SOCKET.sock

出力は次のようになります(ケースのフォルダー名が異なる場合があります)

f: /run/uwsgi/firstsite.sock
 drwxr-xr-x root  root     /
 drwxr-xr-x root  root     run
 drwxr-xr-x sammy www-data uwsgi
 srw-rw---- sammy www-data firstsite.sock

出力には、各ディレクトリコンポーネントのアクセス許可が表示されます。権限(最初の列)、所有者(2番目の列)、およびグループの所有者(3番目の列)を調べることで、ソケットファイルに許可されているアクセスの種類を把握できます。

上記の例では、ソケットファイルに至るまでの各ディレクトリにワールド読み取りおよび実行権限があります(ディレクトリの権限列は---ではなくr-xで終わります)。 www-dataグループは、ソケット自体に対するグループ所有権を持っています。これらの設定により、Nginxプロセスはソケットに正常にアクセスできるはずです。

ソケットにつながるディレクトリのいずれかがwww-dataグループによって所有されていないか、ワールド読み取りおよび実行権限がない場合、Nginxはソケットにアクセスできません。通常、これは構成ファイルに誤りがあることを意味します。

したがって、この問題を修正しますが、次のコマンドを使用してすべての上位フォルダーにアクセス許可を付与します。

chmod 755 directory_name

遅れていることは承知していますが、他の人が問題をより早く克服できるように、この回答を投稿しました。それがお役に立てば幸いです。

4
DeFoG

Nginxのパーミッション拒否エラーを解決するために他の人が言ったことを要約すると(/var/log/nginx/error.logを調べることができます)は通常、次の理由によるものです:

  1. nginxに権限がない場所に.sockファイルを書き込んでいます
  2. SELinuxが問題を引き起こしています

1を解決するには:まず、ここで提案されているように.sock/tmpファイルを書き込まないでください サーバー障害の回答 Fedoraではサービスごとに異なる/tmpが表示されるためです。 ~/myproject/mysocket.sockなどの場所で書くことができます。 nginxユーザーは、アプリケーションディレクトリにあるソケットファイルにアクセスするために、アプリケーションディレクトリにアクセスできる必要があります。デフォルトでは、CentOSは各ユーザーのホームディレクトリを非常に制限的にロックダウンするため、nginxユーザーをユーザーのグループに追加して、アクセスを許可するために必要な最小限のアクセス許可を開くことができるようにします。

次のコマンドを使用して、nginxユーザーをユーザーグループに追加できます。コマンドでユーザーを自分のユーザー名に置き換えます。

Sudo usermod -a -G $USER nginx

これで、ユーザーグループにホームディレクトリに対する実行権限を与えることができます。これにより、Nginxプロセスは以下のコンテンツを入力してアクセスできるようになります。

chmod 710/path/to/project/dir

permission deniedエラーがまだ存在する場合:ハックSudo setenforce 0がトリックを実行します。

3
chandresh

すべての権限をテストしてもまだ機能しない場合は、SELinuxが有効になっている可能性があります。これにより、同じ動作が発生します。

getenforceを実行し、結果がEnforcingの場合、それは役に立ちません。

簡単な修正はそれを無効にすることです、setenforce 0ただし、再起動が必要です。

1
oden

これは、ユーザーwww-dataが指定されたパスに新しいソケットを作成する権限を持っていない場合に発生する可能性があるため、rootユーザーを使用してください。ユーザーwww-dataをnginx.confのユーザーrootに関連付けます。

ex: #nginx.conf
#user www-data;
user root;
worker_processes auto;
pid /var/run/nginx.pid;
.............
1
Vicky Gupta

Nginx.confファイルの最初の行のユーザーフィールドを確認してください。デフォルトではwww-dataです。 rootとしてログインした場合は、nginx.confファイルで名前をuserrootに変更します。

0
Faisal Julaidan

2つのことが私を助けました

Nginxで正しい構成があり、フォルダーに2つの目で/tmp/wsgi.sockが表示されていましたが、それでもアクセス許可が拒否されたか、ディレクトリが存在しませんでした。

  1. ファイル/lib/systemd/system/nginx.servicePrivateTmp=falseを設定し、nginxを再起動します(構成を更新するにはsystemctl daemon reloadを忘れないでください)

  2. コマンドsetenforce 0を実行します

ボーナス素材:

/usr/local/bin/uwsgi --chdir /home/biohazard/myproject -s /tmp/wsgi.sock -w api:app --chmod-socket=777 --master --thunder-lock --http-processes=2ここで、api:appのapiは/home/biohazard/myproject/api.pyを表します

そして

location = /api { rewrite ^ /api/; }
location /api { try_files $uri @api; }
location @api {
  include uwsgi_params;
  uwsgi_pass unix:/tmp/wsgi.sock;
}

Nginxが私のhttp://example.org/apiエンドポイントのみを提供している場所

0
BIOHAZARD

Flask NginxとGunicornを使用しています。Sockファイルを/ tempフォルダーに置くことでこの問題を解決しました。

0