
Ich habe einen Ubuntu18.04-Webserver mit nginx und php-fpm (7.2) installiert.
Es gibt 6 Pools, jeder mit seinem eigenen Benutzer und seiner eigenen Gruppe:
/etc/php/7.2/fpm# grep -r ^user *
php.ini:user_dir =
pool.d/dev3.website.com.conf:user = dev3_app
pool.d/dev1.website.com.conf:user = dev1_app
pool.d/dev4.website.com.conf:user = dev4_app
pool.d/dev6.website.com.conf:user = dev6_app
pool.d/dev5.website.com.conf:user = dev5_app
pool.d/dev2.website.com.conf:user = dev2_app
/etc/php/7.2/fpm# grep -r ^group *
pool.d/dev3.website.com.conf:group = dev3_app
pool.d/dev1.website.com.conf:group = dev1_app
pool.d/dev4.website.com.conf:group = dev4_app
pool.d/dev6.website.com.conf:group = dev6_app
pool.d/dev5.website.com.conf:group = dev5_app
pool.d/dev2.website.com.conf:group = dev2_app
Auf jeder Site wird eine Laravel-App ausgeführt, wobei das Speicherverzeichnis für alle Gruppen beschreibbar gemacht wurde:
/var/www/dev3.website.com# ls -la
total 2236
drwxr-xr-x 20 root dev3_app 4096 Jul 17 21:39 .
drwxr-xr-x 9 root root 4096 Jul 17 21:33 ..
...
drwxrwxr-x 7 root dev3_app 4096 Jul 17 21:29 storage
nginx stellt eine Verbindung über den TCP-Port her:
server {
listen 80;
server_name dev3.website.com;
root /var/www/dev3.website.com/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
# include the fastcgi_param setting
include fastcgi_params;
# SCRIPT_FILENAME parameter is used for PHP FPM determining
# the script name. If it is not set in fastcgi_params file,
# i.e. /etc/nginx/fastcgi_params or in the parent contexts,
# please comment off following line:
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
}
}
Mit dieser Konfiguration bekomme ich
The stream or file "/var/www/dev3.website.com/storage/logs/laravel-2019-07-17.log" could not be opened: failed to open stream: Permission denied
Wenn ich chmod a+w im Speicherverzeichnis ausführe, funktioniert es.
Ich habe auch ps -ef |grep php ausgeführt:
root 2468 1 0 00:53 ? 00:00:05 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf)
root 11897 10961 0 22:12 pts/0 00:00:00 grep --color=auto php
Antwort1
Ich vermute, dass der „Masterprozess“ als Root-Benutzer ausgeführt wird, aber für jeden der Pools die „Worker“-Prozesse als angegebener Benutzer ausgeführt werden. Dies wird noch dadurch unterstützt, dass Sie das Protokollverzeichnis ändern mussten, damit es funktioniert.
Zur Fehlerbehebung können Sie beispielsweise eine der Sites veranlassen, eine Datei zu schreiben /tmp/test
und anschließend zu prüfen, welchem Benutzer sie gehört.
Sie können auch eine Schleife schreiben, die in einem der Pools einige Minuten schläft, und dann Ihren ps -ef | grep php
Befehl ausführen, um zu sehen, ob der „Masterprozess“ einen Prozess als der von Ihnen erwartete Benutzer erzeugt hat.