Jak zmienić użytkownika NGINX?

37

Mam skrypt PHP, który tworzy katalog i wyświetla obraz w katalogu. Pod Apache działało to dobrze, ale ostatnio zdecydowaliśmy się przejść na NGINX, aby lepiej wykorzystać naszą ograniczoną pamięć RAM. Korzystam z komendy PHP mkdir (), aby utworzyć katalog:

mkdir(dirname($path['image']['server']), 0755, true);

Po przejściu na NGINX pojawia się następujące ostrzeżenie:

Warning: mkdir(): Permission denied in ...

Sprawdziłem już wszystkie uprawnienia do katalogów nadrzędnych, więc ustaliłem, że prawdopodobnie muszę zmienić „użytkownika” NGINX lub PHP-FPM, ale nie jestem pewien, jak to zrobić (nigdy nie musiałem określać użytkownika uprawnienia dla APACHE). Nie mogę znaleźć dużo informacji na ten temat. Każda pomoc byłaby świetna!

(Uwaga: Poza tym małym rozłączaniem przejście na NGINX jest dość płynne; używam go po raz pierwszy i dosłownie zajęło to około 10 minut, aby uruchomić się z NGINX. Teraz tylko prasuję załamania.)

David
źródło
1
Jeśli nginx został zainstalowany przez menedżera pakietów, najlepiej użyć po prostu „ps”, aby zobaczyć, który użytkownik działa jako nginx i zmienić właściciela katalogu na tego użytkownika. Zazwyczaj zabezpieczenia są dość dobrze ustawione przez pakiety, zmiana użytkownika może zdenerwować coś innego.
Joachim Isaksson
nginx.confi www.confdomyślnie IIRC.
PeeHaa,
Jeśli używasz fastcgi, sprawdź, czy możesz suexec skrypty phps. które pozwolą Ci uruchomić różne witryny pod ich konkretnym użytkownikiem. Jestem pewien, że niektóre instrukcje konfiguracji są dostępne online.
hakre

Odpowiedzi:

58

Uruchom nginx i php-fpm jako www: www

1. Nginx

Edytuj plik nginx.conf i ustaw użytkownika nawww www;

Jeśli proces główny jest uruchamiany jako root, to nginx ustawi setuid () / setgid () na USER / GROUP. Jeśli nie określono GRUPY, nginx używa tej samej nazwy co USER. Domyślnie jest to nikt użytkownik i nikt, grupa nogroup lub --user = USER i --group = GROUP ze skryptu ./configure.

2. PHP-FPM

Edytuj plik php-fpm.conf i ustaw użytkownika i grupę na www.

użytkownik - uniksowy użytkownik procesów. Domyślne „dane www”

grupa - uniksowa grupa procesów. Domyślne „dane www”

glavić
źródło
1
Ok, właśnie zmieniłem nginx.conf (ustawiono na user www-data). Jednak nie widzę żadnego zdefiniowanego w użytkownikowi php-fpm.conf. Czy powinienem po prostu dodać go na górze za pomocą tej samej składni ( user www www)?
David
Składnia php-conf to nie to samo, co os nginx.conf. Znajdź [www]część i dodaj user=wwww następnej linii i group=wwwnastępnej.
glavić
Mam następujący błąd przy ponownym nginx: Ponowne nginx: [emerg] getpwnam("www") failed in /etc/nginx/nginx.conf:1 nginx: configuration file /etc/nginx/nginx.conf test failed.
David
Następnie możesz uruchomić Nginx i php-fpm jako użytkownik, który ma odpowiednie uprawnienia do odpowiednich katalogów lub utworzyć nowego użytkownika o nazwie www, uruchamiając „sudo useradd -g www www”. Daj nam znać, jeśli potrzebujesz bardziej szczegółowych wyjaśnień.
Roman Prykhodchenko
1
@xorinzor: nie, użyj tego, co masz: D
glavić
24

W Ubuntu 14.04 plik do zmiany użytkownika i grupy w PHP-FPM jest: /etc/php5/fpm/pool.d/www.conf. W tym pliku zmień następujące parametry:

user = www
group = www
listen.owner = www
listen.group = www
iarroyo
źródło
3
Dotyczy to również Ubuntu 16.10.
Craimasjien
1
Dotyczy to również Ubuntu 18.04
siliconrockstar
Byłby to bardzo dobry dodatek do zaakceptowanej odpowiedzi.
Ashkan Kh. Nazary,
Dla PHP 7.2 jest w/etc/php/7.2/fpm/pool.d/www.conf
Cromax
6

Aby odpowiedzieć na twoje aktualne pytanie, wystarczy zmienić userlinię w następujący nginx.confsposób:

user    [username];

Przykład:

user    www-data;

Preferowany użytkownik do uruchamiania Nginx, ponieważ tak naprawdę różni się między systemami operacyjnymi. Czasami Nginx powinien działać jako www-data. Innym razem powinien on działać jako nobody.

W niektórych systemach operacyjnych (takich jak Windows) nie ma to nawet znaczenia, a userwiersz nginx.confwejściowy można skomentować lub całkowicie wykluczyć.

rubinorails
źródło
Jeśli dodam dyrektywę użytkownika i zrestartuję usługę Nginx, pojawi się błąd informujący, że „użytkownik” to nieznana dyrektywa - czy w związku z tym można ją pominąć?
JoeTidee
Tak, w zależności od systemu operacyjnego i / lub Nginx, niektóre wersje nie wymagają wyraźnej dyrektywy użytkownika.
rubynorails
Musiałem umieścić dyrektywę użytkownika na samej górze pliku konfiguracyjnego Nginx, aby ją rozpoznać.
JoeTidee