Published on

NGINX 요약 정리

Authors
  • avatar
    Name
    JaeHyeok CHOI
    Twitter
    none

NGINX

미국에서 운영중인 오픈소스 웹 서버 프로그램(WAS - Web Application Server). HTTP와 리버스 프록시, IMAP/POP3 등의 서버 구동이 가능하며, Java 서블릿은 대개 Apache의 Tomcat을 연동해서 구동하고, PHP의 경우 PHP-FPM을 연동해서 구동한다.

기능

HTTP, HTTP/2, HTTP/3 을 지원한다.

구조적으로는 Apache HTTPd에서 사용하는 요청당 스레드 혹은 프로세스 기반의 구조 대신, 비동기 이벤트 기반의 구조로 동작한다. 이로 인해서 서버 부하시 성능 예측이 쉽다. 덤으로 10,000개의 동시 접속을 하면, 그 10,000개에 드는 메모리 점유는 평균 2.5MB이다. 리눅스 기반으로 구축하는 웹 서버의 경우, 기존의 LAMP (Linux + Apache + MySQL/MariaDB + PHP/Python/Perl)에서 Apache 대신 Nginx 로 대체된다. NGINX는 여러 서드 파티 기능(TLS, GeoIP)을 모듈로 쓰고 있으며, 그래서 필요하지 않을 경우 모듈을 제외해 놓을 수 있다. 단, 완성된 바이너리를 사용하지 않고 소스를 컴파일해서 사용할 때는, 사용할 모듈을 컴파일할 당시에 추가하지 않으면 그 이후에 추가할 수는 없다. 아파치처럼 NGINX도 사용할 때 환경 설정을 바꾸고 나서 서버 데몬을 재시작할 필요없이 reload 시그널을 보내면 된다. 즉, 프로세스를 재시작할 필요가 없다는 장점이 있다는 것이다.

WAS (Web Application Server)? WAS는 클라이언트 요청에 대해 동적인 처리를 담당하는 영역이다. 웹 서버와 달리 애플리케이션 로직을 실행할 수 있도록 구성되어 있다. 예) 회원가입/로그인 등의 로직을 처리하는 영역이 WAS. 또한, DB 연동, 트랜잭션 관리, 보안, 로깅 등의 기능도 제공한다. 이를 통해 웹 애플리케이션의 안정성과 성능을 향상시키며, 개발자들은 애플리케이션 개발에 집중할 수 있다. 대표적인 WAS로는 Tomcat, Node.js(얘는 웹서버 WAS 둘 다 사용 가능하다.)

Nginx를 사용하는 이유

  1. 높은 성능과 적은 메모리 사용

  2. 리버스 프록시 사용 가능

    리버스 프록시는 인터넷과 백엔드 그 사이에 있는 서버 영역이다. 여러 서버로 각 요청에 대한 서버로의 라우팅(?)을 가능하게 한다. 이를 로드 밸런싱이라고 한다. 또한 이렇게 프록시를 사용하면 클라이언트의 IP 주소가 웹 서버에 노출되지 않아 클라이언트의 위치나 신원을 식별하는 것이 어려워져 보안이 강화된다. 또한 캐싱서버로도 이용이 가능한데, 동일한 요청에 대해서 캐시 서버에서 데이터를 가져와 클라이언트에게 전달하며, 이를 통하여 미디어 스트리밍 서버로도 활용이 가능하다.

  3. SSL 지원

    Secure Sockets Layer 은 웹 사이트와 사용자 간의 통신을 암호화하고 보안을 유지하는데 사용되는 프로토콜이다. SSL은 HTTPS로 알려진 보안 HTTP 프로토콜의 기반 기술이다.

    HTTPS는 HTTP 프로토콜의 암호화된 버전이다. SSL 프로토콜을 사용해 웹 서버와 클라이언트 간에 보안 연결을 설정하고, SSL 인증서를 사용하여 서버의 신원을 인증한다. 이를 통해 중간자 공격과 같은 보안 위협을 방지하고, 사용자의 개인 정보와 웹 사이트의 기밀 정보를 보호할 수 있다.

    Nginx는 HTTPS 인증서를 제공해 줄 수 있다.

  4. 데이터 압축

    클라이언트가 보내는 요청이 text 일 경우, gzip을 사용해 해당 데이터를 압축시킬 수 있다.

  5. 비동기 처리

    이벤트 루프 방식을 사용하여 높은 성능을 제공한다. 이를 통해 동시에 여러 요청이 들어왔을 때도 많은 트래픽을 동시에 처리하여 빠른 응답 시간을 보장한다.

NGINX 사용해보기

Nginx를 우선 설치해준다. 해당 퍼블릭 IP 주소로 접속하여 Nginx 페이지가 나온다면 정상적으로 완료된 것이다.

Nginx Proxy Server 설정

/etc/nginx/sites-enabled → default 파일 수정

server {
	listen 80;
	server_name XXXXX.example.com;
	
	client_max_body_size 20M;
	
	location {
		proxy_pass http://127.0.0.1:8000;
	}
}

HTTP: 80

HTTPS: 443

사용자가 Nginx 서버로 요청을 한다. → Nginx가 80번 포트로 접속을 하면 443 포트로 리다이렉트시켜 WAS에게 전달한다. → HTTP 접속을 HTTPS 접속으로 변경해줌

클라이언트가 XXXXX.example.com 경로로 요청하면 현재 서버에서 실행되고 있는 http://127.0.0.1:8000으로 클라이언트 요청을 대신 보내준다. 그러면 사용자는 실제로 http://127.0.0.1:8000로 요청하지는 않았으나, http://127.0.0.1:8000에 요청한 것과 동일한 효과가 발생한다.