Nginx:stat()が失敗しました(13:権限が拒否されました)


103

私のubuntu 12.04マシンにnginxがインストールされている特定のディレクトリを追加するときに、デフォルトの構成を使用しています。

server {
        #listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default ipv6only=on; ## listen for ipv6

        index index.html index.htm;

        # Make site accessible from http://localhost/
        server_name localhost;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to index.html
                root /username/test/static;
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }
...

...
}

単純な静的nginxサーバーで、そのディレクトリからファイルを提供したいだけです。しかし、error.log私が見るチェック

2014/09/10 16:55:16 [crit] 10808#0: *2 stat() "/username/test/static/index.html" failed (13: Permission denied), client:, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "domain"
2014/09/10 16:55:16 [error] 10808#0: *2 rewrite or internal redirection cycle while internally redirecting to "/index.html

私はすでにを実行しchown -R www-data:www-dataましたが/username/test/static、に設定しましたchmod 755。他に何を設定する必要があるのか​​わかりません。


3
かどうかをチェックしwww-data、ユーザ缶cd/username/test/staticディレクトリ:sudo -u www-data cd /username/test/static
マチェイSzの

権限が拒否されましたが、ls -lを実行すると、www-dataユーザーに設定されていることが示されます
user299709

2
/ usernameがencryptfsにあるのでしょうか?私のサイトが配置されている/ home / usernameフォルダーでまったく同じ問題が発生しています。それをencryptfsから移動すると、すべて正常に動作します。それでも解決策はありません...
Georgi

回答:


193

Nginxはディレクトリ内で動作するためcd、nginxユーザーからそのディレクトリにアクセスできない場合、(statログのコマンドと同様に)失敗します。がに至るまでwww-userできることを確認してください。を実行すると、失敗または成功することを確認できますcd/username/test/staticstat

sudo -u www-data stat /username/test/static

あなたの場合、おそらく/usernameディレクトリがここの問題です。通常、他のユーザーのホームディレクトリへのwww-dataアクセス許可はありませんcd

その場合の最善の解決策は、グループに追加するwww-dataことusernameです。

gpasswd -a www-data username

そして、usernameグループがパスに沿ってすべてのディレクトリに入ることができることを確認してください:

chmod g+x /username && chmod g+x /username/test && chmod g+x /username/test/static

変更を有効にするには、nginxを再起動します

nginx -s reload

ルートの下に追加されるすべての新しいディレクトリについて、chmodは新しいディレクトリに対して実行する必要があるという意味ですか?
銭チェン

2
@ElgsQianChenはこれがOSレベルの権限システムであることを覚えておいてください。POSIXシステムではに依存しますumask。より一般的なソリューションが必要な場合は、chmodすべての新しいディレクトリを使用する必要はありませんが、ソリューションがあります。これは、逆グループ(関連必要usernamewww-dataグループ)との使用setgid。より詳細な説明が必要な場合は、新しい質問を投稿してください。お答えします。
Maciej Sz 2015

パスが/ root /ディレクトリにある場合はどうなりますか?/ rootでchmod g + xを実行しても安全ですか?ルートグループにwww-dataを追加しますか?
Oleg Abrazhaev 2016年

Fedora 24では、私の問題は... ACL許可...別のレイヤー... YEY!
レイフォス

1
よく私のnginxユーザーは私のウェブサイトのディレクトリにアクセスできますが、それでもエラーログでアクセス許可が拒否されたと表示されます。
Rahil Wazir

88

CentOS 7ボックスで同じ問題が発生しました。

私はselinuxを打ったようです。selinuxをpermissiveモードにする(setenforce permissive)にすることで、今のところ問題は解決しています。私は適切な修正を試みて戻ってきます。


4
これは、過去3日間に私が理解しようとしていた正確な「文書化されていない」動作です...
アキレス

2
この動作に関する投稿は次のとおり
Achilles

