Nginx: stat () failed (13: odmowa pozwolenia)

103

Używam domyślnej konfiguracji podczas dodawania określonego katalogu z nginx zainstalowanym na moim komputerze 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
        }
...

...
}

Chcę tylko, aby prosty statyczny serwer nginx obsługiwał pliki z tego katalogu. Jednak sprawdzając error.logwidzę

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

Mam już zrobione chown -R www-data:www-datana /username/test/static, mam je ustawić chmod 755. Nie wiem, co jeszcze trzeba ustawić.

user299709
źródło
3
Sprawdź czy www-dataużytkownik może wejść cddo /username/test/statickatalogu:sudo -u www-data cd /username/test/static
Maciej Sz
Otrzymuję odmowę pozwolenia, ale kiedy robię ls -l, pokazuje, że jest ustawiony na użytkownika danych www
user299709
2
Czy to możliwe, że / username jest na encryptfs? Mam dokładnie te same problemy z folderem / home / username, w którym znajduje się moja witryna. Jeśli usunę to z encryptfs, wszystko działa dobrze. Wciąż nie ma dla mnie rozwiązania ...
Georgi

Odpowiedzi:

194

Nginx działa w katalogu, więc jeśli nie możesz cdprzejść do tego katalogu od użytkownika nginx, to się nie powiedzie (podobnie jak statpolecenie w twoim dzienniku). Upewnij się, że www-userpuszka cddo końca /username/test/static. Możesz potwierdzić, że statzakończy się niepowodzeniem lub sukcesem, uruchamiając

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

W twoim przypadku prawdopodobnie /usernameproblem dotyczy katalogu. Zwykle www-datanie ma uprawnień do cdkatalogów domowych innych użytkowników.

Najlepszym rozwiązaniem w takim przypadku byłoby dodanie www-datado usernamegrupy:

gpasswd -a www-data username

i upewnij się, że usernamegrupa może wejść do wszystkich katalogów wzdłuż ścieżki:

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

Aby zmiany zadziałały, uruchom ponownie nginx

nginx -s reload
Maciej Sz
źródło
Czy to oznacza, że ​​dla każdego nowego katalogu dodawanego w katalogu głównym, należy wykonać chmod w nowych katalogach?
Qian Chen
2
@ElgsQianChen pamiętaj, że jest to system uprawnień na poziomie systemu operacyjnego, więc w systemach POSIX zależy to od twojego umask. Jeśli potrzebujesz bardziej ogólnego rozwiązania, które nie wymaga chmodkażdego nowego katalogu, to jest rozwiązanie. Wymaga odwrotnego skojarzenia grupowego ( usernamedo www-datagrupy) i użycia setgid. Możesz zadać nowe pytanie, aby uzyskać bardziej szczegółowy opis, a ja z przyjemnością odpowiem.
Maciej Sz
Co jeśli moja ścieżka znajduje się w katalogu / root /? Czy wykonywanie chmod g + x w / root jest bezpieczne? I dodać dane www do grupy głównej?
Oleg Abrazhaev
W Fedorze 24 pojawił się mój problem z ... uprawnieniami ACL ... kolejną warstwą ... YEY!
Ray Foss,
1
Cóż, mój nginxużytkownik może uzyskać dostęp do katalogu mojej witryny, ale nadal w dziennikach błędów pojawia się komunikat o odmowie pozwolenia.
Rahil Wazir
89

Właśnie miałem ten sam problem na pudełku CentOS 7.

Wygląda na to, że uderzyłbym w selinux. Przełączenie selinux w tryb permissive ( setenforce permissive) rozwiązało na razie problem. Spróbuję wrócić z właściwą poprawką.

Andrew Richarda Millera
źródło
4
To jest dokładnie to „nieudokumentowane” zachowanie, które próbowałem zrozumieć przez te ostatnie 3 dni ...
Achilles
2
Oto post dotyczący tego zachowania: axilleas.me/en/blog/2013/…
Achilles
2
Tak więc znalazłem się tutaj ... Tym razem stwierdziłem, że skopiowałem plik, o którym mowa, z mojego katalogu domowego do katalogu html i zaktualizowałem prawa własności. Ten sam problem, co w 2015 ... Lepsza poprawka: ls -Z myFile.jspokaże kontekst SELinux: -rw-r--r--. nginx nginx unconfined_u:object_r:user_home_t:s0 myFile.js Użyj, chcon -v --type=httpd_sys_content_t myFileaby zmienić zawartość SELinux.
Andrew Richard Miller
2
Tak; Miałem ten sam problem. sudo setenforce 0naprawiłem to dla mnie.
Przeciążenie119
1
Uwaga, jeśli chcesz całkowicie wyłączyć selinux, musisz zmienić SELINUXwartość na disabledin /etc/selinux/config, a następnie zrestartować komputer. Gdy jest ustawiony na permissive, nadal może przeprowadzać testy za kulisami (przy użyciu cennego procesora), ale nie podejmuje żadnych działań.
Oliver Tappin
77

