Nginx 403 zabroniony dla wszystkich plików


192

Mam nginx zainstalowany z PHP-FPM na pudełku CentOS 5, ale staram się, aby obsłużył którykolwiek z moich plików - czy to PHP, czy nie.

Nginx działa jako www-data: www-data, a domyślna strona „Witamy w nginx na EPEL” (własność root: root z uprawnieniami 644) ładuje się dobrze.

Plik konfiguracyjny nginx ma dyrektywę dołączającą dla /etc/nginx/sites-enabled/*.conf, a ja mam plik konfiguracyjny example.com.conf , a zatem:

server {
 listen 80;

 Virtual Host Name
 server_name www.example.com example.com;


 location / {
   root /home/demo/sites/example.com/public_html;
   index index.php index.htm index.html;
 }

 location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_index  index.php;
  fastcgi_param  PATH_INFO $fastcgi_script_name;
  fastcgi_param  SCRIPT_FILENAME  /home/demo/sites/example.com/public_html$fastcgi_script_name;
  include        fastcgi_params;
 }
}

Mimo że public_html jest własnością www-data: www-data z uprawnieniami do pliku 2777, ta strona nie wyświetla żadnych treści -

 [error] 4167#0: *4 open() "/home/demo/sites/example.com/public_html/index.html" failed (13: Permission denied), client: XX.XXX.XXX.XX, server: www.example.com, request: "GET /index.html HTTP/1.1", host: "www.example.com"

Znalazłem wiele innych postów, w których użytkownicy otrzymywali 403s od nginx, ale większość, które widziałem, dotyczyło albo bardziej złożonych konfiguracji z Ruby / Passenger (z którymi tak naprawdę się kiedyś udało) lub otrzymywało błędy tylko wtedy, gdy upstream PHP -FPM jest zaangażowany, więc wydają się mało pomocne.

Czy zrobiłem tu coś głupiego?


Odpowiedzi:


333

Jednym z często pomijanych wymagań dotyczących uprawnień jest to, że użytkownik potrzebuje x uprawnień w każdym katalogu nadrzędnym pliku, aby uzyskać dostęp do tego pliku. Sprawdź uprawnienia do /, / home, / home / demo itp., Aby uzyskać dostęp do danych www x. Domyślam się, że / home to prawdopodobnie 770 i www-data nie może przechodzić przez to, by dostać się do dowolnego podkatalogu. Jeśli tak, spróbuj chmod o + x / home (lub cokolwiek dir odrzuca żądanie).

EDYCJA: Aby łatwo wyświetlić wszystkie uprawnienia na ścieżce, możesz użyć namei -om /path/to/check


6
To samo tutaj. W mojej instalacji CentOS 6 katalogi / home / user są domyślnie ustawione na 700.
— jjt

2
Ten facet też o tym mówi: ( chmod -4 +x /mypathpracował dla mnie) nginxlibrary.com/403-forbidden-error
— Peter Ehrlich

1
Czy ktoś może wyjaśnić, dlaczego to zachowanie różni się od apache, który NIE wymaga, aby każdy katalog nadrzędny miał uprawnienia „x”?!?
— JoshuaDavid

3
Nie inaczej jest. Jedynym powodem, dla którego apache nie wymagałby również uprawnień x w katalogach nadrzędnych, jest to, że działa jako root.
— kolbyjack

Skończyło się na dodaniu użytkownika danych www do mojej osobistej grupy użytkowników i zrobieniu chmod 710 w moim głównym folderze użytkownika. Działa jak urok. (W dystrybucji opartej na
— Debianie

299

Jeśli nadal widzisz permission deniedpo sprawdzeniu uprawnień do folderów nadrzędnych, może to oznaczać, że SELinux ogranicza dostęp.

Aby sprawdzić, czy SELinux działa:

# getenforce

Aby wyłączyć SELinux do następnego uruchomienia:

# setenforce Permissive

Uruchom ponownie Nginx i sprawdź, czy problem nadal występuje. Aby zezwolić nginx na obsługę twojego katalogu www (pamiętaj, aby ponownie włączyć SELinux przed przetestowaniem tego. Np. setenforce Enforcing)

# chcon -Rt httpd_sys_content_t /path/to/www

Zobacz moją odpowiedź tutaj, aby uzyskać więcej informacji


1
Nie mogłem zrozumieć, dlaczego za każdym razem, gdy zaczynałem nginx, powiedziałem open() "/usr/share/nginx/logs/xxxxxx.com-error_log" failed (13: Permission denied)po sprawdzeniu uprawnień i upewnieniu się, że jest uruchamiany jako root. Natknąłem się na to i dowiedziałem się, że SELinux jest włączony. Wyłączyłem go i teraz nie ma problemu. Dzięki!
— ub3rst4r

1
Dzięki! Nadal miałem problem z uprawnien dla użytkowników posiadających własne gniazda FPM więc udało mi się ustalić, że jeden zmieniając userod nginx do korzenia w /var/nginx/nginx.conf- być może to pomoże ktoś inny, kto jest po drugiej stronie tej kwestii. S / O do DataPsyche dla drugiej części.
— Zima

11
Jest to również domyślne zachowanie w CentOS 7.
— timss

4
Im wszystkim, którzy to skomentowali. Byłem gotowy wyrzucić komputer przez okno. Nginx został poprawnie skonfigurowany, uprawnienia odpowiednio ustawione, posunąłem się nawet do zrobienia wszystkiego 777 i nadal dostałem błąd odmowy uprawnień.
— DOfficial

2
W Centos 7 (z włączonym SELinux) najprostszą poprawką było dla mnie setsebool httpd_read_user_content on(w przypadku plików statycznych hostowanych z katalogu domowego, chmod'ed do wersji czytelnej dla całego świata) - Chyba metoda powyżej KapiteinWitbaard jest bezpieczniejsza.
— TimStaley

63

Rozwiązałem ten problem, dodając ustawienia użytkownika.

w nginx.conf

worker_processes 4;
user username;

zmień „nazwę użytkownika” na nazwę użytkownika linux.


4
Uważam, że ta odpowiedź jest lepsza pod względem bezpieczeństwa niż odpowiedź zaakceptowana. Nie musisz bawić się z uprawnieniami w folderze domowym (które mogą zawierać poufne informacje), a jeśli robisz programowanie z nginx, oszczędza ci to konieczności przesyłania dziwnych uprawnień do plików do SCM.
— CamelBlues

Dodane uprawnienia do katalogu domowego są wykonywane, a nie odczytywane, dlatego nie ujawnia się (teoretycznie) poufnych informacji (z wyjątkiem, w tym przypadku, być może złośliwego skryptu PHP, który powraca w górę i zna lokalizację wrażliwych plików w innym katalogu) dostępne dla danych www). Zauważysz również, że w pierwotnym pytaniu mój nginx działał jako „www-data” - wartości konfiguracji tutaj zostały już ustawione zgodnie z życzeniem.
— Angus Irlandia

2
Musiałem również dodać grupę użytkowników: grupa użytkowników.
— Gabriel A. Zorrilla

Pracowałem również dla mnie (podobnie jak chmodding katalogu do nginx: nginx). Wolę to rozwiązanie, aby mój katalog główny mógł być własnością innego użytkownika niż nginx. Dzięki Anderson za zwrócenie na to uwagi.
— kvdv

uratował mi dzień. a tak przy okazji, co jeśli maszyna ma wielu użytkowników, a każdy użytkownik ma własną stronę internetową, jak sobie z tym poradzić?
— psychok7

38

Mam ten błąd i w końcu rozwiązałem go za pomocą poniższego polecenia.

restorecon -r /var/www/html

Problem występuje, gdy przenosisz coś z jednego miejsca do drugiego. Zachowuje kontekst selinux oryginału podczas jego przenoszenia, więc jeśli rozpakowujesz coś w / home lub / tmp, dostaje kontekst selinux, który pasuje do jego położenia. Teraz możesz to zrobić do / var / www / html i bierze kontekst, mówiąc, że należy do niego w / tmp lub / home, a zasady httpd nie zezwalają na dostęp do tych plików.

Jeśli cp pliki zamiast mv, kontekst selinux zostanie przypisany zgodnie z lokalizacją, do której kopiujesz, a nie skąd pochodzi. Uruchomienie restorecon przywraca domyślny kontekst i naprawia go.


1
Dzięki @jsina, bardzo mi to pomogło
— Pankaj Garg,

1
Cholera, +1 , ja też.
— jww

24

Próbowałem różnych przypadków i tylko wtedy, gdy właściciel ustawiono na nginx ( chown -R nginx:nginx "/var/www/myfolder") - zaczął działać zgodnie z oczekiwaniami.


1
Pracował również dla mnie. Podejrzewam, że tak się dzieje, ponieważ chociaż nginx jest uruchamiany jako root, odradza procesy w ramach użytkownika określonego w pliku nginx.conf, którym jest „użytkownik nginx;” domyślnie. Zmiana użytkownika na użytkownika, który jest właścicielem katalogu głównego dokumentu, powinna również działać zgodnie z sugestią Andersona.
— kvdv

Pan Anderson? Nie! Andron;)
— Andron

Przepraszam, panie Andron;) Wydaje mi się, że nie mogę już edytować poprzedniego komentarza ...
— kvdv

Jasne, nie ma problemu. Teraz byłem jak Anderson :) i muszę napisać bajki ...
— Andron

1
Czy to nie jest problem bezpieczeństwa?
— gontard

6

Jeśli używasz SELinux, po prostu wpisz:

sudo chcon -v -R --type=httpd_sys_content_t /path/to/www/

To naprawi problem z uprawnieniami.


1

Stare pytanie, ale miałem ten sam problem. Próbowałem wszystkich odpowiedzi powyżej, nic nie działało. Jednak naprawiłem to, usuwając domenę i dodając ją ponownie. Korzystam z Plesk i zainstalowałem Nginx PO, gdy domena już tam była.

Najpierw jednak zrobiłem lokalną kopię zapasową w / var / www / backups. Więc mogłem łatwo skopiować pliki.

Dziwny problem ....


1

Mieliśmy ten sam problem, używając Plesk Onyx 17. Zamiast mieszać się z prawami itp. Rozwiązaniem było dodanie użytkownika nginx do grupy psacln, w której wszyscy inni właściciele domen (użytkownicy) to:

usermod -aG psacln nginx

Teraz nginx ma prawa dostępu do pliku .htaccess lub dowolnego innego pliku niezbędnego do prawidłowego wyświetlenia treści.

Z drugiej strony upewnij się również, że Apache jest w grupie psaserv, aby obsługiwać zawartość statyczną:

usermod -aG psaserv apache

Nie zapomnij zrestartować Apache i Nginx w Plesku po! (i przeładuj strony za pomocą Ctrl-F5)


To poprawna odpowiedź i najprawdopodobniej usermod -aG username www-dataw większości konfiguracji.
— Dario Zadro

0

Zagłębiłem się w niewielkim wariancie tego problemu, błędnie uruchamiając setfaclpolecenie. Prowadziłem:

sudo setfacl -m user:nginx:r /home/foo/bar

Porzuciłem tę trasę na rzecz dodania nginxdo foogrupy, ale ta niestandardowa lista ACL udaremnia próby uzyskania dostępu do pliku przez nginx. Wyczyściłem to, uruchamiając:

sudo setfacl -b /home/foo/bar

I wtedy nginx mógł uzyskać dostęp do plików.


0

Jeśli używasz PHP, upewnij się, że indexdyrektywa NGINX w bloku serwera zawiera plik index.php:

index index.php index.html;

Aby uzyskać więcej informacji, sprawdź dyrektywę indeksową w oficjalnej dokumentacji.


0

Miałem do czynienia z tym samym problemem, ale powyższe rozwiązania nie pomogły.

Tak więc po wielu zmaganiach dowiedziałem się, że sestatus został ustawiony, aby wymusić blokowanie wszystkich portów, a ustawiając go na permisive, wszystkie problemy zostały rozwiązane.

sudo setenforce 0

Mam nadzieję, że to pomaga komuś jak ja.


Chociaż to mogło rozwiązać problem - gratulacje! - to trochę smutne :-( Zobacz stopdisablowanieselinux.com - czy możesz znaleźć inne obejście?
— Angus Ireland
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.