[PHP]NSSM으로 php-cgi와 nginx를 윈도우 서비스에 등록하기

서버를 운영하다보면 httpd 같은 경우 자체 모니터링 프로그램으로 서버의 스탑, 스타트 제어및 상황을 어렴풋이 확인하는것이 가능한데 nginx같은 프로그램의 경우 GUI를 일절 제공하지 않다보니 서버가 정상작동하고는 있는지 프로그램이 크래쉬되어 다운되거나 뻗은건 아닌지 빠른 확인이 어려운 경우가 있다.

게다가 그렇게 크래쉬되서 강제 종료되거나 뻗을경우 문제는 서버 장애로 연결되기때문에 종료된 프로그램을 다시 실행시키거나 조치해야하는 번거로움이 있는데 NSSM을 활용하여 윈도우에 서비스 등록을 해버리면 윈도우 서비스에서는 그걸 자동으로 부팅시에 실행도 시켜주고 종료될경우 알아서 재시작도 해주는 스마트(?)한 기능이 있어서 서비스 등록을 해줄경우 아무래도 문제가 생겼을때 간편하게 대처가 가능하다는 장점이 있다.

MySQL이나 MariaDB등의 DB에서는 서비스등록을 설치시에 알아서 해주다보니 DB의 경우 손댈일이 없지만 서버 클라이언트단의 경우 PHP나 nginx는 이런 설치를 제공하지 않아서 윈도우 서비스 등록을 수동으로 해줘야하는 번거로움이 존재한다.(httpd의 경우도 수동 등록 형식이기때문에 이부분에 있어서는 httpd에서도 크게 장점은 없는 셈.)

물론 명령프롬프트 창을 열어서 커맨드로 등록시켜주는것도 한가지 방법이다.


sc create 서비스명

허나 이 방법의 경우 nginx는 그럭저럭 쓸수있지만 php-cgi의 경우 뒤에 따라붙는 옵션이 있는데 이걸 마리아DB처럼 설치형식으로 제공하지를 않기때문에 별도의 다른 방법이 필요한데
이때 사용할수 있는것이 바로 NSSM(the Non-Sucking Service Manager)이다.

NSSM 공식 홈페이지 – https://nssm.cc

아래의 글을 참고하였다.
https://brendaniel.github.io/2017/02/02/Nginx-for-Windows-with-PHP

우선 공식 홈페이지에서 프로그램을 내려받아야 한다.

설치 형식은 제공되지 않고 압축파일을 내려받으면 되는데 이때 Latest release의 경우 Stable(안정화 된 버젼)이라 생각하면 되고 Featured pre-release를 최신기능이 추가된 테스트 버젼으로 생각하면 된다.

NSSM을 사용할려면 윈도우 2000 혹은 그 이후 버젼을 사용해야 한다고 나와있으며, 32비트와 64비트용이 한 압축파일안에 같이 들어있어서 본인의 시스템 환경에 맞춰 선택 사용하면 된다.(다운로드로 32비트와 64비트를 따로 구분하지 않는 이유)

그외에 상단에 보면 pre release의 경우 윈도우10 크리에이터스 업데이트 이후 서비스 등록이 되지 않는 문제가 있다고하니 참고하여 선택하면 될듯하다.


2017-04-26: Users of Windows 10 Creators Update should use prelease build 2.2.4-101 to avoid an issue with services failing to start. If for some reason you cannot use that build you can also set AppNoConsole=1 in the registry, noting that applications which expect a console window may behave unexpectedly.
Thanks to Sebasian Krause for the initial diagnosis.

내려받은 압축파일은 명령프롬프트로 접근하기 편한 아무곳에나 풀어주면 된다.

이 글에서는 C드라이브 루트 경로에 nssm이라는 폴더에 풀어둔것으로 가정한다.

nginx 처럼 GUI환경을 아예 제공하지 않는것은 아니지만 명령프롬프트로 접근해서 사용해야 한다.(서비스 설치시에는 GUI 환경이 제공되기는 하나 그외에는 명령 프롬프트를 거처야 한다.)

대신에 nssm.exe를 그냥 실행하면 명령 커맨드 목록을 표시해준다.(명령 프롬프트에서 /? 이나 /help를 입력하면 명령어 목록을 보여주는것과 비슷하다)

NSSM의 명령어 목록


nssm install 서비스명 - 해당이름의 서비스를 등록하는 GUI를 제공하며, 서비스 등록시에 사용된다.

