Nginx: stat () non riuscito (13: autorizzazione negata)


103

Sto usando la configurazione predefinita mentre aggiungo la directory specifica con nginx installato sulla mia macchina Ubuntu 12.04.

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
        }
...

...
}

Voglio solo un semplice server nginx statico per servire file fuori da quella directory. Tuttavia, controllando il file error.logI see

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

L'ho già fatto chown -R www-data:www-datasu /username/test/static, li ho impostato a chmod 755. Non so cos'altro deve essere impostato.


3
Controlla se l' www-datautente può accedere cdalla /username/test/staticdirectory:sudo -u www-data cd /username/test/static
Maciej Sz

Ricevo l'autorizzazione negata, ma quando faccio ls -l mostra che è impostato su utente www-data
user299709

2
Potrebbe essere che / username sia su encryptfs? Sto riscontrando esattamente gli stessi problemi con la cartella / home / username, dove si trova il mio sito. Se lo sposto da encryptfs, tutto funziona bene. Ancora nessuna soluzione per me ...
Georgi

Risposte:


194

Nginx opera all'interno della directory, quindi se non puoi accedere cda quella directory dall'utente nginx, fallirà (come fa il statcomando nel tuo log). Assicurati che la www-userlattina cdfino al /username/test/static. Puoi confermare che statfallirà o riuscirà eseguendo

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

Nel tuo caso probabilmente la /usernamedirectory è il problema qui. Di solito www-datanon ha i permessi per le cdhome directory di altri utenti.

La soluzione migliore in quel caso sarebbe aggiungere www-dataal usernamegruppo:

gpasswd -a www-data username

e assicurati che il usernamegruppo possa inserire tutte le directory lungo il percorso:

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

Affinché le modifiche funzionino, riavvia nginx

nginx -s reload

Significa che per ogni nuova directory aggiunta sotto la radice, chmod deve essere eseguito nelle nuove directory?
Qian Chen

2
@ElgsQianChen tieni presente che questo è un sistema di autorizzazioni a livello di sistema operativo, quindi nei sistemi POSIX dipende dal tuo umask. Se hai bisogno di una soluzione più generica, che non richieda chmodogni nuova directory, allora c'è una soluzione. Richiede l'associazione di gruppo inversa ( usernameal www-datagruppo) e l'uso di setgid. Sentiti libero di pubblicare una nuova domanda per una descrizione più elaborata e sarò felice di rispondere.
Maciej Sz

E se il mio percorso si trova nella directory / root /? È sicuro eseguire chmod g + x su / root? E l'aggiunta di dati www al gruppo radice?
Oleg Abrazhaev

Su Fedora 24 il mio problema si è verificato con ... permessi ACL ... un altro livello ... YEY!
Ray Foss,

1
Bene, il mio nginxutente può accedere alla directory del mio sito Web, ma dice ancora che l'autorizzazione è stata negata nei log degli errori.
Rahil Wazir

89

Ho appena avuto lo stesso problema su una scatola CentOS 7.

Sembra che abbia colpito Selinux. Mettere selinux in modalità permissiva ( setenforce permissive) ha risolto il problema per ora. Proverò a tornare con una soluzione adeguata.


4
Questo è l'esatto comportamento "non documentato" che stavo cercando di capire in questi ultimi 3 giorni ...
Achille

2
Ecco un post su questo comportamento: axilleas.me/en/blog/2013/…
Achilles

2
Così, mi sono ritrovato di nuovo qui ... Questa volta scopro di aver copiato il file in questione dalla mia home directory alla directory html, e aggiornato la proprietà. Stesso problema del 2015 ... Soluzione migliore: ls -Z myFile.jsmostrerà il contesto SELinux: -rw-r--r--. nginx nginx unconfined_u:object_r:user_home_t:s0 myFile.js utilizzare chcon -v --type=httpd_sys_content_t myFileper modificare il contenuto di SELinux.
Andrew Richard Miller,

2
Sì; Ho avuto lo stesso problema. sudo setenforce 0risolto per me.
Sovraccarico119

1
Solo una nota, se vuoi che selinux sia completamente disabilitato, dovrai cambiare il SELINUXvalore in disabledin /etc/selinux/config, seguito da un riavvio. Quando è impostato su permissive, può ancora eseguire controlli dietro le quinte (utilizzando una CPU preziosa), ma non intraprendere alcuna azione.
Oliver Tappin

76

Nginx deve avere un accesso + x a tutte le directory che portano alla directory principale del sito.

Assicurati di avere + x su tutte le directory nel percorso che porta alla radice del sito. Ad esempio, se la radice del sito è / home / nomeutente / siteroot:

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

13
Dopo 6 ore di ricerca disperata ... il corpo trovato lo ha menzionato ma tu! grazie!
Walid Ammar

3
Grazie mille! Ho passato ore a cercare di farlo funzionare e ho trovato tutti i tipi di risposte, non posso credere che fosse così semplice!
Eric Groom

2
questo funziona bene per me, centos 7, php fpm 7.2 (selinux già disattivato)
anhduc.bkhn

1
Grazie! Non posso credere che questo sia stato tutto quello che ho dovuto fare per tutto il tempo!
eccitabile dal

1
Grazie, perfetto !.
Softsofter

32

Su CentOS 7.0 ho riscontrato questo Access Deinedproblema causato da SELinux e questi passaggi hanno risolto il problema:

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

