В этой статье будет говориться об ошибке permissions denied с кодом 13, относящейся к чтению/записи в файлы.

Для того, чтобы понять, почему нет возможности записать тот или иной файл, нужно понять Кто пытается это делать От какого пользователя и группы и, собственно, Что он делает (создает файл или перезаписывает существующий). Ну и естественно, какие права, владелец и группа у нужного нам файла.

Давайте разберем этот процесс на примере записи в директорию runtime фреймворком yii/yii2 из php-fpm при запросе пользователя. 

Для начала нам нужно понять, какой пул PHP-FPM это делает. В простой ситуации он у Вас один по дефолту и имеет название "www". В более сложных у вас есть несколько пулов (понять, какой из них задействован, можно исходя из порта в fastcgi_pass в nginx и порта в одном из файлов настройки пулов - /etc/php5/fpm/pool.d/*).

Как только мы знаем название пула, мы можем узнать пользователя и группу, от которых работают нужные нам процессы. Допустим название пула - "www".

# POOL="www"
# PID=`ps auxww | grep fpm | grep -v grep | sort | grep "pool $POOL" | head -n 1 | awk '{print $2}'`; MYUID=`cat /proc/$PID/status | grep Uid | awk '{print $2}'` ; MYGID=`cat /proc/$PID/status | grep Gid | awk '{print $2}'`
# cat /etc/passwd | grep ":x:$MYUID:" | tr ":" " " | awk '{print $1}'
www-data
# cat /etc/group | grep ":x:$MYGID:" | tr ":" " " | awk '{print $1}'
www-data

Итого: группа и пользователь, от которых запущен наш пул - www-data:www-data. Смотрим права нашей на директорию runtime:

# ls -la /var/www/protected/runtime
drwxrwxr-x 13 viktor viktor 4096 Aug 28 21:45 . drwxr-xr-x 34 viktor viktor 4096 Aug 28 20:52 .. drwxrwxr-x 8 viktor viktor 4096 Aug 28 12:19 application.log

Мы видим, что владелец и группа у файлов viktor:viktor и права на запись есть только у них. Если бы мы хотели отдать все права PHP-FPM-у, мы бы просто сделали:

chown -R www-data:www-data /var/www/protected/runtime

Но мы хотим чтобы и viktor мог редактировать эти файлы. Смотрим в какие группы входит пользователь viktor:

# id viktor
uid=1000(viktor) gid=1000(viktor) groups=1000(viktor),27(sudo)

Во-первых, добавим пользователя viktor в группу www-data:

# usermod -a -G www-data viktor
# id viktor
uid=1000(viktor) gid=1000(viktor) groups=1000(viktor),27(sudo),33(www-data)

сделаем для файлов:

# chown -R www-data:www-data /var/www/protected/runtime/
# chmod -R g+rw /var/www/protected/runtime/

И зададим сервису php-fpm umask равный 0002:

# nano /etc/systemd/system/php5-fpm.service.d/php5-fpm.service.conf

И напишем там следующие строки:

.include /lib/systemd/system/php5-fpm.service

[Service]
UMask=0002

После чего применяем изменения:

# systemctl daemon-reload
# systemctl restart php5-fpm

В итоге все новые файлы будут по умолчанию создаваться с правами -rw-rw-r-- , владельцем www-data и группой www-data.

Права на запись в группы есть, viktor в эту группу входит и все могут писать: и php-fpm и viktor.