Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

node.js에서 OS의 환경변수 사용하기

개발을 하다보면 시스템 설정의 값을 사용하게 되는 경우가 있습니다. 이런 부분은 기본적으로 글로벌 변수로 지정을 해서 사용하여도 되지만 한 애플리케이션 뿐만 아니라 전체 시스템에서 공통적으로 사용하는 값이라면 관리차원에서 공통적으로 사용하는 것이 좋습니다.

node.js에서 제공하는 process.env를 사용하면 시스템에서 설정한 값을 가져올 수 있습니다. OSX나 Ubuntu에서는 env 라는 명령어를 사용하면 현재 설정된 환경변수를 확인해 볼 수 있고 export USER_VAR=값 을 사용해서 필요한 환경변수를 설정할 수 있고 사용자 계정에 항상 환경변수를 설정하려면 ~/.profile 파일에 export USER_VAR=값 을 설정해 놓으면 해당 계정에서는 계속 환경변수를 사용할 수 있고 모든 사용자가 공통으로 사용하려면 /etc/profile 에 설정해 놓으면 됩니다. 특정 환경변수를 출력해 보려면 echo $USER_VAR 을 사용하면 값을 확인해 볼 수 있습니다.

process.env["USER_VAR"]

node.js 코드 안에서 위처럼 사용해서 환경변수의 이름을 넘겨주면 해당 값을 사용할 수 있습니다. 디비의 주소나 포트번호, 아이디, 패스워드등 변경될 수도 있고 전체 시스템이 공통으로 사용하는 값에 이렇게 사용하면 유용하고 특히 Github등에서 프로젝트를 공유하려고 한다면 소스코드내에 서버주소나 아이디/비밀번호를 커밋할 때마다 지우고 커밋하는 것은 번거롭고 실수의 여지도 있기 때문에 이런 부분에 환경변수를 네이밍만 명확하게 해서 사용하면 소스코드 공유도 편하면서 의미도 명확하게 되리라고 생각합니다.




Upstart를 사용할 경우
이전에 upstart를 이용해서 node app을 관리하는 포스팅을 올린 적이 있었는데 시스템쪽은 잘 몰라서 구체적인 부분은 모르겠지만 Upstart를 이용해서 node app을 실행할 경우 스크립트 내에서는 exec sudo -u USERNAME와 같은 명령어로 사용하지만 아주 기본적인 환경변수(HOME이나 PATH 같은)외에는 전혀 환경변수가 먹지 않습니다.(여러가지 테스트를 해보았지만 정확한 이유는 모르겠고 Upstart의 동작방식 때문인 것으로 추측하고 있습니다.)


script
    chdir /path/to/socketio-slide/socket.io
    exec sudo -u USERNAME sh -c "/usr/local/bin/node socketio-slide.js >> /var/log/node/socketio-slide.log 2>&1"
end script

앞의 포스팅에서 사용한 Upstart코드인데 테스트를 해보니 script내부에서 export명령어를 지정하더라도 실제 node.js가 실행된 코드내에서는 환경변수가 사용되지 않습니다. 이미 존재하는 PATH나 HOME같은 경우 값은 바뀌지만 새로운 환경변수는 만들어 지지 않습니다. 존재하지 않는 환경변수는 undefined로 나옵니다.(이게 안되서 얼마나 고생했는지 모릅니다. ㅠㅠ)

exec sudo -u USERNAME DB_HOST=127.0.0.1 DB_PORT=30000  /usr/local/bin/node socketio-slide.js >> /var/log/node/socketio-slide.log 2>&1

위와 같이 exec로 명령어를 실행하기 전에 사용자 환경변수를 지정해주면 node.js 코드 내에서도 process.env를 이용해서 환경변수를 가져올 수 있습니다.(명령어 부분에서 sh -c 부분이 없이 사용한 부분은 환경변수때문에 바꾼건 아니고 sh -c 없이 그냥 사용해도 실행할 수 있었습니다.)
2010/11/13 03:49 2010/11/13 03:49