2
だから、私はここに戻ってきました...今回は、問題のファイルをホームディレクトリからhtmlディレクトリにコピーし、所有権を更新しました。2015と同じ問題...より良い修正: ls -Z myFile.jsSELinuxコンテキストを表示します:SELinuxコンテンツを変更-rw-r--r--. nginx nginx unconfined_u:object_r:user_home_t:s0 myFile.js するchcon -v --type=httpd_sys_content_t myFileために使用します。
Andrew Richard Miller

2
うん; 同じ問題がありました。sudo setenforce 0私のために修正しました。
過負荷

1
注:selinuxを完全に無効にする場合は、SELINUX値をdisabledin に変更してから/etc/selinux/config再起動する必要があります。に設定されてpermissiveいても、バックグラウンドで(貴重なCPUを使用して)チェックを実行できますが、アクションは実行されません。
Oliver Tappin

76

Nginxは、サイトのルートディレクトリに至るすべてのディレクトリに対して+ xアクセスが必要です。

サイトのルートへのパスにあるすべてのディレクトリに+ xがあることを確認してください。たとえば、サイトのルートが/ home / username / siterootの場合:

chmod +x /home/
chmod +x /home/username
chmod +x /home/username/siteroot

13
6時間の必死の捜索の後...発見された体はこれに言及しましたがあなたです!ありがとうございました!
Walid Ammar

3
どうもありがとうございます!これを機能させるために費やした時間は、あらゆる種類の答えに出くわしましたが、それがそれほど単純であるとは信じられません!
Eric Groom、

2
これは私にとってはうまく
いき

1
ありがとうございました!これが私がずっとしなければならなかったすべてだとは信じられません!
Excitabletom、

1
ありがとう、完璧!
Softsofter

32

CentOS 7.0ではAccess Deined、SELinuxが原因でこの問題が発生し、次の手順で問題が解決しました:

yum install -y policycoreutils-devel
grep nginx /var/log/audit/audit.log | audit2allow -M nginx
semodule -i nginx.pp

更新: digitaloceanの仮想Linuxサーバーを使用しているときに学んだこと、または彼らがDropletsと呼んでいることからの補足です。SELinuxを使用するには、適切な量のRAMが必要です。2GB未満のRAMを搭載した液滴ではSELinux を実行および管理できなくなる可能性があります。


2
どうもありがとうございました。最初は(CentOS 7でも)私の問題は解決しましたが、その後、別の場所で2番目の拒否によってブロックされたため、に頼りましたsetenforce 0。しかし、このソリューションの実際の動作を振り返ると、nginxユーザーの権限を更新するためにコマンドを再実行する必要があることに気付きました。それは機能しているようで、SELinuxを強制に戻すことができました。
danj1974 2015

まあ、これは少し遅すぎるかもしれません。それでも、SELinuxを強制し続けると、言及する価値があります。Nginxのようなソフトウェアは、デフォルトポート、デフォルトパス、パスへの読み取り/書き込みアクセスなどの独自のルールセットをSELinuxに挿入することを忘れないでください。問題が発生しない場合は、それらのルール(HTML / PHPファイルを/ var / wwwに配置するなど)に従うか、SELinuxコンテキストで発生する問題を克服する準備をする必要があります。これは役に立ちます[CentOS <8]:getpagespeed.com/server-setup/nginx/nginx-selinux-configuration
Achilles

27

Security-Enhanced Linuxを実行している可能性があるため、そのためのルールを追加します。権限が設定され、ユーザーが存在していたにもかかわらず、権限13のエラーが発生しました。

chcon -Rt httpd_sys_content_t /username/test/static


ありがとう!CentOSリリース6.10(最終)で動作しました。
2018

1
CentOS 7.5.1804(コア)で動作しました。
Niek、2018年

4

症状:

WordPressメディアライブラリに画像をアップロードできませんでした。

原因:

(CentOS) yum update

