web-dev-qa-db-ja.com

Nginxは静的ファイルを提供し、403が禁止されました

誰かを助けたいだけです。はい、nginxを使用して静的ファイルを提供したいだけで、nginx.confにすべてが揃っています:

location /static {
       autoindex on;
       #root /root/downloads/boxes/;
       alias /root/downloads/boxes/;
      }

しかし、最後に、あなたは失敗しました。ブラウザから「403 forbidden」を取得しました...

----------------------------------------以下の回答:----------------------------------------

ソリューションは非常にシンプルです:


方法1: '/ root/downloads/boxes /'所有者としてユーザーとしてnginxを実行します

Innginx.conf

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;

はい、最初の行の「#user noboy;」、「」を削除し、「nobody "をLinux/OS Xのユーザー名に変更します。つまり、テストのために"root "に変更します。 nginxの再起動。

Attentionnginxrootとして実行しない方が良いでしょう!ここでは、テストのためだけに、ハッカーにとって危険です。

詳細については、 nginx(engine X)– BUMの痛み![13:許可が拒否されました] を参照してください。


方法2: '/ root/downloads/boxes /'の所有者を 'www-data'または 'nobody'に変更する

InTerminal

ps aux | grep nginx

実行中のnginxのユーザー名を取得します。 nginxのバージョンによって 'www-data'または 'nobody'で決定されます。次に、ターミナルでヒットします(たとえば 'www-data'を使用):

chown -R www-data:www-data /root/downloads/boxes/

------------------------------もう1つ重要なことは:- ----------------------------

これらの親ディレクトリ "/" "/ root" "/ root/downloads"execute(x)パーミッションを 'www-data'または 'nobody'に与える必要があります。つまり.

ls -al /root
chmod o+x /root
chmod o+x /root/downloads

詳細については、 「403 Forbidden」エラーの解決 および Nginx 403すべてのファイルで禁止 を参照してください。

46
isaacselement

ファイルを読み取るには、nginxパーミッションを付与する必要があります。つまり、nginxプロセスを実行するユーザーにファイルを読み取る許可を与える必要があります。

Nginxプロセスを実行するこのユーザーは、通常nginx.confの最上部のどこかにあるnginx configのuserディレクティブで構成可能です。

user www-data

http://wiki.nginx.org/CoreModule#user

userに与える2番目の引数はグループですが、指定しない場合はユーザーと同じものを使用するため、この例ではユーザーとグループは両方ともwww-dataです。

これで、nginxで提供するファイルに適切な権限が付与されます。 Nginxには、ファイルを読み取る権限が必要です。グループにwww-data読み取り許可を与えるには、次のようなファイルを許可します。

chown :www-data my-file.html

http://linux.die.net/man/1/chown

chownを使用すると、ファイルのユーザーとグループの所有者を変更できます。このコマンドでは、グループのみを変更します。ユーザーも変更する場合は、chown www-data:www-data my-file.htmlのようにコロンの前にユーザー名を指定します。ただし、nginxがファイルを読み取れるようにするには、グループのアクセス許可を正しく設定するだけで十分です。

55
gitaarik

Nginxは静的ファイルを直接処理しているため、適切なディレクトリにアクセスする必要があります。ホームディレクトリの実行許可を与える必要があります。

これを行う最も安全な方法は、Nginxユーザーを独自のユーザーグループに追加することです。その後、ホームディレクトリのグループ所有者に実行可能権限を追加し、Nginxがファイルを提供するための十分なアクセス権を付与します。

Sudo usermod -a -G your_user nginx

chmod 710/home/your_user

9
sandes

受け入れられた答え

Sudo chown -R :www-data static_folder

そのフォルダ内のすべてのファイルのグループ所有者を変更するため

6
masternone

非常に有用な回答を掘り下げた後、レシピとして許可に関連するすべてを収集することにしました。具体的には、最大限のセキュリティを備えた最も簡単なソリューション(=最小限の権限)。

  1. ユーザーadminとしてサイトを展開するとします。つまり、彼女はサイトdirとその中のすべてを所有します。 notこのユーザーとしてnginxを実行したい(許可が多すぎる)。 prodではなく、テストでも問題ありません。
  2. デフォルトでは、Nginxはワーカーをユーザーnginxとして実行します。つまり、configにはuser nginx
  3. デフォルトでは、ユーザーnginxは同じ名前のグループnginxにあります。
  4. ファイルの所有権を変更せずに、ユーザーnginxに最小限の権限を付与したいと考えています。これは最も安全なナイーブオプションのようです。
  5. 静的ファイルを提供するには、フォルダ階層で最低限必要なアクセス許可(グループのアクセス許可を参照)は次のようにする必要があります(コマンドnamei -l /home/admin/WebProject/site/static/hmenu.css):

    dr-xr-xr-xルートルート/
    drwxr-xr-xルートルートホーム
    drwxr-x --- admin nginx admin
    drwx--x --- admin nginx WebProject
    drwx--x --- admin nginxサイト
    drwx--x --- admin nginx static
    -rwxr ----- admin nginx hmenu.css

  6. 次に、この美しい写真を取得する方法は? DIRのグループ所有権を変更するには、最初にSudo chown :nginx /home/admin/WebProject/site/staticその後、コマンドを繰り返して、右から順にディレクトリを削除します。

  7. DIRのアクセス許可を変更するには、Sudo chmod g+x /home/admin/WebProject/site/staticそして再びディレクトリを削除します。

  8. / static dir内のファイルのグループを変更します:Sudo chown -R :nginx /home/admin/WebProject/site/static

  9. 最後に、/ static dir内のファイルのアクセス許可を変更します:Sudo chmod g+r /home/admin/WebProject/site/static/*

(もちろん、専用のグループを作成してユーザー名を変更することもできますが、これにより重要でない詳細でナレーションが不明瞭になります。)

4

Nginxでユーザールートを設定するのは非常に危険です。すべてのファイル階層にアクセス許可を設定するのは面倒な場合があります(フォルダーのフルパスが10個を超えるサブフォルダーの下にあると想像してください)。

私がしたいことは、共有したいフォルダーを、/ usr/share/nginx/any_folder_nameの下で、nginxの設定済みユーザー(通常はwww-data)の権限でミラーリングすることです。 bindfsでできること。

あなたの場合、私はそうするでしょう:

Sudo bindfs -u www-data -g www-data /root/downloads/boxes/ /usr/share/nginx/root_boxes

ユーザーwww-dataのすべての権限で/ root/downloads/boxesを/ usr/share/nginx/root_boxesにマウントします。今、あなたはあなたのロケーションブロック設定でそのパスを設定します

location /static {
   autoindex on;
   alias /usr/share/nginx/root_boxes/;
  }
1
roj4s

私にとってはSElinuxだったので、次を実行する必要がありました:(RHEL/Centos on AWS)

Sudo setsebool -P httpd_can_network_connect on 
chcon -Rt httpd_sys_content_t /var/www/
0
Joe