アップストリームの読み取り中に許可が拒否されました


40

Railsアプリケーションをnginxとパッセンジャーにデプロイしました。アプリケーションのページが部分的にロードされることがあります。アプリケーションログにエラーはありませんが、nginxエラーログには次のように表示されます。

2011/02/14 05:49:34 [crit] 25389#0: *645 open() "/opt/nginx/proxy_temp/2/02/0000000022" failed (13: Permission denied) while reading upstream, client: x.x.x.x, server: y.y.y.y, request: "GET /signup/procedures?count=0 HTTP/1.1", upstream: "passenger:unix:/passenger_helper_server:", host: "y.y.y.y", referrer: "http://y.y.y.y/signup/procedures"


ログレベルをデバッグに設定できます。nginx.org
en

回答:


39

NGINX / PHP-FPMの設定(php-fpm = phpのfcgiの改善)でも同じ問題が発生しました。

nginxプロセスが実行されているユーザーを確認できます

ps aux | grep "nginx: worker process"

そして、プロキシファイルの権限が正しいかどうかを確認します

ls -l /opt/nginx/proxy_temp/

私の場合、nginxはasとして実行さwww-dataれ、プロキシディレクトリ内の2つのディレクトリはルートに属していました。

私はそれがどのように起こったのかまだわかりませんが、(ルートとして)

chown www-data.www-data /opt/nginx/proxy_temp

4
最高のソリューション!
efkan 16

なぜまだ受け入れられないのですか?
キショールパワー

1
: "WWW-データ-Rは/ usr / local / openresty / nginxの/ * _一時はchown WWWデータ" - #openresty使う人のために
BGブルーノ

1
nginxプロセスを停止し、フォルダーの名前を別の名前に変更し、nginxプロセスを再起動しましたが、正しい権限でフォルダーが再度作成されました。魅力のように働いた!
Chirayu Shishodiya

8

おそらくユーザーrootで始めてから変更しました。問題は、キャッシュフォルダー、つまり

/var/cache/nginx/client_temp
/var/cache/nginx/fastcgi_temp
/var/cache/nginx/proxy_temp
/var/cache/nginx/scgi_temp
/var/cache/nginx/uwsgi_temp

rootがすでに所有しているため、nginx(または切り替えようとしているもの)ユーザーは700のアクセス許可を持っているためアクセスできません。

そのため、ソリューションは簡単です。nginxを停止してから:

rm -rf /var/cache/nginx/*

またはあなたのディストリビューションとリリースにあるパスは何でも。次に、nginxを再起動して、適切な権限でこれらのフォルダーを再作成します。


8

また、nginx.confファイルをチェックして、正しいユーザーとグループを指定していることを確認してください。

ディレクトリのパーミッションがusername / nginx用に設定されている問題がありましたが、nginx.confユーザーはユーザー名のみを指定しました。デフォルトでは、ユーザーディレクティブにグループが指定されていない場合、ユーザーと同じ名前が使用されます。そのため、ユーザー名/ユーザー名はユーザー名/ nginxではなくディレクトリにアクセスしようとしました。構成を更新すると問題が解決しました。

参照:http : //nginx.org/en/docs/ngx_core_module.html#user


2
ここで言及した設定を投稿してください。
パウエルロック14年

4

そのため、上記のすべてを実行しましたが、残念ながら同じエラーが発生しました。nginxを搭載したcentos 6.7マシンで、torkboxを含むjarファイルにパッケージ化されたrailsアプリを実行しています。私は別の解決策を見つけるまで約3時間これを戦い、それが他の誰かを助けることを願っています。この記事によると nginxは強制モードで実行される場合があります。私は単にnginxをpermissiveモードに変更しました

setenforce 0

これでエラーがなくなり、ステージング/実稼働環境でアプリケーションを実行できました。

audit.logでエラーを見つけるまで、私は無知でした

type=AVC msg=audit(1444454198.438:466): avc:  denied  { name_connect } for  pid=3201 comm="nginx" dest=8080 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:http_cache_port_t:s0 tclass=tcp_socket

失ったばかりの3時間でこれが誰かを救うことを本当に願っています。


1
あなたは間違っていません、誰かが-1を投票する理由がわかりません(恥ずかしいです)。問題は、RedHat / CentOSベースのホストとselinuxにあります。1つの方法はsetenforce 0(失礼)で、もう1つの方法はsetseboolとネットワークオプションを使用する方法です。
periket2000

CentOS 7.2で役立ちました。
MKatleast3

setsebool -P httpd_can_network_connect 1 stackoverflow.com/a/24830777/721331
-McKelvin

3

非特権アカウントからnginxの起動するときuse_temp_path=off

proxy_cache_path ... use_temp_path=off;

これは、nginxがファイルをデフォルトに配置しようとするのを避けるために必要でしたproxy_temp_path。nginxドキュメントから:

一時ファイルのディレクトリは、use_temp_pathパラメーター(1.7.10)に基づいて設定されます。このパラメーターを省略するか、値onに設定すると、指定された場所のproxy_temp_pathディレクティブで設定されたディレクトリーが使用されます。値がオフに設定されている場合、一時ファイルはキャッシュディレクトリに直接配置されます。


-3
chmod 777 /opt/nginx/proxy_temp/

私は同じ問題を抱えていて、そのディレクトリへのchmodで解決しました。


13
chmod 777は決して良いアイデアではありません。
sendmoreinfo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.