코딩일상
왜 nginx를 쓰나?? 알고 쓰자?? 본문
0) 작성 이유
이 글을 쓰게 된 이유를 간단히 설명하고 본론으로 들어가고자 한다.
프로젝트를 진행하면서 다른 프로젝트들을 참고를 하다 보니 대부분 nginx를 사용을 하는 것이었다..
응?? 왜 쓰는 거지 저거를 뭐 들어는 봤는데 다사용하는데는 이유가 있을 것이라는 생각이 들었다.
사람들이 많이 쓰는 것은 다 이유가 있는 경우가 대부분이었기 때문이다.
그래서 조금 알아보니 이 nginx도 웹서버라고 한다?? 응??? 이미 저거 없어도 서버는 잘 돌아 가는데
왜 필요하지...? 생각이 들었다...
이런 생각을 하다가 멘토링 시간에 만약 어떤 기능을 발견하고 사용을 해보고 싶다면
그 기능이 탄생한 이유에 대해 먼저 파악을 해보라고 했던 말이 떠올랐다.
그래 일단 nginx 한번 알아보자 마음을 먹게 되었고 탄생 이유를 먼저 파악해 보았다.
1) nginx 탄생 배경
탄생 배경을 알기 위해서는 공식문서를 보는 게 제격이라 생각을 하여서
바로 공식문서로 가보았다. 역시 내가 원하는 답이 적혀있었다.
음.. 영어를 완벽하게 이해하지 못해서 시대에 맞는 기술을 적용(?)하여 (파파고 사용했다는 이야기) 뜻을 해석해보니
아래와 같았다.
해석 내용
이고르 시소예프는 C10K 문제를 해결하기 위해 NGINX를 작성했는데, 이는 기존 웹 서버가 동시 연결(C)의 많은 숫자(10K)를 처리하는 데 겪었던 어려움을 설명하기 위해 1999년에 만들어진 용어이다. NGINX는 이벤트 중심의 비동기식 아키텍처를 통해 고성능 콘텍스트에서 서버가 작동하는 방식에 혁명을 일으켰고 사용 가능한 가장 빠른 웹 서버가 되었습니다.
2004년 프로젝트를 오픈 소싱하고 그 사용이 기하급수적으로 증가하는 것을 지켜본 후, Sysoev는 NGINX의 지속적인 개발을 지원하고 기업 고객을 위해 설계된 추가 기능을 갖춘 상용 제품으로 마케팅하기 위해 NGINX, Inc. 를 공동 설립했다. NGINX, Inc. 는 2019년에 F5, Inc. 의 일부가 되었습니다. 오늘날 NGINX와 NGINX Plus는 수십만 개의 동시 연결을 처리할 수 있으며, 다른 어떤 서버보다 더 많은 인터넷 사용량이 많은 사이트에 전력을 공급할 수 있습니다
요약
1999년에 기술이 발전하고 대중화가 되면서 서버에 대한 요청이 기하급수적으로 늘어났고,
10,000명의 동시 사용자 연결 오류가 발생하였고, 이를 해결하기 위해서 Igor Sysoev라는 분이 만든 오픈소스라는 것이다.
결론: 수많은 요청 처리를 해결하기 위해서 만들어진 웹 서버 오픈 소스
- 웹서버란(web server란)??
- 두 가지 중 하나를 의미
- 소프트웨어 측면: 웹 브라우저와 같은 클라이언트로부터 HTTP 요청을 받고, HTML 문서와 같은 웹 페이지를 반환하는 컴퓨터 프로그램
- 하드웨어 측면:하드웨어 측면으로 보았을 때는 웹서버란 위 기능을 수행하는 물리 컴퓨터를 의미
- 두 가지 중 하나를 의미
1-1) 어떻게 그럼 어떻게 요청 문제를 해결을 한 것일까??
- Event-Driven 구조
- 한 개 또는 고정된 프로세스만 생성하고, 여러 개의 Connection을 모두 Event-Handler를 통해 비동기 방식으로 처리합니다.
- 적은 양의 스레드만 사용되기 때문에 Context Swiching 비용이 적고, CPU 소모가 적습니다.
- CPU와 관계없이 모든 I/O들을 전부 Event Listener로 미루기 때문에 흐름이 끊기지 않고 응답이 빠르게 진행되어 1개의 프로세스로 더 빠른 작업이 가능합니다. 이 덕분에 메모리를 적게 사용합니다.
- I/O
- Input/Output => 입출력을 의미한다.
- 프로세스?
- 프로세스란 실행 중인 프로그램
- 더 자세한 건 블로그 글로 작성할 예정...(공부해보니 상당히 내용이 깊다 요번엔 패스)
- 스레드(thread)?
- 스레드(thread)란 프로세스(process) 내에서 실제로 작업을 수행하는 주체를 의미합니다. 모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행합니다.
- 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 합니다.
- ex) 크롬 브라우저(=프로세스)에서 벨로그 작성하기(=스레드 1) & 유튜브로 음악 듣기(=스레드 2)
싱글 스레드 vs 멀티 스레드??멀티스레드: CPU의 최대 활용을 위해 프로그램의 둘 이상을 동시에 실행하는 기술이다.싱글 스레드:하나의 프로세스에서 오직 하나의 스레드로만 실행이렇게 만 보면 멀티스레드가 더 좋아 보이지만 각각의 장단점이 있음, 거기에 대한 것은 추후 정리 예정
멀티 프로세스두 개 이상의 다수의 프로세서(CPU)가 협력적으로 하나이상의 작업(Task)을 동시에 처리하는 것을 의미한다.(병렬 처리)
- Context Swiching
- Context: 스레드가 작업을 진행하는 동안 작업 정보(레지스터, 커널 스택, 사용자 스택 등)를 보관.
- OS가 A 작업을 진행할 때 A스레드의 Context를 읽어오며, B스레드로 전환할 때 A스레드의 Context를 저장하고 B스레드의 Context를 읽어오는 일련의 반복을 수행
- 이벤트 기반(event-driven)
- 이벤트 기반(event-driven) : 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식
Nginx Architecture
- Nginx은 하나의 Master Process와 N개의 고정된 Worker Process로 구성되어 있다.
- Master Process의 주 역할은 설정 파일을 읽거나 검증하며 Worker Process를 관리하는 역할을 수행한다.
- Worker Process에서 요청에 대한 실질적인 처리를 수행한다. Nginx는 비동기 이벤트 기반 모델을 통해서 Worker Process 간에 요청을 효율적으로 분산한다.
2) 현재 nginx를 통해 할 수 있는 것들
그렇다면 다수의 요청 처리를 잘 처리 위해서만 nginx를 써야 하나라는 생각이 들었는데
글을 더 살펴보니 nginx가 현재 지원하는 것들이 생각보다.. 엄청 다양했다.
NGINX는 웹 서비스, 역방향 프락시, 캐싱, 로드 밸런싱, 미디어 스트리밍 등을 위한 오픈 소스 소프트웨어이다.
그것은 최대의 성능과 안정성을 위해 설계된 웹 서버로 시작했다.
HTTP 서버 기능 외에도 NGINX는 이메일(IMAP, POP3, SMTP)의 프록시 서버 역할과
HTTP, TCP, UDP 서버의 역방향 프록시 및 로드 밸런서 역할도 할 수 있다.
요약: 단순히 수많은 동시 연결처리 해결뿐만 아니라 아래와 같은 기능들을 지원해준다고 한다
- reverse proxying
- caching
- load balancing
- media streaming
- ...
리버스 프락시(Reverse Proxy)
Nginx는 리버스 프락시로도 활용할 수 있습니다.
리버스 프락시란 외부 클라이언트에서 서버로 접근 시, 중간에서 중개자 역할을 하여 내부 서버로 접근할 수 있도록 도와주는 서버입니다.
리버스 프락시를 활용했을 때 얻을 수 있는 장점은 아래와 같습니다.
- 보안 : 외부 사용자로부터 내부망에 있는 서버의 존재를 숨길 수 있습니다. 모든 요청은 리버스 프록시 서버에서 받으며, 매핑되는 내부 서버로 요청을 전달합니다. 또한 Nginx는 SSL 설정도 가능합니다.
- 로드밸런싱 : 서버가 부담하는 부하를 분산해주는 장치 혹은 기술로서
- Scale up: 기존 서버의 성능을 높인다 (비용도 같이 올라간다)
- Scale out: 여러 대의 서버를 두어 트래픽을 분산시킨다.(물리적 or 논리적)
- Scale out을 하기 위해 서해야 하는 일이 로드밸런싱
- 캐싱 : Nginx를 역방향 프락시로 사용하면 미리 렌더링된 버전의 페이지를 캐시하여 페이지 로드 시간을 단축할 수 있습니다. 이 기능은 프록시 서버의 응답에서 수신한 콘텐츠를 캐싱하고 이 콘텐츠를 사용하여 매번 동일한 콘텐츠를 프록시 서버에 연결할 필요 없이 클라이언트에 응답하는 방식으로 작동합니다.
- SSL 터미네이션 : Nginx는 클라이언트와의 연결에 대한 SSL 끝점 역할을 할 수 있습니다. 수신 SSL 연결을 처리 및 해독하고 프록시 서버의 응답을 암호화합니다.
- 압축 : 프록시 서버가 압축된 응답을 보내지 않는 경우 클라이언트로 보내기 전에 응답을 압축하도록 Nginx를 구성할 수 있습니다.
- DDoS 공격 완화 : 수신 요청과 단일 IP 주소당 연결 수를 일반 사용자에게 일반적인 값으로 제한할 수 있습니다. 또한 Nginx를 사용하면 클라이언트 위치와 "User-에이전트" 및 "Referer"와 같은 요청 헤더 값을 기준으로 액세스를 차단하거나 제한할 수 있습니다
정리
위와 같은 기능과 장점을 우리가 진행하는 프로젝트에 사용되는 게 맞다고 판단을 하게 되면
사용해도 될 것 같다.
사실은 더 보아야 할 것이 많고 깊게 공부를 해보니 운영체제까지 이해를 하면 더 좋을 수도 있지만
아직은 이해가 안 가는 부분이 많아 이해를 한 부분까지만 정리를 해보았다.
혹시나 더 궁금하신 분들은 내가 이 글을 작성하면서 참고했던 레퍼런스들을
찬찬히 보셨으면 한다.
글을 쓰고 나니 아쉬운 점
단점에 대해서 파악을 아직 제대로 못했다.
이 부분에 대해서 추후 정리 후 올려 보겠다.
단점을 알아야 그 부분에 대한 보안을 하거나 대비를 할 수 있을 테니 말이다.
레퍼런스
What is NGINX? - NGINX
Explore what NGINX is and learn how this high-performance software can act as a web server, load balancer, web accelerator, and more.
www.nginx.com
Nginx 동작 방식부터 프록시, 로드밸런서까지
nginx란? Apache와 같은 웹 서버로 클라이언트로부터의 요청에 맞는 정적 파일을 응답해주는 WebServer로 사용되기도 하고, 동적인 리소스를 처리하기 위해 WAS로 요청을 전달해주기도 한다. 이러한 역
willseungh0.tistory.com
[Infra] 아파치(Apache), 톰캣(Tomcat), 엔진엑스(Nginx) 차이
웹서버 아파치(Apache), 톰캣(Tomcat), 엔진엑스(Nginx) 차이
losskatsu.github.io
싱글스레드(Single thread) vs 멀티스레드 (Multi thread)
오늘은 싱글 스레드와 멀티 스레드가 무엇인가와 이 둘의 장단점에 대해서 알아보자!!일단, 시작에 앞서 이해를 돕기 위해 이 그림을 봐주길 바란다.=> 싱글 스레드와 멀티 스레드의 차이는 이
velog.io
[Nginx] 리버스 프록시(Reverse Proxy) 개념 및 사용법
1. 개요 리버스 프록시란? 클라이언트 요청을 대신 받아 내부 서버로 전달해주는 것을 리버스 프록시(Reverse Proxy) 라고 합니다. 저도 사실 프록시라는 개념이 낯설었는데요, 일단 프록시라는 개
narup.tistory.com
[Nginx] 로드밸런싱 개념 및 구축 - 1
서버의 과부하로 인한 shutdown을 막기 위해 웹서버로 이용하고 있는 Nginx를 로드밸런서로 사용하고자 알아보았습니다. 먼저 저는 nodejs(express)로 서버가 이루어져 있고 앞단과 뒷단에 nginx를 프록
velog.io
[운영체제] 프로세스가 뭐지?
[운영체제] 프로세스가 뭐지? 목차 [운영체제] 프로세스가 뭐지? 개요 프로세스란 단어를 본적있나요? 프로세스란? 프로그램과 뭐가 다르지? 어떻게 여러 개의 프로세스가 동시에 실행될 수 있을
bowbowbow.tistory.com
'개발 공부' 카테고리의 다른 글
ANSI SQL 이란?? (0) | 2023.01.07 |
---|---|
[SQL] SQL명령어 정리(공부한 것 정리 중) (0) | 2023.01.03 |
[Git,GitHub] git기본 사용방법 및 명령어 정리 (0) | 2022.12.31 |
mongoDB 비밀번호 분실 및 변경 (0) | 2022.12.05 |
CI/CD란?? (0) | 2022.09.08 |