통합검색

Linux

[PHP&centOS] PHP exec() 함수로 아파치 restart 하기

  • 2022.04.15 14:42:48



PHP를 통해 Linux(CentOS)의 apache 데몬을 graceful 혹은 restart 해야 하는 상황이 생겼다.
기본적으로 별도의 리눅스 sudo 설정을 하지 않았다면,
PHP의 exec() 이나 shell_exec() 함수를 통한 리눅스 명령어 엑세스는
디렉터리를 조회하는 등의 일반 user 에게 부여되는 엑세스만 가능하다.
apache 등의 데몬을 제어하기 위해선 sudo 설정을 통해 일부 명령어에 root 권한을 부여해야 한다.

[!]visudo 설정하여 외부 exec() 권한 부여[/!]
(CentOS 7.*를 기준으로 한다.)
 
#visudo

로 sudo 설정파일을 연다.
( #vi sudoers 로 열게 되면 readonly 모드로 열리므로 #visudo 로 열어 수정해야 한다. )
 
apache ALL=NOPASSWD:/sbin/service

를 추가한다.

가장 앞에 위치한 'apache'의 경우 리눅스 셋팅에 따라
www-data 혹은 nobody 가 되기도 하므로 주의!


[!]PHP에서 exec() 으로 apache restart 하기[/!]

visudo를 수정 하였기 때문에  /sbin/service 에 apache 에게 root 권한이 부여 되어
웹에서 PHP를 통해 service 제어가 가능해졌다.

아래와 같이
test.php 파일 하나를 만들고 테스트 코드를 작성해 보자.
 
exec("/usr/bin/sudo /sbin/service httpd restart > /dev/null 2>&1 &");

http://domain/test.php
로 접속하게 되면 정상적으로 아파치가 재시작 된 것을 확인해 볼 수 있다.
( > /dev/null 2>&1 & 은 php에서 응답을 기다리지 않고, 백그라운드에서 실행되도록 하는 옵션이다.)