web-dev-qa-db-ja.com

すべての権限が適切に設定されているにもかかわらず、Nginxが403を返すのはなぜですか?

Nginxをセットアップして、テストページを適切に表示しています。ルートパスを変更しようとすると、すべての権限が同一であっても、403 Forbiddenエラーが表示されます。さらに、nginxユーザーが存在します。

nginx.conf:

user nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log;

pid        /run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    index   index.html index.htm;

    server {
        listen       80;
        server_name  localhost;
        root         /var/www/html; #changed from the default /usr/share/nginx/html
    }
}

namei -om /usr/share/nginx/html/index.html

f: /usr/share/nginx/html/index.html
dr-xr-xr-x root root /
drwxr-xr-x root root usr
drwxr-xr-x root root share
drwxr-xr-x root root nginx
drwxr-xr-x root root html
-rw-r--r-- root root index.html

namei -om /var/www/html/index.html

f: /var/www/html/index.html
dr-xr-xr-x root root /
drwxr-xr-x root root var
drwxr-xr-x root root www
drwxr-xr-x root root html
-rw-r--r-- root root index.html

エラーログ

2014/03/23 12:45:08 [エラー] 5490#0:* 13 open() "/var/www/html/index.html"が失敗しました(13:許可が拒否されました)、クライアント:XXX.XX.XXX。 XXX、サーバー:localhost、リクエスト: "GET /index.html HTTP/1.1"、ホスト: "ec2-XXX-XX-XXX-XXX.compute-1.amazonaws.com"

42
Adam Pearlman

同じ問題が発生しましたが、これはSELinuxが原因でした。

SELinuxが実行されているかどうかを確認するには:

# getenforce

次回の再起動までSELinuxを無効にするには:

# setenforce Permissive

Nginxを再起動して、問題が解決しないか確認してください。設定を永続的に変更する場合は、/etc/sysconfig/selinuxを編集できます

SELinuxが問題の場合は、次のコマンドを実行して、nginxがwwwディレクトリを提供できるようにします(これをテストする前にSELinuxをオンに戻します。つまり、# setenforce Enforcing)。

# chcon -Rt httpd_sys_content_t /path/to/www

それでも問題が解決しない場合は、getsebool -aのブールフラグを確認してください。特に、ネットワークアクセスのためにhttpd_can_network_connectをオンにする必要がある場合があります。

# setsebool -P httpd_can_network_connect on

私にとっては、httpがwwwディレクトリを提供できるようにするだけで十分でした。

170
Kurt

私は同じ問題に遭遇しました。 Fedora/RedHat/CentOSを使用している場合、これが役立つ場合があります。

  • SELinuxによると:setsebool -P httpd_read_user_content 1

お役に立てれば。

6
Bryan Macías

まず、nginxがファイルシステムにアクセスできるようにするには、次のコマンドを実行する必要があります

Sudo setsebool -P httpd_read_user_content 1

次のコマンドでファイルまたはディレクトリを確認できます。

ls -Z

それでもアクセスできない場合は、次のコマンドを使用してファイルとフォルダーのSELinuxプロパティを変更してみてください。

chcon -Rt httpd_sys_content_t /path/to/www

ただし、上記のコマンドは、FuseまたはNFSシステムのファイルには適用できません。

Fuseマウントからのファイルの提供を有効にするには、次を使用できます。

setsebool httpd_use_fusefs 1

NFSマウントからのファイルの提供を有効にするには、次を使用できます。

setsebool httpd_use_nfs 1
6
Terry Lam

これはProwlasの答えに追加されますが、私は十分に評価することはできません:/ path/to/wwwがユーザーのホームディレクトリである場合。試してみてください:

setsebool -P httpd_enable_homedirs=1

これで問題が解決しました

ソース: http://forums.fedoraforum.org/archive/index.php/t-250779.html

3
rassi

アクセスが拒否される理由は2つあります。

  1. アクセスは [〜#〜] dac [〜#〜] によって拒否されます。ユーザー、グループ、およびファイルのアクセス許可を再確認してください。構成ファイルで指定されたユーザーとして実行する場合、nginxプロセスが新しいhtmlルートパスにアクセスできることを確認してください。

  2. アクセスは [〜#〜] mac [〜#〜] によって拒否されます。その中で最も広く使用されているのはSELinuxです。問題の原因かどうかを確認するには、nginxプロセスを停止して、次のコマンドを実行します。

    setenforce Permissive
    

    次に、nginxを再度起動して、アクセスが許可されているかどうかを確認します。

    または、ファイルコンテキストを確認できます。

    setenforce Enforcing
    ls -Zd /usr/share/nginx/html /var/www/html
    

    2つのコンテキストが異なる場合、新しいhtmlルートパスのコンテキストを変更する必要がある場合があります。

    chcon -R -t httpd_sys_content_t /var/www/html
    

    Nginxを再起動し、正常に機能するかどうかを確認します。その場合、変更を永続的にすることができます。

    semanage fcontext -a -t httpd_sys_content_t '/var/www/html(/.*)?'
    restorecon -Rv /var/www/html
    

    これらのコマンドの一部は、rootとして実行する必要があります。

2
Cyker

論理的に思えますが、すべてのファイルはrootユーザーです。それをnginxユーザーに変更してみてください。リストの許可が最初に拒否されないようにしたかっただけです。

Sudo chown -R nginx:nginx /var/www/html
2

私は同じ問題に遭遇しました:

  • ユーザーを確認するためにnginx.confをチェックしました
  • 権限が適切に設定された
  • パス全体に「x」が正しく設定されていることを確認しました

コマンドラインから再起動しました(これまでずっとWebminを使用していました)が、このエラーに気付きました。

 aed@aed:/var/www/test.local$ Sudo service nginx restart
 * Restarting nginx nginx 
nginx: [warn] conflicting server name "test.local" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "test.local" on 0.0.0.0:80, ignored

どうやら定義の重複があったため、「test.local」にアクセスしようとして失敗しました。

1
dougB

フォルダーに新しいユーザーを追加したときにこの問題に遭遇しました/home/new_user新しい仮想ホストとして。これらのフォルダー(/home/home/new_user/home/new_user/xxx...)は755ので、私の問題は解決しました。最後に、私の問題は/var/log/nginx/error.logファイル。

1
loszer

他のユーザーにパス全体の読み取りを許可する必要があることに注意してください。また、Dropboxがルートディレクトリに700を設定することを忘れないでください。そう chmod 755 ~/Dropboxは私の問題を解決しました。

1
Michael Ma

私が使用していた:

Sudo service nginx start

私が使用する場合:

Sudo nginx 

...すべて正常に動作します。誰でもこれら2つの違いを説明できますか?

1
Adam Pearlman

ファイルnginx.confを変更し、ユーザー名をアカウント名に変更して、nginx.itを再起動します。

0
zhuoming