В этой статье будет говориться об ошибке 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.
Протокол WebSocket имеет свои преимущества и свои недостатки: детальный разбор
Не секрет, что хорошо настроенный сервер "падает" гораздо реже, чем доступ из него в Интернет
Позволяет решать интеллектуальные задачи помимо задач самого мониторинга
И снова о маленьких сетевых фокусах ради надежности работы web-сервисов
В проекте морской навигации есть особенность, грамотная реализация которой и позволяет жить всей системе