エラー:

2014/10/22 18:08:50 [crit] 23286#0: *5332 open() "/var/lib/nginx/tmp/client_body/0000000003" failed (13: Permission denied), client: 1.2.3.4, server: _, request: "POST /wp-admin/media-new.php HTTP/1.1", host: "example.com", referrer: "http://example/wp-admin/media-new.php"

解決:

chown -R www-data:www-data /var/lib/nginx


2

デフォルトでは、静的データはnginxをインストールすると、/ var / www / htmlにあります。静的フォルダーを/ var / html /にコピーして、

root /var/www/<your static folder>

ngix.conf(または/ etc / nginx / sites-available / default)

これは私にとってubuntuで機能しましたが、他のディストリビューションでもそれほど変わらないはずです。

それが役に立てば幸い。


2

nginx.conf userプロパティをwww-staticファイル所有者に変更します。

#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user your_user_name;

# same other config

1

私はこの問題に直面し、nginxユーザーとグループに次のような権限を与えるように解決しました:

chown -R nginx:nginx /username/test/static

1

私の場合、ファイルを提供したフォルダは別のフォルダへのシンボリックリンクで、

ln -sf /origin /var/www/destination

権限(ユーザーとグループ)が宛先フォルダー(シンボリックリンク)で正しい場合でも、Nginxには元のフォルダー全体の階層への権限も必要だったため、エラーが発生しました。


1

私はようやく自分の道を見つけました。要するに、あなたのユーザー名がjoeあなたであり、あなたがあなたの個人的なファイルシステムの下にウェブサイトを持っているとしましょう/home/joe/path/to/website

あなたは文字通りnginxあなたの仲間であるシステムに伝えなければなりません。
場所nginxでのjoeグループ:

sudo gpasswd -a nginx joe

その後、それでも機能しない場合は、/home/joeディレクトリの正しいアクセス権を確認してください。それがおそらくnginxがファイルに到達できない理由です。彼があなたの友達であったとしても、あなたは彼にあなたの家への扉を開かなければならないからです。

sudo chmod g+x /home/joe

それでおしまい。これは、nginxにローカルファイルへのアクセス権を与えるために文字通り行う必要があることです。

nginxは高い権限であり、管理者だけがグループを変更できるため、この方法にはセキュリティ上の懸念はないと思います。ディレクトリのnginx内容を読み取ることができるようになりましたjoe。これは、nginxアカウントの所有者が、ディレクトリアクセスを開いたユーザーと異なる場合のセキュリティ違反ですが、私の場合、私は両方の当事者の所有者であり、ローカルコンテキストにあります。


0

同じ問題がありました。Centos7でPlesk Onyx 17を使用しています。影響を受けるドメインのログの下のproxy_error_logでこのエラーを確認できました。/ var / www / vhosts /内のすべてのディレクトリ/ファイルは、それぞれのユーザー(ドメイン所有者)が所有しており、それらのすべてがpsaclnグループにあることがわかります。したがって、解決策は、このグループにもnginxを追加することでした。これにより、彼は必要なものを確認できます。

usermod -aG psacln nginx

そして確かに、nginxを再起動し、Ctrl + F5でページをリロードします。


0

回避策を見つけました:フォルダーをnginx構成フォルダーに移動しました。私の場合は "/ etc / nginx / my-web-app"です。そして、権限をrootユーザー "sudo chown -R root:root" my-web-app "に変更しました。


0

nginxを実行するユーザーを追加することもできます。nginx.confファイルで、次の変更を行います。

user root;

上記の行をnginx confの最初の行として追加できます。そのディレクトリへの書き込み権限を持つ任意のユーザーの名前を書き込むことができます。


0

これは通常特権の問題です...私にとっては、nginxルートとして/ root / **を使用しているため、より高い特権が必要です。簡単な方法は、自分で作成したディレクトリにプロジェクトを移動するだけです。

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