web-dev-qa-db-fra.com

Nginx sert un fichier statique et obtient 403 interdit

Je veux juste aider quelqu'un. oui, vous voulez juste servir un fichier statique à l'aide de nginx, et vous avez tout compris nginx.conf :

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

Mais finalement, vous avez échoué. Vous avez obtenu "403 interdit" du navigateur ...

---------------------------------------- Le Réponse ci-dessous: -------------------------------------- -

La solution est très simple:


Méthode 1: exécutez nginx en tant qu'utilisateur en tant que propriétaire '/ root/downloads/boxes /'

Dans nginx.conf :

#user  nobody;
worker_processes  1;

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

OUI, dans la première ligne " # utilisateur noboy; ", supprimez simplement " # ", et changez" personne "en votre propre nom d'utilisateur sous Linux/OS X, c'est-à-dire changez en" root "pour le test. Le redémarrage nginx.

Attention , vous feriez mieux de ne pas exécuter nginx as racine ! Ici juste pour les tests, c'est dangereux pour le Hacker.

Pour plus de référence, voir nginx (moteur X) - Quelle douleur dans le BUM! [13: Autorisation refusée]


Méthode 2: remplacez '/ root/téléchargements/boxes /' owner par 'www-data' ou 'nobody'

Dans Terminal :

ps aux | grep nginx

Obtenez le nom d'utilisateur de l'exécution de nginx. Il doit être 'www-data' ou 'nobody' déterminé par la version de nginx. Appuyez ensuite sur Terminal (utilisez 'www-data' par exemple):

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

------------------------------ Une autre chose importante est: ------------------------------

Ces répertoires parents "/" , "/ root" , "/ root/Downloads" devrait donner l'autorisation d'exécution (x) à 'www-data' ou 'personne' . c'est à dire.

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

Pour plus de référence, voir Résolution de l'erreur "403 interdite" et Nginx 403 interdit pour tous les fichiers

46
isaacselement

Vous devez accorder des autorisations nginx pour lire le fichier. Cela signifie que vous devez accorder à l'utilisateur qui exécute les autorisations de processus nginx la lecture du fichier.

Cet utilisateur qui exécute le processus nginx est configurable avec la directive user dans la configuration nginx, généralement située quelque part en haut de nginx.conf:

user www-data

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

Le deuxième argument que vous donnez à user est le groupe, mais si vous ne le spécifiez pas, il utilise le même que l'utilisateur, donc dans mon exemple, l'utilisateur et le groupe sont tous deux www-data.

Maintenant, les fichiers que vous souhaitez servir avec nginx doivent avoir les autorisations appropriées. Nginx devrait être autorisé à lire les fichiers. Vous pouvez donner au groupe www-data autorisations de lecture sur un fichier comme celui-ci:

chown :www-data my-file.html

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

avec chown vous pouvez changer l'utilisateur et le propriétaire du groupe d'un fichier. Dans cette commande, je change uniquement le groupe, si vous changez également l'utilisateur, vous devez spécifier le nom d'utilisateur AVANT les deux points, comme chown www-data:www-data my-file.html. Mais la définition des autorisations de groupe correctes devrait être suffisante pour que nginx puisse lire le fichier.

55
gitaarik

Étant donné que Nginx gère directement les fichiers statiques, il doit avoir accès aux répertoires appropriés. Nous devons lui donner des autorisations exécutables pour notre répertoire personnel.

La façon la plus sûre de le faire est d'ajouter l'utilisateur Nginx à notre propre groupe d'utilisateurs. Nous pouvons ensuite ajouter l'autorisation exécutable aux propriétaires de groupe de notre répertoire personnel, donnant juste assez d'accès à Nginx pour servir les fichiers:

Sudo usermod -a -G votre_utilisateur nginx

chmod 710/home/votre_utilisateur

9
sandes

pour réponse acceptée

Sudo chown -R :www-data static_folder

pour changer le propriétaire du groupe de tous les fichiers de ce dossier

6
masternone

Après avoir creusé dans des réponses très utiles, j'ai décidé de collecter tout ce qui concerne les autorisations en tant que recette. Plus précisément, la solution la plus simple avec une sécurité maximale (= autorisations minimales).

  1. Supposons que nous déployions le site en tant qu'utilisateur admin, c'est-à-dire qu'elle possède le répertoire du site et tout ce qu'il contient. Nous pas voulons exécuter nginx en tant que cet utilisateur (trop de permissions). C'est OK pour les tests, pas pour les prod.
  2. Par défaut, Nginx exécute les travailleurs en tant qu'utilisateur nginx, c'est-à-dire que la configuration contient la ligne user nginx
  3. Par défaut, l'utilisateur nginx fait partie du groupe du même nom: nginx.
  4. Nous voulons accorder des autorisations minimales à l'utilisateur nginx sans changer la propriété du fichier. Cela semble être la plus sûre des options naïves.
  5. Afin de servir des fichiers statiques, les autorisations minimales requises dans la hiérarchie des dossiers (voir les autorisations de groupe) doivent être comme ceci (utilisez la commande namei -l /home/admin/WebProject/site/static/hmenu.css):

    racine racine dr-xr-xr-x /
    drwxr-xr-x racine racine home
    drwxr-x --- admin nginx admin
    drwx - x --- admin nginx WebProject
    drwx - x --- admin nginx site
    drwx - x --- admin nginx statique
    - rwxr ----- admin nginx hmenu.css

  6. Ensuite, comment obtenir cette belle photo? Pour modifier la propriété du groupe pour les dirs, nous appliquons d'abord Sudo chown :nginx /home/admin/WebProject/site/static, puis répétez la commande en supprimant les répertoires de droite un par un.

  7. Pour modifier les autorisations des répertoires, nous appliquons Sudo chmod g+x /home/admin/WebProject/site/static et encore une fois les dir.

  8. Changer le groupe des fichiers dans le répertoire/static: Sudo chown -R :nginx /home/admin/WebProject/site/static

  9. Enfin, modifiez les autorisations pour les fichiers dans le répertoire/static: Sudo chmod g+r /home/admin/WebProject/site/static/*

(Bien sûr, on peut créer un groupe dédié et changer le nom d'utilisateur, mais cela obscurcirait la narration avec des détails sans importance.)

4
Alexis Pokrovski

La définition de l'utilisateur root dans nginx peut être très dangereuse. Devoir définir des autorisations pour toute la hiérarchie de fichiers peut être fastidieux (imaginez que le chemin complet du dossier se trouve sous plus de 10 sous-dossiers).

Ce que je ferais, c'est de mettre en miroir le dossier que vous souhaitez partager, sous/usr/share/nginx/any_folder_name avec des autorisations pour l'utilisateur configuré de nginx (généralement www-data). C'est possible avec bindfs.

Dans votre cas, je ferais:

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

Il montera/root/download/boxes dans/usr/share/nginx/root_boxes avec toutes les autorisations pour l'utilisateur www-data. Maintenant, vous définissez ce chemin dans votre configuration de bloc d'emplacement

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

Pour moi, c'était SElinux, j'ai dû exécuter ce qui suit: (RHEL/Centos sur AWS)

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