StackOverflowにはこれについて多くの質問があるようですが、残念ながら何もうまくいきませんでした。
Nginxで502の不正なゲートウェイが発生し、ログに次のように表示されます:connect() to ...myproject.sock failed (13: Permission denied) while connecting to upstream
私はwsgi
でnginx
とubuntu
を実行しており、 Digital Oceanのこのガイド をフォローしています。 uwsgi -s myproject.sock --http 0.0.0.0:8000 --module app --callable app
が機能したため、wsgi
を正しく構成したようですが、nginx
権限拒否エラーが発生し続け、理由がわかりません。
この質問 と この他の質問 に出くわした後、.ini
ファイルを変更し、chown-socket
、chmod-socket
、uid
、 gid
パラメーター(最初の2つ、または、およびいくつかの異なるアクセス許可設定を設定しようとしましたが、最も許容度の高いものでも機能しませんでした)。
これは有望に見えました ですが、selinux
がUbuntuにインストールされているとは思いません(Sudo apt-get remove selinux
を実行すると、「パッケージ 'selinux'がインストールされていないため、削除されません」とfind / -name "selinux"
何も表示されません)。念のため、私は この投稿 推奨されるものも試しました。 apparmor
(Sudo 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
)
何か私にできることがあれば教えてください、そしてどうもありがとうございました。
私もそのチュートリアルに従い、同じ問題に遭遇しました。かなりの試行錯誤の末、次の手順で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を実行する
お役に立てれば!
パス:unix:/PATH_TO_PROJECT/PROJECT.sock
は/tmp
に配置する必要があります。これで問題が解決しました。
このスレッドのすべてのアドバイスに従った後、私はまだ許可エラーを受け取っていました。最後に欠けていたのは、/etc/nginx/nginx.conf
ファイルのnginxuser
を修正することでした。
# old: user nginx;
user www-data;
(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
遅れていることは承知していますが、他の人が問題をより早く克服できるように、この回答を投稿しました。それがお役に立てば幸いです。
Nginxのパーミッション拒否エラーを解決するために他の人が言ったことを要約すると(/var/log/nginx/error.log
を調べることができます)は通常、次の理由によるものです:
.sock
ファイルを書き込んでいます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
がトリックを実行します。
すべての権限をテストしてもまだ機能しない場合は、SELinuxが有効になっている可能性があります。これにより、同じ動作が発生します。
getenforce
を実行し、結果がEnforcing
の場合、それは役に立ちません。
簡単な修正はそれを無効にすることです、setenforce 0
ただし、再起動が必要です。
これは、ユーザーwww-dataが指定されたパスに新しいソケットを作成する権限を持っていない場合に発生する可能性があるため、rootユーザーを使用してください。ユーザーwww-dataをnginx.confのユーザーrootに関連付けます。
ex: #nginx.conf
#user www-data;
user root;
worker_processes auto;
pid /var/run/nginx.pid;
.............
Nginx.confファイルの最初の行のユーザーフィールドを確認してください。デフォルトではwww-dataです。 rootとしてログインした場合は、nginx.confファイルで名前をuserrootに変更します。
2つのことが私を助けました
Nginxで正しい構成があり、フォルダーに2つの目で/tmp/wsgi.sockが表示されていましたが、それでもアクセス許可が拒否されたか、ディレクトリが存在しませんでした。
ファイル/lib/systemd/system/nginx.service
でPrivateTmp=false
を設定し、nginxを再起動します(構成を更新するにはsystemctl daemon reload
を忘れないでください)
コマンド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
エンドポイントのみを提供している場所
Flask NginxとGunicornを使用しています。Sockファイルを/ tempフォルダーに置くことでこの問題を解決しました。