[OS]개발 인프라 구성(1)-어플리케이션 서버



서론

올해 6월부터 사내 프로젝트를 진행하면서 개발 인프라를 잡는 역할을 맡게 되었다. 그동안 개발위주로 작업했던터라 조금 당황스럽기도 했지만 막상 해보니 화면개발이나 자바 개발과는 다른 리눅스의 재미를 느낄 수 있는 기회라 좋았다. 까먹기전에 당시 했던 작업들에 대해 정리를 해보려고 한다.

어플리케이션 서버 구성

이번에 진행한 사내 프로젝트의 표면적 이유는 노후화된 홈페이지를 개선하는 작업이었다. 하지만 이와 더불어 클라우드 도입과 오픈소스 기술을 사용하는 것이 이면에 깔려있었다.
어플리케이션 서버 구성은 오픈소스 웹서버인 Nginx와 오픈소스 WAS인 Tomcat으로 구성해 Tomcat 앞에 Nginx를 두어 HTTP 요청을 처리하도록 했다. 그 이유에 대한 답은 다음 링크(http://toby.epril.com/?p=1125)로 대신 하겠다.

Nginx 서비스의 구동/중지를 위한 Linux capabilities 작업

유닉스/리눅스에서는 기본적으로 권한을 부여 받지 못한 유저는 1024 이하의 포트 번호(well-known port)를 사용할 수 없다. 이 상황에서 Nginx나 Apache HTTP Server 같은 웹 서버는 80번(HTTP) 혹은 443번(HTTPS)을 기본적으로 사용한다. 따라서, 웹 서버를 올리거나 내릴 때는 sudo 명령어를 써야 한다.
하지만, 루트 권한으로 명령어를 실행하는 것은 보안에 잠재적 리스크를 줄 수 있기 때문에 가능한 적게 쓰는 것이 좋다.
sudo를 쓰지 않고 웹 서버를 올리고 내리기 위해 Linux capabilities를 사용했다.  Linux capabilities를 사용하면 특정 프로그램 실행에 대한 root 권한 체크를 독립적으로 피할 수 있게 설정한다. Linux capabilities로 수행할 수 있는 명령이 여러가지 있는데 그 중 CAP_NET_BIND_SERVICE를 사용해 1024 이하의 포트에 대한 바인딩을 허용하도록 했다.

예)
setcap ‘CAP_NET_BIND_SERVICE=+ep' 프로그램명 (capabilities 설정)
getcap 프로그램명 (프로그램에 설정된 capabilities 확인)
setcap –r 프로그램명 (프로그램에 설정된 capabilities 제거)
설정 이후부터 sudo 명령어 없이 Nginx를 올리고 내릴 수 있다.

Nginx -Tomcat Reverse Proxy 작업

Reverse proxy는 외부 클라이언트와 내부 어플리케이션 사이에 위치한 서버라고 할 수 있다. 클라이언트의 요청을 그에 알맞은 서버(혹은 어플리케이션)으로 포워딩하는게 주 업무이다. 여기서는 Nginx로 들어온 요청(80 포트)을 Tomcat(8080 포트)로 포워딩하도록 설정했다. 위 설명을 그림으로 풀어서 설명하면 아래와 같이 볼 수 있다.


80포트로 들어오는 모든 HTTP 요청을 127.0.0.1:8080(Tomcat)으로 넘기도록 하는 간단한 설정이다. 추가적으로 HTTP 헤더를 몇가지 추가하도록 설정했다.

Nginx의 Permission Denied 에러 해결 방법

Nginx를 설치하고 처음 서비스를 구동했을 때 웹으로 접근하면 403 에러가 났다. 문제 해결을 위해 Nginx의 에러 로그를 살펴보니 Permission Denied 문제였다. 구글링을 해보니 접근 제한에 대한 세팅을 제대로 하지 않아 오류가 난 경우였다.


Nginx는 요청 받은 파일을 내려주기 위해 해당 파일에 대한 읽기 권한 및 파일이 위치한 디렉토리와 모든 부모 디렉토리들에 대해 실행 권한이 필요하다. 가령, /usr/share/myfile/image.jpg 에 접근하기 위해서는 image.jpg 파일에 대한 읽기 권한과 /, /usr, /usr/share, /usr/share/myfile 디렉토리들에 대한 실행 권한이 필요하다.
결과적으로는 요청 파일 경로에 대한 소유자와 권한 체크를 하고, 문제가 있는 부분에 권한 수정을 했다. 특정 파일 경로에 대해 계층적으로 소유자와 권한에 대한 체크를 하기 위해 ‘namei’ 커맨드를 사용했다.

댓글