Nginx musi mieć dostęp + x do wszystkich katalogów prowadzących do katalogu głównego witryny.

Upewnij się, że masz + x we ​​wszystkich katalogach w ścieżce prowadzącej do katalogu głównego witryny. Na przykład, jeśli katalog główny witryny to / home / username / siteroot:

chmod +x /home/
chmod +x /home/username
chmod +x /home/username/siteroot
Sairam Krish
źródło
13
Po 6 godzinach desperackich poszukiwań ... znaleziono ciało wspomniało o tym, ale ty! Dziękuję Ci!
Walid Ammar
3
Dziękuję bardzo! Spędziłem godziny, próbując to naprawić, i natrafiłem na różne odpowiedzi, nie mogę uwierzyć, że to takie proste!
Eric Groom
2
to działa dobrze dla mnie, centos 7, php fpm 7.2 (selinux już wyłączony)
anhduc.bkhn
1
Dziękuję Ci! Nie mogę uwierzyć, że to wszystko, co musiałem robić przez cały czas!
exciteabletom
1
Dziękuję, doskonale !.
Softsofter
32

W CentOS 7.0 miałem ten Access Deinedproblem spowodowany przez SELinux i te kroki rozwiązały problem:

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

Aktualizacja: tylko notatka poboczna z tego, czego nauczyłem się podczas korzystania z wirtualnych serwerów Linux digitalocean lub, jak nazywają je Droplets . Korzystanie z SELinuksa wymaga przyzwoitej ilości pamięci RAM. Najprawdopodobniej nie będziesz w stanie uruchomić i zarządzać SELinux na droplecie z mniej niż 2 GB pamięci RAM.

Achilles
źródło
2
Bardzo dziękuję za to. Na początku rozwiązało to mój problem (również w CentOS 7), ale potem zostałem zablokowany przez drugą odmowę w innym miejscu, więc uciekłem się do tego setenforce 0. Jednak patrząc wstecz na to, co faktycznie robi to rozwiązanie, zdałem sobie sprawę, że muszę ponownie uruchomić polecenia, aby zaktualizować uprawnienia użytkownika nginx. To wydawało się działać i mogłem ustawić SELinux z powrotem na egzekwowanie.
danj1974
Cóż, to może być trochę za późno. Mimo to, warto wspomnieć, że gdy wymuszasz SELinux; należy koniecznie pamiętać, oprogramowanie takie jak Nginx wstawia własny zestaw reguł, takich jak domyślne porty, domyślne ścieżki, dostęp do odczytu / zapisu ścieżek itp. do SELinux. Jeśli nie chcesz żadnych kłopotów, musisz przestrzegać tych zasad (takich jak umieszczanie plików HTML / PHP w / var / www) lub przygotować się na przezwyciężenie problemów wywodzących się głęboko w kontekście SELinux. Może to być pomocne [CentOS <8]: getpagespeed.com/server-setup/nginx/nginx-selinux-configuration
Achilles
27

Być może masz uruchomiony system Linux z ulepszonymi zabezpieczeniami, więc dodaj do tego regułę. Miałem 13 błędów, mimo że uprawnienia były ustawione i istniał użytkownik.

chcon -Rt httpd_sys_content_t /username/test/static

Artjom Kurapov
źródło
Dzięki! Pracowałem nad wersją CentOS 6.10 (wersja ostateczna).
marw
1
Pracował na CentOS 7.5.1804 (Core).
Niek
4

Objaw:

Nie można przesłać obrazów do biblioteki multimediów WordPress.

Przyczyna:

(CentOS) yum update

Błąd:

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"

Rozwiązanie:

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

PJ Brunet
źródło
2

