Отказ в доступе консольному контролеру.

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Отказ в доступе консольному контролеру.

Сообщение slo_nik »

Добрый день.
Необходимо по cron-у обрабатывать загруженные изображения.
Создал такой консольный контролер.

Код: Выделить всё

class ImagesController extends Controller
{
    public function actionResize()
    {
        Yii::setAlias('@web', dirname(__DIR__) . '/web');
        $path = Yii::getAlias('@web') . '/uploads';

        $images = $this->scanDir($path); // рекурсивный обход директорий
        try{
            foreach ($images as $image){
                $img = Image::getImagine()->open($path . '/' . $image);
                //echo $path . '/' . $image . PHP_EOL;
                if($img->getSize()->getWidth() > 1000){
                    Image::resize($path . '/' . $image, 1000, null)->save($path. '/' . $image, ['jpeg_quality' => 80]);
                    echo 'Done!' . PHP_EOL;
                }
            }
        }
        catch (Exception $exception){
            Yii::getLogger()->log($exception, Logger::LEVEL_WARNING);
            Yii::getLogger()->log($exception, Logger::LEVEL_ERROR);
            echo 'Error' . PHP_EOL;
        }
    }
}
При попытке запустить консольную команду происходит ошибка
ImagickException: unable to open image `/home/slonik/localhost/www/memory/web/uploads/country_1/region_5/city_5/JPJvU8GlmulD-KCHdlwBKSHHcVHhBWpk.jpg': Permission denied @ error/blob.c/OpenBlob/2712 in /home/slonik/localhost/www/memory/vendor/imagine/imagine/lib/Imagine/Imagick/Image.php:287
Если перенести это действие в web контроллер или изменить права на директории 0777, то всё работает отлично. Изображения обрабатываются.
Я понимаю, что проблема в правах доступа, но как решить эту проблему не могу сообразить.
Загрузил на рабочий сервер консольный контроллер - работает без ошибок. Вот только на localhost проблема.
В директории uploads несколько директорий, которые создаются при загрузке изображений. Директории создаются при помощи mkdir(), но параметр mode никак не влияет на права, изменить я их не могу. Просто не меняются, без всяких ошибок.

Код: Выделить всё

 if(!file_exists($p)){
     mkdir($p, 0777, true);
};
Права доступа к директориям

Код: Выделить всё

drwxrwxrwx 1 slonik slonik  18 Сен 26 18:05 uploads
drwxr-xr-x 1 www-data www-data 16 Сен 26 18:05 country_1
drwxr-xr-x 1 www-data www-data 12 Сен 26 18:05 region_5
drwxr-xr-x 1 www-data www-data 20 Сен 26 18:05 city_5
Права к загруженным файлам

Код: Выделить всё

-rw-r--r-- 1 www-data www-data 845155 Сен 26 18:05 1g62QFwjgt67kwUcMEV3DcAViJHlAmUN.jpg
-rw-r--r-- 1 www-data www-data 878004 Сен 26 18:05 4HSV4UdL3gWFC5UKNmcYSgDJmYQODj6V.jpg
-rw-r--r-- 1 www-data www-data 824929 Сен 26 18:05 C9asvh5KiEvpOvbkh8SXXyVLzzCQyenr.jpg
Сравнил эти права доступа с правами на сервере - всё одинаково.
Как решить эту проблему для localhost?
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Отказ в доступе консольному контролеру.

Сообщение andku83 »

запускайте cron от root:

Код: Выделить всё

sudo crontab -e
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: Отказ в доступе консольному контролеру.

Сообщение proctoleha »

Чтобы никогда не иметь проблем с правами доступа я всегда запускаю web сервер от имени текущего пользователя. В nginx это совсем просто.
На примере ubuntu.
Простой конфиг виртуального хоста

Код: Выделить всё

server {
        charset utf-8;
        client_max_body_size 128M;
        root /var/www/alex/public_html/storage.loc/web;
        server_name storage.loc;
        listen 8091;
        
        error_log   /var/www/alex/public_html/logs/storage.loc_error.log;

        # раскомментируйте строки ниже во избежание обработки Yii обращений к несуществующим статическим файлам
        location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
            try_files $uri =404;
        }
        
        location / {
            index  index.php;
            try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                    include snippets/fastcgi-php.conf;
                    fastcgi_pass unix:/var/run/php/php7.0-fpm.alex.sock;
        }
        
        location ~ /\.(ht|svn|git) {
            deny all;
        }
    }
Обратите внимание на директиву fastcgi_pass unix:/var/run/php/php7.0-fpm.alex.sock;
Вся магия в ней.
Для работы сокета php7.0-fpm.alex.sock необходимо создать файл
/etc/php/$PHP_V/fpm/pool.d/$USER_NAME.conf, например /etc/php/7.0/fpm/pool.d/alex.conf (у вас путь может отличаться, т.к. у меня несколько версий php)

Код: Выделить всё

[alex]
        user = alex
        group = alex
        listen = /run/php/php7.0-fpm.alex.sock

        listen.owner = www-data
        listen.group = www-data

        pm = dynamic
        pm.max_children = 5
        pm.start_servers = 2
        pm.min_spare_servers = 1
        pm.max_spare_servers = 3
Также есть инструкция для apache https://community.vscale.io/hc/ru/commu ... untu-16-04

Еще раз: в обоих примерах web сервер для конкретного хоста работает не от имени пользователя www-data, а от имени пользователя, которому принадлежит данный хост.
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: Отказ в доступе консольному контролеру.

Сообщение proctoleha »

andku83 писал(а): 2018.09.27, 01:49 запускайте cron от root:

Код: Выделить всё

sudo crontab -e
Извините, но это команда для редактирования заданий крон - edit, но никак не для запуска. К тому же на боевом сервере включать пользователя в группу sudo, или запускать крон от root я бы поостерегся.
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Отказ в доступе консольному контролеру.

Сообщение slo_nik »

proctoleha писал(а): 2018.09.27, 05:12 Чтобы никогда не иметь проблем с правами доступа я всегда запускаю web сервер от имени текущего пользователя.

................................

Также есть инструкция для apache https://community.vscale.io/hc/ru/commu ... untu-16-04

Еще раз: в обоих примерах web сервер для конкретного хоста работает не от имени пользователя www-data, а от имени пользователя, которому принадлежит данный хост.
Благодарю за развёрнутый ответ.
Вроде всё получилось, консольный скрипт и cron работают без проблем.
По Вашей теме по ссылке нашёл ещё пару статей))) Одна на habr.com, правда за 2010 год.
Я так понимаю, что на рабочих серверах так же настраивают права?
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: Отказ в доступе консольному контролеру.

Сообщение proctoleha »

slo_nik писал(а): 2018.09.27, 13:16 Я так понимаю, что на рабочих серверах так же настраивают права?
Лично я так же. А так кто во что горазд. Например, я не так давно работаю в компании, с неслабым ведущим программистом. Для меня был шок, когда я узнал, что все наши сайты на боевом сервере принадлежат суперпользователю root.
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Отказ в доступе консольному контролеру.

Сообщение slo_nik »

proctoleha писал(а): 2018.09.27, 16:28 А так кто во что горазд.
Возможно)))
Мне предложили решение на этот вопрос такое. Редактировать конфигурацию apache2.

Код: Выделить всё

User username
Group #-1
Но я сразу подверг это большому сомнению.
Я то не очень занимаюсь настройками серверов, а на localhost не очень за безопасностью надо следить.
Закрыто