Nginx 란?
Nginx 란 러시아의 이고르 시쇼브란 개발자가 Apache 의 C10K Problem (하나의 웹서버에 10,000개의 클라이언트의 접속을 동시에 다룰 수 있는 기술적인 문제) 을 해결하기 위해 Event-Driven 구조로 만든 오픈 소스 소프트웨어다.
Apache 와의 차이점
Apache
Client가 HTTP 요청을 보낼 때, Apache는 MPM (Multi Processing Module) 을 사용하여 처리한다.
1. Prefork 방식 (멀티 프로세스 방식)
자식 프로세스를 미리 생성해두고 클라이언트 요청에 하나에 대해 한 프로세스가 담당한다.
따라서 한 자식 프로세스가 알 수 없는 원인으로 정지하더라도 다른 자식 프로세스에 영향을 주지 않는다.
자식 프로세스의 수는 최대 1024 개다.
프로세스 당 한 개의 스레드만 존재하기 때문에 스레드간 메모리 공유를 하지 않아서 안정적인 대신에 메모리 사용량이 많다.
시작 시 생성한 프로세스의 수보다 요청이 많아지면 실행 중인 프로세스를 복제하여 실행한다. 이 때, 메모리 영역까지 같이 복제된다.
2. Worker 방식 (멀티 프로세스 & 멀티 스레드 방식)
자식 프로세스마다 멀티 스레드로 실행하며 각 클라이언트의 요청을 스레드가 처리한다.
하나의 프로세스가 여러 요청을 담당하며 Prefork 와 비교해서 시작 프로세스 수를 줄일 수 있다.
스레드 간 메모리를 공유하기 때문에 메모리 사용량이 적다.
한 프로세스 당 최대 64 개의 스레드 처리가 가능하다.
Apache 한계
Apache는 접속마다 Process 또는 Thread를 생성하는 구조이다.
동시 접속 요청이 10,000 개라면 그 만큼 Process or Thread 생성 비용이 들 것이고 대용량 요청을 처리할 수 있는 웹서버로서의 한계를 드러내게 된다.
Nginx
Nginx 는 Event-Driven 방식으로 동작한다.
한 개 또는 고정된 프로세스만 생성 하고, 그 프로세스 내부에서 비 동기 방식으로 효율적으로 작업들을 처리한다.
따라서 동시 접속 요청이 많아도 Process 또는 Thread 생성 비용이 존재하지 않는다.
Event-Driven 방식에선 작업을 하다 I/O, socket read/write 등 CPU가 관여하지 않는 작업이 시작되면 기다리지 않고 바로 다른 작업을 수행한다.
Config
Nginx 블록
server { root /home/a; location / { root /home/b; index main.html; } }
server 블록에 root 정의해두면 하위 블록에 전부 적용된다.
location 블록에 root 를 재정의하면 location 블록에 있는게 우선시된다.
위 nginx 서버에 접근하면 /home/b/main.html
파일을 연다.
error_page 설정
server { location / { error_page 404 main.html; .. } }
www.a.com
에 접속했을 때 파일을 찾지 못해 404 에러가 발생하면 www.a.com/main.html
로 URL 을 이동시켜준다.
error_page 커스터마이징
server { location / { error_page 404 main.html; } location /main.html { root /home/c; } }
error_page 로 이동시킬 때 location 블록으로 다시 root 경로를 설정해 줄 수 있다.
www.a.com/main.html
URL 로 이동할 때 띄우는 html 경로를 강제로 지정할 수 있다.
위 예시에서는 /home/c/main.html
페이지를 띄워준다. (URL 에 맞는 html 파일로 이동)
Reverse Proxy 설정
server { server_name aa.bb.com; location / { proxy_pass http://127.0.0.1:8080; error_page 404 502 main.html; } }
aa.bb.com
도메인에 접근하면 http://127.0.0.1:8080
로 연결해준다.
404 나 502 에러가 발생하면 aa.bb.com/main.html
URL 로 이동시킨다.
명령어
nginx 디렉토리로 가서 명령어 타이핑 (권한이 필요하면 sudo
)
# nginx 시작 $ ./nginx # nginx 중지 $ ./nginx -s stop # nginx 재시작 $ ./nginx -s reload
Reference
'공부 > Server' 카테고리의 다른 글
RabbitMQ (0) | 2020.11.09 |
---|---|
Forward Proxy, Reverse Proxy 정의와 차이점 (2) | 2020.05.21 |