Domyślnie dane statyczne po zainstalowaniu nginx będą znajdować się w / var / www / html. Możesz więc po prostu skopiować swój folder statyczny do / var / html / i ustawić rozszerzenie

root /var/www/<your static folder>

w ngix.conf (lub / etc / nginx / sites-available / default)

To zadziałało dla mnie na Ubuntu, ale myślę, że nie powinno to różnić się zbytnio w przypadku innych dystrybucji.

Mam nadzieję, że to pomoże.

Patrik Bego
źródło
2

Zmień swoją nginx.conf userwłaściwość na właściciela www-staticplików.

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

user your_user_name;

# same other config
lonnyzhang423
źródło
1

Napotkałem ten problem, rozwiązałem go, aby nadać uprawnienia użytkownikowi nginx i zgrupować coś takiego:

chown -R nginx:nginx /username/test/static
julian salas
źródło
1

W moim przypadku folder, który obsługiwał pliki, był dowiązaniem symbolicznym do innego folderu utworzonego za pomocą

ln -sf /origin /var/www/destination

Mimo że uprawnienia (użytkownika i grupy) były prawidłowe w folderze docelowym (łącze symboliczne), nadal występował błąd, ponieważ Nginx musiał mieć również uprawnienia do całej hierarchii folderu źródłowego.

Santiago Martí Olbrich
źródło
1

W końcu znalazłem drogę. Krótko mówiąc, powiedzmy, że twoja nazwa użytkownika to joei że prowadzisz witrynę internetową w swoim osobistym systemie plików/home/joe/path/to/website .

Musisz dosłownie powiedzieć systemowi, że nginxjest twoim kumplem.
Miejsce nginxw joegrupie:

sudo gpasswd -a nginx joe

Następnie, jeśli nadal nie działa, sprawdź prawa dostępu do /home/joekatalogu. To prawdopodobnie powód, dla którego nginx nie może dotrzeć do pliku, ponieważ nawet jeśli jest twoim przyjacielem, musisz teraz otworzyć mu drzwi do swojego domu:

sudo chmod g+x /home/joe

Otóż ​​to. To dosłownie wszystko, co musisz zrobić, aby dać nginx dostęp do swoich plików lokalnych :)

Nie sądzę, aby ta metoda miała problemy z bezpieczeństwem, ponieważ nginxma wysoki autorytet i tylko administrator może zmienić grupę. nginxmoże teraz czytać zawartość joekatalogów. Naruszeniem bezpieczeństwa jest tylko wtedy, gdy właściciel nginxkonta jest inny niż użytkownik, z którego otwierasz dostęp do katalogu, ale w moim przypadku jestem właścicielem obu stron, czyli w kontekście lokalnym.

vdegenne
źródło
0

Miałem ten sam problem, używam Plesk Onyx 17 z Centos7. Mogłem zobaczyć ten błąd w proxy_error_log w dziennikach domeny, której dotyczy problem. Wszystkie katalogi / pliki w / var / www / vhosts / są własnością odpowiednich użytkowników (właścicieli domen) i możesz zobaczyć, że wszystkie są w grupie psacln. Tak więc rozwiązaniem było dodanie nginx również do tej grupy, aby mógł zobaczyć, czego potrzebuje:

usermod -aG psacln nginx

I rzeczywiście, zrestartuj nginx i przeładuj stronę za pomocą Ctrl + F5.

Slavomir Miskovec
źródło
0

Znalazłem obejście: Przeniosłem folder do folderu konfiguracyjnego nginx, w moim przypadku „/ etc / nginx / my-web-app”. A potem zmieniłem uprawnienia na użytkownika root "sudo chown -R root: root" my-web-app ".

Dheeraj
źródło
0

Możesz także dodać, który użytkownik będzie uruchamiał nginx. W pliku nginx.conf wprowadź następujące zmiany:

user root;

Możesz dodać powyższą linię jako pierwszą linię w swojej konfiguracji nginx. Możesz wpisać nazwę dowolnego użytkownika, który ma uprawnienia do zapisu w tym katalogu.

Rajat Bhatnagar
źródło
0

Zwykle jest to problem z uprawnieniami ... Dla mnie to, ponieważ używam / root / ** jako root nginx, potrzebuje wyższych uprawnień. Prostym sposobem jest po prostu przeniesienie projektu do utworzonego przez siebie katalogu.

głupiec
źródło