Graceful Light

Laravel 5.5 - Log Permission 문제

2017-08-18


웹 서버의 유저로 로그 파일이 생성되어야 하는데, 어느 순간부터 root:root 권한을 달고 daliy log가 생성되는 경우가 있다.

여러가지 경우의 수가 있는데, 맞는 조건을 찾아서 Permission 오류가 발생하지 않게 처리해보자.

selinux

storage에는 쓰기권한이 있어야한다.

1
$ chcon -R -t httpd_sys_rw_content_t storage

WebServer user

웹 서버의 유저가 다르게 설정 되어있을 때 권한이 바뀔 수 있다.
서버 설정을 열어서 유저가 제대로 설정되어 있는지 확인해보자.

nginx.conf
1
user nginx;

php-fpm user

php-fpm에서 설정하는 user와 group이 다르게 설정 되어 있을 때 권한이 바뀔 수 있다.
php-fpm 설정을 열어 유저가 제대로 설정되어 있는지 확인해보자.

php-fpm.d/www.conf
1
2
3
4
5
user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx

log rotate

로그 파일이 너무 커지는 걸 막기위해 log rotate 설정이 되어있다면 권한이 바뀔 수 있다.
logrotate가 cron에 물려 있는지 설정을 확인해보자.

/etc/logroate.d/*
1
2
3
4
5
$ pwd
/etc/logroate.d
$ vi nginx
$ vi php-fpm

cron 사용시

crontab의 경우 root 유저로 실행이 되면 cron에서 Laravel을 호출할 때 log가 root 권한으로 생성될 수 있다.

로그 분기

log 파일을 생성하는 프로세스별로 분기해서 해결할 수 있다. Stackoverflow 참조

bootstrap/app.php
1
2
3
4
5
$app->configureMonologUsing(function(Monolog\Logger $monolog) {
$filename = storage_path('logs/laravel-'.php_sapi_name().'.log');
$handler = new Monolog\Handler\RotatingFileHandler($filename);
$monolog->pushHandler($handler);
});

설정을 추가해 놓으면 logs 폴더 하위에 다음과 같이 로그가 분기되어 생성된다.

storage/logs
1
2
$ ls -al .
-rw-r--r-- 1 nginx nginx 718 Aug 18 10:56 laravel-fpm-fcgi-2017-08-18.log

cron은 root에서 실행되나 user shell에서 Laravel 프로세스를 실행하는 경우 root에 의해 log가 생성되었다면 다음과 같이 permission을 변경해서 생성해야한다. Post 참조

bootstrap/app.php
1
2
3
4
5
6
$app->configureMonologUsing(function(Monolog\Logger $monolog) {
$filename = storage_path('/logs/laravel-' . php_sapi_name() . '.log');
// 5번째 파라미터로 666 권한을 넘긴다.
$handler = new Monolog\Handler\RotatingFileHandler($filename, 0, \Monolog\Logger::DEBUG, true, 0666);
$monolog->pushHandler($handler);
});

RotatingFileHandler의 Parameter는 여기를 참조하자.
666으로 생성 시엔 굳이 php_sapi_name()을 사용하지 않아도 된다. (rw 권한이 모두에게 있으니까)

setfacl

다른 해결 방법으로는 ACL을 수정해 logs 폴더 자체를 해당 user:group이 편집할 수 있게 처리하면 된다.

1
2
3
4
5
6
7
8
9
10
$ pwd
/public_html/storage/logs
$ setfacl -d -m u:nginx:rwx .
$ getfacl .
default:user:nginx:rwx
# 삭제
$ setfacl -d -x u:nginx .

여담

Laravel 프로젝트 시작시 bootstrap/app.php 안에 로그를 분기 로직을 넣고 개발하는 게 좋아보인다.

🍺

Buy me a beer 🍗

공유하려면 QR코드를 스캔해주세요