Nginx

Nginx는 Asynchronous Event기반의 web server로써 적은 자원으로 높은 동시성과 성능을 목표로 만들어졌다.

Web Server란? 클라이언트로부터 HTTP 요청을 받아 정적으로 해당 파일을 HTTP를 통해 보내주는 프로그램. 반대로 WAS (Web Application Server)는 정적인 컨텐츠를 호스팅할 뿐만 아니라 동적으로 컨텐츠를 변경가능하다. WAS에는 Flask, Spring 등이 있다. 동적인 컨텐츠 변경의 해당 부분을 Web Container라고 하며 DB에 접속하고 여러 트랜잭션을 관리한다. Web Server는 동적인 요청을 Web Container로 넘긴다.

Nginx의 경우 다음의 그림과 같이 event driven으로 요청을 병렬처리한다. 클라이언트의 요청 이벤트를 reactor가 받고, handler가 이를 받아 nginx의 worker에게 넘기는 형식이다. 이에 클라이언트 연결을 효율적으로 처리 가능하지만 복잡한 처리가 필요한 요청이 있다면 queue에 쌓여서 성능이 저하될수도 있다.

Nginx의 경우에는 web server로서도 쓰이지만 reverse proxy로도 쓰인다.

Reverse Proxy란?
Forward Proxy가 클라이언트 쪽의 Proxy로 VPN이 대표적인 예시이다. 사용자의 IP가 아닌 프록시 서버의 IP를 사용하여 내부 인프라에 접근하던가 할때 사용할 수 있다. Reverse Proxy는 서버 단의 Proxy로서, 로드 밸런싱 기능을 제공하여 트래픽을 각 서버로 분산시킬 수 있고, 어떤 포트가 개방되어 있는지 숨겨 보안적인 이점도 얻을 수 있다

Nginx는 그럼 어떻게 reverse proxy로 사용할 수 있을까?

server {
    listen       81; 
    server_name  localhost;

    location / { 
        proxy_pass http://127.0.0.1:3000/;  
    }
}

다음과 같이 nginx.conf에서 listen에 원래 포트를, proxy_pass에 프록시 대상 경로를 적어준다면, 다음번에 81번 포트로 접속한다면 대신 3000번 포트에 연결됨을 알 수 있다. 그 외에도 cache등을 설정 가능한데, NGINX 문서를 참고하면 좋을거 같다.

Apache

원래 유명한 web server로서 Apache도 있다. Apache는 Thread/Process 기반으로 요청 하나당 Process 나 Thread를 하나씩 제작하여 사용자가 많으면 메모리와 CPU를 많이 쓰게 된다. Apache의 경우는 모듈이 다양하지만 이러한 이유로 nginx가 요즘은 조금 더 선호되기는 한다.

Reference

https://kanoos-stu.tistory.com/entry/Nginx
https://m.blog.naver.com/jhc9639/220967352282