Nginx에 대하여

Nginx란?
Nginx(엔진엑스)란 트래픽이 많은 서버의 확장성을 위해 설계된 비동기 이벤트 기반 구조의 웹서버 소프트웨어이다.
"더 적은 자원으로 더 빠르게 서비스"를 하는 SW로 알려져 있다.
Nginx 등장 배경
Nginx는 러시아의 프로그래머 이고르 시쇼브가 Apache HTTPd를 코딩하다 Apache의 C10K문제를 해결하기 위해 개발되었다. Apache의 C10k문제는 하나의 웹서버에 10,000개의 클라이언트의 접속을 동시에 다룰 수 있는 기술적인 문제를 의미한다.
Nginx 더 깊이..
Nginx는 여러 요청을 한 번에 처리할 수 있는 장점이 큰 웹 서버이다. apache보다 동작이 단순하고 전달자 역할만 하기 때문에, 동시 접속에 특화되어 있다. 구조적으로는 Apache HTTPd에서 사용하는 요청 당 스레드 혹은 프로세스 기반의 구조 대신에 비동기 Event-Driven 구조로 작동한다.(flutter 이벤트 프로세스를 생각하면 이해하기 쉽다.) 이로 인해 작은 thread로 클라이언트의 요청들을 처리 가능하다. 또한, 대부분의 코어 모듈이 Apache보다 적은 리소스로 더 빠르게 동작 가능하다.
이런 구조덕에 클라이언트로부터 요청을 받았을 때 요청에 맞는 정적 파일을 응답해주는 HTTP Web Server로 활용되기도 하고, Reverse Proxy Server로 활용해 WAS 서버의 부하를 줄일 수 있는 로드 밸런서로 활용되기도 한다.

Thread 기반 프로그래밍
Thread 기반 어플리케이션은 기본적으로 hardware에서 작업을 분할한다. 각 작업에는 자체 Thread가 있으며, 필요한 경우 차단되므로 CPU는 해당 일시 중단하고 대기중인 다른 Thread를 실행한다. 이런 컨텍스트 스위치가 사용될 때마다 약 2mb의 큰 데이터를 이동하는 등의 작업이 실행된다.
* 컨텍스트 스위치
멀티 프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때, 기존의 프로세스의 상태 또는 레지스터 값(Context)를 저장하고 CPU가 다음 프로세스를 수행하도록 새로운 프로세스의 상태 또는 레지스터 값(Context)를 교체하는 작업이다.
(하던 일 저장하고 다음 일하는 것?)

Event-Driven Programming
이벤트 기반 어플리케이션은 콜백, 이벤트 루프 및 대기열을 사용해 작업을 나눈다. 작업의 단위 또는 task는 콜백을 뜻한다. 한 번에 한 번의 콜백만이 실행된다. 언제 다 끝났는지 결정하고 나서 다른 함수에게 효과적으로 통제권을 넘겨준다.