Laravel: Вирішення помилок прав доступу та файлових операцій
Проблема: “unlink(): No such file or directory” при optimize:clear
Багато Laravel розробників стикаються з цією дратівливою помилкою:
|
1 2 3 |
php artisan optimize:clear events unlink(/var/www/project/bootstrap/cache/events.php): No such file or directory |
Основні причини
- Конфлікт прав доступу – файли кешу створені під root, а Laravel працює під www-data
- Неповна структура кешу – відсутні очікувані файли кешу
- Некоректне середовище розробки – змішування команд від різних користувачів
Швидке рішення
|
1 2 3 4 5 6 7 8 9 |
# Виправити права власника sudo chown -R www-data:www-data bootstrap/cache/ storage/ # Створити відсутні файли якщо потрібно sudo -u www-data touch bootstrap/cache/events.php # Запустити очищення sudo -u www-data php artisan optimize:clear |
Споріднені проблеми з правами доступу
1. Помилка “Permission denied” при записі логів
|
1 2 |
file_put_contents(/var/www/project/storage/logs/laravel.log): failed to open stream |
Рішення:
|
1 2 3 |
sudo chown -R www-data:www-data storage/ sudo chmod -R 775 storage/ |
2. Проблеми з сесіями
|
1 2 |
mkdir(): Permission denied /var/www/project/storage/framework/sessions |
Рішення:
|
1 2 3 4 |
sudo mkdir -p storage/framework/{sessions,views,cache} sudo chown -R www-data:www-data storage/framework/ sudo chmod -R 775 storage/framework/ |
3. Кеш config/routes не створюється
Перевірка прав:
|
1 2 3 |
ls -la bootstrap/cache/ # Повинен показати www-data як власника |
Виправлення:
|
1 2 3 |
sudo chown -R www-data:www-data bootstrap/ sudo chmod -R 775 bootstrap/cache/ |
Кращі практики для уникнення проблем
1. Правильне налаштування проекту
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# При розгортанні проекту git clone repository project/ cd project/ # Встановити залежності від правильного користувача sudo -u www-data composer install # Налаштувати права одразу sudo chown -R www-data:www-data . sudo chmod -R 775 storage/ bootstrap/cache/ sudo chmod 644 .env |
2. Docker підхід (рекомендовано)
|
1 2 3 4 5 6 7 |
# Dockerfile FROM php:8.2-fpm RUN usermod -u 1000 www-data WORKDIR /var/www COPY --chown=www-data:www-data . . USER www-data |
Рішення для Docker контейнерів (без sudo)
Якщо ви root в контейнері
|
1 2 3 4 5 6 |
# Змінити власника файлів chown -R www-data:www-data bootstrap/cache/ storage/ # Або запустити від www-data su -s /bin/bash www-data -c "php artisan optimize:clear" |
Якщо працюєте під www-data
|
1 2 3 4 5 |
# Просто виправити структуру touch bootstrap/cache/events.php chmod 775 bootstrap/cache/events.php php artisan optimize:clear |
Багатоетапний Dockerfile (найкраще рішення)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
FROM php:8.2-fpm as app # Встановити залежності COPY composer.json composer.lock ./ RUN composer install --no-dev --optimize-autoloader # Скопіювати код з правильними правами COPY --chown=www-data:www-data . . # Встановити права на критичні директорії RUN mkdir -p storage/logs storage/framework/cache storage/framework/sessions storage/framework/views bootstrap/cache \ && chown -R www-data:www-data storage bootstrap/cache \ && chmod -R 775 storage bootstrap/cache # Перемкнутися на www-data для виконання USER www-data # Створити кеші RUN php artisan config:cache \ && php artisan route:cache \ && php artisan view:cache |
Docker Compose приклад
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# docker-compose.yml version: '3.8' services: app: build: . volumes: - storage:/var/www/storage - cache:/var/www/bootstrap/cache environment: - CHOWN_DIRS=storage,bootstrap/cache # Init контейнер для налаштування прав permissions: image: alpine volumes: - storage:/var/www/storage - cache:/var/www/bootstrap/cache command: > sh -c " chown -R 1000:1000 /var/www/storage /var/www/bootstrap/cache && chmod -R 775 /var/www/storage /var/www/bootstrap/cache " volumes: storage: cache: |
Entrypoint скрипт для контейнера
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/bin/bash # entrypoint.sh # Виправити права якщо запущені під root if [ "$(id -u)" = "0" ]; then echo "Fixing permissions..." chown -R www-data:www-data /var/www/storage /var/www/bootstrap/cache chmod -R 775 /var/www/storage /var/www/bootstrap/cache # Перемкнутись на www-data exec su-exec www-data "$@" else # Вже працюємо під правильним користувачем exec "$@" fi |
3. Автоматизація через скрипт
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#!/bin/bash # deploy.sh echo "Fixing Laravel permissions..." # Права на директорії sudo chown -R www-data:www-data . sudo find . -type d -exec chmod 755 {} \; sudo find . -type f -exec chmod 644 {} \; # Специфічні права Laravel sudo chmod -R 775 storage/ bootstrap/cache/ sudo chmod 644 .env # Очищення кешів від правильного користувача sudo -u www-data php artisan optimize:clear sudo -u www-data php artisan config:cache sudo -u www-data php artisan route:cache echo "Permissions fixed!" |
Діагностика проблем
Перевірити поточні права
|
1 2 3 4 5 6 7 8 |
# Подивитись власників файлів ls -la storage/logs/ ls -la bootstrap/cache/ # Перевірити під яким користувачем працює веб-сервер ps aux | grep nginx ps aux | grep php-fpm |
Тестування запису
|
1 2 3 4 5 |
# Перевірити чи може www-data писати sudo -u www-data touch storage/test-write ls -la storage/test-write rm storage/test-write |
Логи помилок
|
1 2 3 4 5 6 7 |
# Дивитись логи веб-сервера tail -f /var/log/nginx/error.log tail -f /var/log/php8.2-fpm.log # Laravel логи tail -f storage/logs/laravel.log |
Production налаштування
Nginx конфігурація
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
server { listen 80; server_name example.com; root /var/www/project/public; # Важливо: правильний користувач location ~ \.php$ { fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } } |
Systemd сервіс для queue
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# /etc/systemd/system/laravel-queue.service [Unit] Description=Laravel Queue Worker After=network.target [Service] User=www-data Group=www-data Restart=always ExecStart=/usr/bin/php /var/www/project/artisan queue:work [Install] WantedBy=multi-user.target |
Швидкий чекліст при помилках
- Перевірити власника файлів:
ls -la - Виправити права:
sudo chown -R www-data:www-data . - Встановити правильні дозволи:
sudo chmod -R 775 storage/ bootstrap/cache/ - Запустити команди від www-data:
sudo -u www-data php artisan optimize:clear - Перевірити логи:
tail -f storage/logs/laravel.log
Висновок
Більшість помилок Laravel пов’язаних з файловими операціями виникають через неправильні права доступу. Основне правило – весь код Laravel повинен належати веб-серверу (www-data), а команди artisan слід запускати від того ж користувача.
Використовуйте Docker або правильно налаштовані deployment скрипти щоб уникнути цих проблем у продакшені.