개발자 면접, 프로그래머 면접을 볼 때 자주 물어보는 nginx 라는 것에 대해서 이번에 알아보도록 하겠습니다.

nginx란?

트래픽이 많은 웹사이트를 위해 확장성을 위해 설계한 비동기 이벤트 기반구조의 웹서버 소프트웨어입니다.

일명,

더 적은 자원으로 더 빠르게 서비스

를 하는 SW로 알려져 있습니다. 이 프로그램은 가벼움과 높은 성능을 목표로 만들어 졌으며, 러시아의 프로그래머,이고르 시쇼브가 Apache의 C10K Problem(하나의 웹서버에 10,000개의 클라이언트의 접속을 동시에 다룰 수 있는 기술적인 문제)를 해결하기 위해 만든 Event-driven구조의 HTTP, Reverser Proxy, IMAP/POP PROXY server를 제공하는오픈소스 서버 프로그램입니다.

Apache 와 nginx의 비교

 

오른쪽 출처 : https://news.netcraft.com/

주로 nginx는 Apache와 비교를 많이 당합니다. 예전에는 Apache서버를 많이 썼습니다만.. 지금은 다릅니다.

한눈에 봐도 Apache는 하락세, nginx는 상승세라는게 보입니다.

2018년 5월 기준, nginx는 23%, Apache는 25%를 차지합니다.

Apache

- 쓰레드 / 프로세스 기반 구조로 요청 하나당 쓰레드 하나가 처리하는 구조

- 사용자가 많으면 많은 쓰레드 생성, 메모리 및 CPU 낭비가 심함

- 하나의 쓰레드 : 하나의 클라이언트 라는 구조

nginx

- 비동기 Event-Driven 기반 구조.

- 다수의 연결을 효과적으로 처리가능.

- 대부분의 코어 모듈이 Apache보다 적은 리소스로 더 빠르게 동작가능

- 더 작은 쓰레드로 클라이언트의 요청들을 처리가능

쓰레드와 Event-driven

 

쓰레드 방식

Event-driven 방식

이렇게 쓰레드 기반은 하나의 커넥션당 하나의 쓰레드를 잡아 먹지만 이벤트 드라이븐방식은 여러개의 커넥션을 몽땅 다 Event Handler를 통해 비동기 방식으로 처리해 먼저 처리되는 것부터 로직이 진행되게끔 합니다. 이것과 관한 비동기 방식과 이벤트 드라이븐 방식은 아래 글을 참고 하면 됩니다.

https://jhc9639.blog.me/221108496101?Redirect=Log&from=postView

[node.js]readdir과 readdirSync 성능비교와 비동기 그리고 동기

저는 지금까지 node.js에서는 "비동기함수"만을 쓰는 것이 좋다고 알고 있었는데 왜 그런지에 대해선 잘 몰...

jhc9639.blog.me

nginx의 활용

Apache도 나름 좋은 점이 있지만 서버의 자원 활용도 능력으로 보면 nginx가 좋습니다. 한 개의 커넥션당 하나의 쓰레드는.. 자원을 너무 많이 잡아먹습니다. 위 글을 보면 nginx도 비동기.. node.js도 비동기 네요.. 어라? 둘이 짝짜꿍하면 뭔가 좋은게 탄생할 거 같은 느낌이..

맞습니다. BAM!하고 터져나옵니다.

NODE.JS의 창시자, 라이언 달은

"You just may be hacked when some yet-unknown buffer overflow is discovered. Not that that couldn't happen behind nginx, but somehow having a proxy in front makes me happy".

이런 말을 하면서 nginx를 프록시서버로 앞단에 놓고 node.js를 뒤쪽에 놓는게 버퍼 오버플로우 취약점에 의한 공격을 어느정도 방지한다고 하였습니다. 익명의 사용자의 직접적인 Web Server로의 접근을 차단하고 간접적으로 한 단계를 더 거침으로써 보안적인 부분을 처리할 수 있다는 것입니다.

버퍼 오버플로우 : 버퍼는 보통 데이타가 저장되는 메모리 공간을 뜻하는데 메모리 공간을 벗어나는 경우 오버플로우가 되고 이 때 사용되지 않아야 할 영역에 데이터가 덮어씌워져 주소, 값을 바꾸는 공격입니다.

버퍼 오버플로우로 인한 큰 이슈 : 하트블리드사태

즉, 실제포트를 숨기고 nginx의 80포트를 통해서 프록시하면 보안적으로 막을 수 있다는 것인데 이것 말고도 정적자료에 대한 gzip압축, 그리고 앞단에서의 로그를 저장할 수 있습니다. 이것보다 더 많은 기능이 있지만 제가 사용했던 것만 설명하자면 다음과 같습니다.

nginx 와 node.js를 이용한 프록시서버 만들기

그렇다면 어떻게 nginx를 이용해서 저렇게 프록시 서버를 만들어서 앞단에 위치 할 수 있을까요? 방법은 간단합니다. 먼저 nginx를 깔고..

저기 보이는 nginx.conf 파일을 열어서

server { listen 81; server_name localhost; location / { proxy_pass http://127.0.0.1:3000/; } }

이렇게 서버부분을 바꿔주시면 됩니다. proxy_pass하고 저런식으로 어떤 서버로 포워딩 될 건지를 적어줍니다.

그렇게 한 후.. nginx를 실행시켜줍시다. 그리고..

간단하게 node.js로 서버를 만들어 줍니다.

var express = require('express') var app = express(); app.get('/', (req,res)=>{ res.send("3000번 서버입니다.") }) app.listen(3000, ()=>{ console.log(3000); })

3000번포트로 실행되는 간단한 서버입니다.

짜잔..! 분명 81번 포트로 접속을 했는데 3000번포트에 열린 서버로 접속이 됬네요? 이렇게 앞단에 nginx를 둘 수 있습니다.

이외에도

명령어는 다음과 같습니다.

nginx 명령어 재시작 sudo service nginx reload # 또는.. sudo service nginx restart # 또는.. sudo /etc/init.d/nginx restart

Backend-service 에 대해 max fails, fail timeout시 백업 서버로 진입할 수 있도록 처리가 가능하다고 합니다.

nginx를 사용하는 곳

정말 많습니다.

 

 

 

 

넷플릭스, 워드프레스, 깃헙, Heroku, CloudFlare, 카카오톡 공지사항 서버, 네이버 첫페이지, G마켓, 나무위키, 오픈위키 등이 사용합니다. 네이버의 경우, Apache에서 Nginx로 갈아타며 TPS 3배증가, 서버 대수 1/3으로 감소 Nginx 장애 0건으로 엄청난 이득을 보았다고 합니다. 관련내용은 슬라이드쉐어에 공유 되어 있습니다.

 

 

 

출처 : m.blog.naver.com/jhc9639/220967352282

 

+ Recent posts