nssm edit 서비스명 - 등록되어 있는 서비스를 수정하는 GUI를 제공하며, 등록된 서비스의 설정을 변경시에 사용된다.(필자 주 - 통상 잘못 등록되었을 경우 제거하고 다시 재등록하는걸 권장한다. 설정을 변경해도 제대로 반영이 안되는 경우가 있는지 동일한 에러로 동작하지 않는 경우가 있는데 제거하고 다시 등록을 했더니 해결되었다.)

nssm remove 서비스명 - 해당 서비스를 제거하는 GUI를 제공하며, 등록된 서비스를 제거하고자 할때 사용된다.(그냥 명령 프롬프트에 sc delete를 사용하는것이 더 편리하다.)

그외에 시작, 정지, 재시작 등등을 제공하는데 자세한것은 직접 내려받아서 nssm.exe를 실행시켜보면 확인이 가능하다.(나머지는 필요 여하에 따라서 이지만 nssm install 이 명령어만 알고있어도 무난하다.)

nginx 서비스 등록하기

명령 프롬프트를 관리자 권한으로 실행시켜준다.(그냥 실행해도 되는 경우도 있으나 아무래도 시스템에 접근해서 수정을 가하는거라 UAC[User Access Control]를 거쳐야 정상적으로 가능한듯 하다.)

이 글에서는


C:\nssm

경로에 압축을 풀었다고 가정한다.

명령 프롬프트에 아래와 같이 입력하여 해당 바이너리(실행파일)이 있는 폴더로 이동한다.


cd C:\nssm\Win64

정상적으로 이동이 되었다면 아래와 같이 입력하여 nssm의 서비스 등록을 실행한다.


nssm install nginx

※서비스 등록명은 본인이 편한대로, 이미 등록된 다른 윈도우 서비스들과 중복되지 않게 설정해주면 된다.

그러면 NSSM service installer 라는 GUI창이 뜨는데 다른부분은 손댈부분이 없고 Application탭에 Path(경로)항목에 nginx.exe파일을 지정해준다.

Path 바로 밑에 Startup directory라는 항목은 위의 경로를 지정해주면 자동으로 입력되므로 그냥 놔두어도 된다.

Arguments는 인수들을 뜻하는데 이를테면 해당 프로그램 실행시에 따로 붙어야 하는 옵션을 여기에 지정해주는 것이다. nginx의 경우 초기 시작시에 따로 등록되어야하는 인수가 없으므로 그냥 비워두면 된다.

최종적으로 아래와 같이 입력되어 있다면 Install service 버튼을 눌러 주면 된다.

Service “nginx” installed successfully! 라는 메세지와 팝업창이 떳다면 정상적으로 nginx가 서비스에 등록이 된것이다.


Path : C:\nginx\nginx.exe
Startup directory : C:\nginx
Arguments : 

※이글에서는 nginx가 C드라이브에 nginx라는 폴더안에 압축을 풀어둔것으로 가정한다.

php-cgi 서비스 등록하기

nginx와 마찬가지로 별로 어렵지 않게 등록이 가능하다.


nssm install php-cgi

※서비스 등록명은 본인이 편한대로, 이미 등록된 다른 윈도우 서비스들과 중복되지 않게 설정해주면 된다.

여기서는 C드라이브에 php7폴더에 php압축을 풀어둔것으로 가정한다.


Path : C:\php7\php-cgi.exe
Startup directory : C:\php7
Arguments : -b 127.0.0.1:9000 -c php.ini

※여기서 주의할점은 아규먼트(인수들)항목에서 위와 같이 했을때 서비스 등록이 제대로 되지 않을 경우 상단에 첨부된 글을 참고하여 등록하면 된다. 사실상 명령 프롬프트에서 php-cgi를 실행할때 뒤에 붙은 옵션을 그대로 적어주는데 이게 경로에 따라서는 앞에 경로등을 적어주어야 하는등 추가적인 것이 필요하기도 하기때문에 상황에 맞춰서 입력해줄 필요가 있다.

이미 등록하고 난뒤에 제대로 서비스가 작동하지 않을 경우 수정보다는 서비스를 제거한후에 다시 install로 등록해서 사용하는것을 권장한다.

서비스가 등록되었을때 기준으로 default는 “자동”으로 되어있다. 즉 부팅이 되는즉시 자동으로 실행되게 되어있기때문에 계정 로그인을 거치지 않더라도 자동적으로 실행이 되게 이미 설정이 된 상태라는 것이다.

만약 부팅시에 자동으로 서버가 실행되길 원하지 않는다면 윈도우 관리도구의 서비스에 들어가서 해당 서비스의 속성창에서 “자동”으로 되어있는걸 “수동”으로 변경해주면 된다.