카테고리 없음

Nginx

Jueuunn7 2025. 2. 7. 17:23

nginx란 http와 리버스 프록시, IMAP/POP (이메일 프로토콜)의 서버를 구동할 수 있는 오픈 소스입니다.

nginx는 러시아의 개발자가 Apache의 C10K 문제를 해결하기 위해 개발이 시작되었습니다.

 

1. Apache C10K문제

C10K는 Connection 10K Problem의 줄임말이며 동시에 1만 개의 커넥션을 가질 수 있는 서버를 구현하는 문제입니다.

아파치는 prefork방식을 사용해 미리 프로세스를 만들어두고 요청이 들어오면 프로세스를 한 개 가져다 쓰는 방식을 사용합니다. 만약 프로세스가 부족하다면 하나 더 생성하고, 하나의 커넥션을 오랫동안 사용했습니다. (Keep-Alive)

이렇게 커넥션마다 프로세스를 할당하면 대표적으로 메모리 부족 문제가 발생합니다. 또한 아파치의 무거운 모듈들은 프로세스의 크기를 키워서 프로세스는 더욱 무거워졌습니다. 또한 많은 프로세스들은 하나의 CPU가 감당하기 힘들어지고 CPU는 프로세스를 바꿔가며 컨텍스트 스위칭이 계속 발생했습니다.

이런 문제를 해결하기 위해서 Nginx가 개발되기 시작했습니다.

 

2. Nginx

nginx 초기에는 Apache를 완전 대체할 목적은 아니었고 Apache와 함께 사용해 Apache의 단점을 개선하기 위한 목적으로 개발되었습니다.

Nginx는 Event-Driven방식으로 작동합니다.

정적 파일은 스스로 응답하고, 동적 요청은 직접 아파치와 커넥션을 생성해 처리하는 방식입니다.

2-1. Nginx 구조

Nginx는 master-worker process 방식으로 작동합니다. master process는 설정에 맞게 worker process를 생성하는 역할을 합니다. worker process들은 자동적으로 cpu 코어 개수만큼 생성되며 컨텍스트 스위칭을 많이 줄였습니다.

worker process는 각자 소켓을 하나 지정받고 해당 소켓에 들어온 커넥션과 요청을 처리합니다.

들어온 커넥션은 Keep-Alive 시간 동안 연결되게 되는데 해당 커넥션에 아무런 이벤트가 없으면 worker process는 새로운 커넥션을 생성하거나 다른 커넥션의 요청을 처리합니다. 이런 커넥션 생성, 요청 처리를 이벤트라고 부릅니다.

여러 이벤트들은 커널이 큐 형식으로 worker process에 전달합니다. 그리고 worker process는 큐에 있는 이벤트들을 순차적으로 처리합니다.

이런 방식은 아파치 서버의 prefork 방식의 단점인 프로세스들이 놀고 있거나 너무 많이 생성되는 구조적인 문제를 해결했습니다.

이렇게 Nginx는 경량을 챙기면서도 더 많은 동시 커넥션 수를 관리할 수 있게 되었습니다.

 

2-2. Nginx 설정

nginx는 nginx.conf 파일로 설정됩니다.

크게 simple directive, block directive로 설정됩니다.

- simple directive

worker_process 1;

- block directive

http{
  server{
    location / {
      proxy_pass qwer;
    }
  }
}

 

directive 키워드 종류

http: HTTP 통신과 관련된 설정을 정의합니다.

server: 하나의 호스트를 설정합니다. http 블록 안에 여러개를 설정할 수 있습니다.

location: server 블록 안에서 특정 url마다의 요청을 처리합니다.

events: 네트워크 작동 환경을 설정합니다. events 블럭 지시어는 events 블록에서 단독으로 사용됩니다. 워커 커넥션 수 등을 지정할 수 있습니다.

 

2-3. 리버스 프록시

http {
    server {
        listen 80;
        location / {
	        proxy_pass http://127.0.0.1:8001;
        }
    }
}

리버스 프록시는 서버 측에서 요청을 대신 받고 여러 작업을 진행한 후에 요청을 전달하는 역할을 합니다.

로드밸런싱, 캐싱등 여러 기능들을 사용할 수 있습니다.

 

3. 결론

Nginx는 Apache보다 더 가볍지만 좋은 성능으로 현대에 가장 인기 있는 웹서버입니다.

로드밸런싱, 리버스 프록시등의 설정을 아주 쉽고 간단하게 할 수 있으니 사용해 보면 좋을 것 같습니다.