[nginx] [selinux] open() "/var/run/nginx.pid" failed (13: Permission denied)
아래는 CentOS 7에서 nginx를 실행하여 실패했을 때 'journalctl -xe'로 본 오류 로그.
May 29 17:53:05 main-server systemd[1]: Unit nginx.service entered failed state.
May 29 17:53:05 main-server systemd[1]: nginx.service failed.
May 29 17:53:05 main-server polkitd[549]: Unregistered Authentication Agent for unix-p
lines 1166-1188/1188 (END)
May 29 17:53:05 main-server systemd[1]: Starting nginx - high performance web server...
-- Subject: Unit nginx.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit nginx.service has begun starting up.
May 29 17:53:05 main-server systemd[1]: Failed to parse PID from file /var/run/nginx.pid: Invalid argument
May 29 17:53:05 main-server nginx[12444]: nginx: [emerg] open() "/var/run/nginx.pid" failed (13: Permission denied)
May 29 17:53:05 main-server systemd[1]: Daemon never wrote its PID file. Failing.
May 29 17:53:05 main-server systemd[1]: Failed to start nginx - high performance web server.
-- Subject: Unit nginx.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit nginx.service has failed.
--
-- The result is failed.
May 29 17:53:05 main-server systemd[1]: Unit nginx.service entered failed state.
May 29 17:53:05 main-server systemd[1]: nginx.service failed.
May 29 17:53:05 main-server polkitd[549]: Unregistered Authentication Agent for unix-process:12438:190455444 (system bus name :1.29504, object path /org/freedeskto
~
아래처럼 getenfoce를 넣었는데 'Permissive'가 아니라 'Enfocing'으로 나오면 SELinux를 적용되고 있는 경우이다.
# getenforce
Enforcing
SELinux를 적용되고 있다면, 'setenforce 0'으로 SELinux가 임시로 적용되지 않게 하고 nginx를 다시 실행해 본다.# setenforce 0
# systemctl restart nginx
이렇게 해서 nginx가 문제 없이 실행된다면, nginx가 실행되지 않았던 원인은 SELinux에 있다. /var/run/nginx.pid의 보안 문맥에 원인이 있을 수 있다.
/var/run/nginx.pid의 보안 문맥을 직접 바꿀 수는 없고, restorecon 명령으로 /run/nginx.pid의 보안 문맥을 바꾸어 준다.
# ll /run/nginx.pid
-rw-r--r--. 1 root root 6 May 29 17:53 /run/nginx.pid
# ll -Z /run/nginx.pid
-rw-r--r--. root root system_u:object_r:httpd_var_run_t:s0 /run/nginx.pid
# restorecon -R -v /run/nginx.pid
# setenforce 1
# ll -Z /run/nginx*
-rw-r--r--. root root system_u:object_r:httpd_var_run_t:s0 /run/nginx.pid
# systemctl restart nginx
'ls -lZ' 또는 'll -Z'로 보이는 nginx.pid의 SELinux 보안 문맥은 바뀌지 않더라도, nginx.pid의 권한 문제로 nginx가 실행되지 않는 문제가 풀리기도 한다.
덧글을 달아 주세요