Aggiornamento: solo una nota a margine di ciò che ho imparato durante l'utilizzo dei server Linux virtuali di digitalocean, o come li chiamano Droplet . L'uso di SELinux richiede una discreta quantità di RAM. È molto probabile che non sarai in grado di eseguire e gestire SELinux su una droplet con meno di 2 GB di RAM.


2
Grazie mille per questo. Ha risolto il mio problema (anche su CentOS 7) per cominciare, ma poi sono stato bloccato da una seconda negazione altrove, quindi ho fatto ricorso setenforce 0. Tuttavia, guardando indietro a ciò che questa soluzione fa effettivamente, mi sono reso conto che avevo bisogno di rieseguire i comandi per aggiornare le autorizzazioni per l'utente nginx. Sembrava funzionare e potevo riportare SELinux a far rispettare.
danj1974

Beh, potrebbe essere un po 'troppo tardi. Tuttavia, vale la pena menzionarlo quando si mantiene SELinux imposto; è imperativo ricordare, software come Nginx inseriscono il proprio insieme di regole come porte predefinite, percorsi predefiniti, accesso in lettura / scrittura ai percorsi, ecc. in SELinux. Se non vuoi problemi, devi seguire queste regole (come mettere i tuoi file HTML / PHP in / var / www) oppure prepararti a superare i problemi che hanno origine nel contesto di SELinux. Questo può essere utile [CentOS <8]: getpagespeed.com/server-setup/nginx/nginx-selinux-configuration
Achilles

27

Potresti avere Linux con protezione avanzata in esecuzione, quindi aggiungi una regola per questo. Avevo 13 errori di autorizzazione, anche se i permessi erano impostati e l'utente esisteva.

chcon -Rt httpd_sys_content_t /username/test/static


Grazie! Ha lavorato alla versione 6.10 di CentOS (finale).
marzo

1
Ha lavorato su CentOS 7.5.1804 (Core).
Niek

4

Sintomo:

Impossibile caricare le immagini nella libreria multimediale di WordPress.

Causa:

(CentOS) yum update

Errore:

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"

Soluzione:

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


2

Per impostazione predefinita, i dati statici, quando installi nginx, saranno in / var / www / html. Quindi puoi semplicemente copiare la tua cartella statica in / var / html / e impostare il file

root /var/www/<your static folder>

in ngix.conf (o / etc / nginx / sites-available / default)

Questo ha funzionato per me su Ubuntu, ma immagino che non dovrebbe essere molto diverso per altre distribuzioni.

Spero che sia d'aiuto.


2

Cambia la tua nginx.conf userproprietà in www-staticfiles owener.

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

user your_user_name;

# same other config

1

Ho affrontato questo problema, l'ho risolto per dare le autorizzazioni all'utente nginx e al gruppo qualcosa del genere:

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

1

Nel mio caso, la cartella che serviva i file era un collegamento simbolico a un'altra cartella, realizzata con

ln -sf /origin /var/www/destination

Anche se i permessi (utente e gruppo) erano corretti sulla cartella di destinazione (il collegamento simbolico), ho comunque avuto l'errore perché Nginx doveva avere anche i permessi per l'intera gerarchia della cartella di origine.


1

Finalmente ho trovato la mia strada. In breve, diciamo che il tuo nome utente è joee hai un sito web sotto il tuo filesystem personale /home/joe/path/to/website.

Devi letteralmente dire al sistema che nginxè il tuo amico.
Posto nginxnel joegruppo:

sudo gpasswd -a nginx joe

Dopodiché, se ancora non funziona, controlla il diritto di accesso alla /home/joedirectory. Questo è probabilmente il motivo per cui nginx non può raggiungere il file perché anche se è tuo amico ora devi aprirgli la porta di casa tua:

sudo chmod g+x /home/joe

Questo è tutto. Questo è letteralmente tutto ciò che devi fare per dare a nginx l'accesso ai tuoi file locali :)

Non penso che ci siano problemi di sicurezza con questo metodo perché nginxè l'alta autorità e solo un amministratore può cambiare il gruppo. nginxora può leggere cosa c'è nelle joedirectory. È solo una violazione della sicurezza se il titolare nginxdell'account è diverso dall'utente da cui si apre l'accesso alla directory, ma nel mio caso sono il titolare di entrambe le parti, cioè in un contesto locale.


0

Ho avuto lo stesso problema, sto usando Plesk Onyx 17 con Centos7. Ho potuto vedere questo errore in proxy_error_log sotto i log del dominio interessato. Tutte le directory / file in / var / www / vhosts / sono di proprietà dei rispettivi utenti (proprietari di dominio) e puoi vedere che sono tutti nel gruppo psacln. Quindi la soluzione era aggiungere nginx anche a questo gruppo, in modo che possa vedere di cosa ha bisogno:

usermod -aG psacln nginx

E infatti, riavvia nginx e ricarica la pagina con Ctrl + F5.


0

Ho trovato una soluzione: ho spostato la cartella nella cartella di configurazione di nginx, nel mio caso "/ etc / nginx / my-web-app". E poi ha cambiato le autorizzazioni per l'utente root "sudo chown -R root: root" my-web-app ".


0

Puoi anche aggiungere quale utente eseguirà nginx. Nel file nginx.conf, apporta le seguenti modifiche:

user root;

Puoi aggiungere la riga sopra come prima riga nel tuo nginx conf. Puoi scrivere il nome di qualsiasi utente che ha il permesso di scrivere in quella directory.


0

Questo di solito è il problema dei privilegi ... Per me, è perché uso / root / ** come root nginx, ha bisogno di privilegi più alti. Un modo semplice è spostare il progetto in una directory creata da te.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.