개발자 9Diin의 개발일기

Nginx란 무엇인가? 본문

2021-2023

Nginx란 무엇인가?

9Diin 2022. 6. 26. 16:29
반응형

프런트엔드 개발자로 취업한 지 어느덧 9개월이 넘었다. 그렇지만 프런트엔드 개발자라고 하기에 무색할 정도로 뚜렷한 프로젝트를 처음부터 끝까지 진행해본 적이 없다. 내가 하는 일은 그저 어떠한 이슈가 터진 곳을 올바르게 해결하는 정도? 딱 이 정도가 내 현재 역할인 것 같다. 그것도 그럴 것이 나는 프런트엔드 개발자로 취업을 했지만, 내가 재직 중인 회사에 모두 백엔드 개발자이고, 프런트엔드 개발자가 나 혼자이다. 그래서 9개월이란 시간 동안 어떤 성장도 하지 못한 것 같은 기분이지만, 그래도 회사에서 프런트엔드 팀을 만들어 준다는 약속을 받았기에 버텨보는 중이다.

 

이런 푸념을 할 생각이 있던 건 아니었는데 서두가 길었다. 

 

어쨌든, 이번 화두는 개발서버가 아닌 로컬 서버에서 HTML과 Vue.js로 따로 개발된 화면들을 볼 수 있게끔 할 수 있는 방법이 있느냐였다. 이 프로젝트를 리드하시는 팀장님 말씀으로는 'Nginx를 활용하면 해결할 수 있지 않을까?'라는 솔루션 아닌 솔루션을 주셨다. 그렇다. 난 Nginx를 처음 들어봤다. Nginx가 정확히도 아니라 아예 모른다.

 

 

 

 

그럼 Nginx란 무엇일까?

역시 구글링을 했다.

 

Nginx? Nginx는 간단하게 경량 웹서버라고 이해하면 된다고 한다. 경량 웹서버? 내가 VS Code에서 아무 생각 없이 터미널에 npm run dev(or serve)를 입력하고 하얀 웹 페이지에서 띄우는 그것과 다른 걸까? 이 역시 고민을 해본 적이 없어서 나는 참 아는 게 없다는 생각이 강하게 들었다. 아무튼, 나는 일단 팀장님께 받은 과제(?)를 해결해야 했기에 급한 불부터 끄기로 한다.

 

Nginx는 클라이언트로부터 요청을 받았을 때 요청에 맞는 정적 파일을 응답해주는 HTTP Web Server로 활용되기도 하고, Reverse Proxy Server로 활용하여 WAS 서버의 부하를 줄일 수 있는 로드 밸런서로 활용되기도 한다고 한다. 또한, Apache 서버와 다른 점은 Apache와 같은 웹서버는 클라이언트로부터 받은 요청을 처리할 때 새로운 프로세스 또는 스레드를 생성하여 처리한다고 한다. 요청마다 스레드가 생성되므로 접속하는 사용자가 많으면 그만큼 스레드가 생성되어 CPU와 메모리 자원의 소모가 커진다고 하는데, Nginx는 Event-Driven 구조로 동작하기 때문에 한 개 또는 고정된 프로세스만 생성하여 사용하고, 비동기 방식으로 요청을 Concurrency 하게 처리할 수 있다고 한다. 정말 무슨 말인지 모르겠다.

 

위 그림처럼 Nginx는 새로운 요청이 들어오더라도 새로운 프로세스와 스레드를 생성하지 않기 때문에 프로세스와 스레드 생성 비용이 들지 않고, 적은 자원으로도 효율적인 운용이 가능하다 한다. 사실 나는 이 부분도 이해가 되지 않기 때문에 어떤 의미인지 모르겠지만, Nginx를 사용하는 것이 때로는 효과적일 수 있다 정도로만 받아들이기로 했다. 이러한 장점 덕분에 단일 서버에서도 동시에 많은 연결을 처리할 수 있다고 한다.

 

Nginx의 구조

Nginx는 하나의 Mater Process와 다수의 Worker Process로 구성되어 실행된다고 한다. Master Process는 설정 파일을 읽고, 유효성 검사를 한다. 그리고 기타 Worker Process를 관리하는 시스템이다. 모든 요청은 Worker Process에서 처리를 하고, Nginx는 이벤트 기반 모델을 사용하여 Worker Process 사이에 요청을 효율적으로 분배하기 위해 OS에 의존적인 메커니즘을 사용한다고 한다. Worker Process의 개수는 설정 파일에서 정의되며, 정의된 프로세스 개수와 사용 가능한 CPU 코어 숫자에 맞게 자동으로 조정된다고 한다.

 

Nginx 기본 환경 설정 방법

일반적으로 환경 설정 파일은 관리자가 편집하거나 프로그램을 분석할 수 있는 텍스트 파일로, 여러 가지 값을 지정해 프로그램의 작동 방법을 결정한다. 리눅스 기반 운영체제에서는 애플리케이션의 상당 부분이 크고 복잡한 환경 설정 파일에 의존해 수행한다.

 

어쨌든, Nginx를 사용하는 이유는 환경 설정이 비교적 간단하다는 점인데, 습득해야 할 원리도 지시어, 블록, 전체 논리 구조 등 몇 개 되지 않는다고 한다. 실제 환경 설정 과정은 대부분 지시어 값을 정하는 일로 이루어진다.

 

지시어 설정

 

 

첫 번째 줄은 주석이고, 두 번째 줄은 실질적인 문장으로 지시어에 해당한다 한다. 첫 비트(worker_process)는 설정키를 나타내며 그 뒤에 한 개 이상의 값을 붙일 수 있다. Nginx가 단일 작업자 프로세스로만 작동됨을 의미한다고 한다. Nginx는 모듈 구조로 작동하기 때문에 각 모듈은 특정 지시어의 묶음 형태로 제공된다. 가장 기본적인 지시어들은 Nginx Core Module에 포함되어 있다.

 

구조와 인클루드

 

 

이름이 의미하는 것처럼 include 지시어는 특정 파일을 포함하는 기능을 수행한다. 지시어가 있는 바로 그 위치에 해당 파일 내용이 삽입된다.

 

 

인클루드는 순환적으로 처리된다. 이 말은 앞의 경우에 other_settings.conf 파일 안에서 또 다른 파일을 인클루드 할 수 있음을 의미한다. 초기 환경 설정에서는 두 개의 파일, 즉 nginx.conf와 mime.types를 사용했다. 하지만 좀 더 발전된 환경 설정에서는 그 이상의 파일을 사용한다.

 

nginx.conf : 애플리케이션의 기본 환경 설정

mime.types : 파일 확장명과 MIME 타입 목록

fastcgi.conf : FastCGI 관련 환경 설정

proxy.conf : 프록시 관련 환경 설정

sites.conf : 엔진엑스에 의해 서비스되는 가상 호스트 웹사이트의 환경 설정. 도메인마다 파일을 분리해서 만들 것을 권장.

 

include 지시어는 파일명 글로빙(filename globbing)을 지원한다. 즉, 파일명에 와일드카드 문자인 별표(*)를 사용할 수 있다.

반응형