리눅스에서 새로운 service를 추가하여 웹서버의 앱을 구동할 수 있습니다. 예를들어 아래 코드는 uwsgi를 사용하여 python 앱을 서버에 구동하는 코드인데요 ~ 이와 같이 새로운 서비스(Service)를 사용하는 경우 설정하는 방법과 주의할 몇 가지를 알아봅니다.


! 새로운 service 등록과 설정방법
먼저 코드를 살펴보도록 하죠. /etc/systemd/system/myapp.service 파일입니다.

@ myapp.service
[Unit]
Description=uWSGI instance to serve my app
After=network.target

[Service]
User=root
Group=www-data
Environment="PATH=/home/myapp"
WorkingDirectory=/home/myapp
ExecStart=/usr/local/bin/uwsgi --ini /home/myapp/app.ini

[Install]
WantedBy=multi-user.target

위 코드는 일반적으로 볼 수 있는 신규 service 설정 파일입니다. 여기서 [Service] 블락의 코드를 잘 설정해야 합니다. 특히 경로 부분이 맞지 않으면 서비스가 제대로 동작하지 않을 수 있습니다.

특히 해당 파일을 찾을 수 없는 문제가 많이 나타나는데요.. 그 이유는 service 파일에 의하여 만들어지고 실행되는 영역(공간)은 항상 명령어를 실행하는 환경과 다르기 때문이죠.

다시 [Service] 블락만 살펴보면 아래와 같습니다.
[Service]
...
Environment="PATH=/home/myapp"
WorkingDirectory=/home/myapp
ExecStart=/usr/local/bin/uwsgi --ini /home/myapp/app.ini

여기서 설정된 WorkingDirectory와, ExecStart에 대하여 우선 살펴보겠습니다.

- Environment // 사용할 환경변수를 설정
- WorkingDirectory // 앱이 구동후 작업이 실행되는 영역의 위치, path
- ExecStart // service 구동시 실행할 구문

각각 알아보면 다음과 같습니다.

Environment 는 Service 파일 내부에서 사용할 환경변수를 선언하여 사용할 수 있도록 제공합니다. 즉 아래 코드는 PATH이름의 변수를 선언하고 이를 서비스 환경 내부 어디서든 사용할 수 있도록합니다.
Environment="PATH=/home/myapp"
ExecStart=/usr/local/bin/uwsgi --ini $PATH/app.ini

사용할 때는 $PATH, ${PATH}와 같은 방법으로 변수를 불러오는 것이 가능합니다.

그 다음 WorkingDirectory의 경우 실행된 후 작업이 실행될 위치입니다. 즉 앱을 실행하기 위한 path 정보와는 다르며 앱이 구동될 경우 해당 위치의 파일을 불러오거나 읽을 때의 작업 공간으로 설정하는 값입니다.

다음으로 ExecStart는 해당 service가 실행될 때 구동될 구문입니다. 이때 uwsgi, python 처럼 설치된 명령어를 직접 사용하는 경우 설치된 절대 경로를 필요로합니다. 이런 이유로 이런 실행 명령어는 직접 사용하기 보다 myapp.sh와 같은 스크립트 파일을 만들어 호출하는 형태로 사용됩니다.


여기까지 간단하게 Service 설정시 선언할 값에 대하여 간략하게 알아보았습니다.