Why? Nginx

docu·2023년 4월 8일
0

항해99

목록 보기
10/15

우리는 node.js로 이미 웹서버를 개발했는데 왜 또하나 더 병행해서 써야 하나?

딱 이게 궁금했는데 이 영상에서 설명해주셨다!
[Nginx] (1/2) 도대체 뭐길래 카카오, 네이버에서 사용할까

WHAT? 무엇인가?

1) flow

프론트 <=> 웹서버 <=> WAS <=> 데이터베이스
브라우저 <=> Nginx <=> Node.js <=> MySQL

2) Web Server와 WAS(Web Application Server)의 차이

Web Server
단순히 정적 파일을 응답 (이미지, html, css, 단순 js 파일)

WAS (Web Application Server) - 현업에서는 웹서버라고도 불림
클라이언트 요청에 대해 동적인 처리가 이루어진 후 응답
동적인건 뭐야? 로그인할래 아이디패스워드 줄테니까 로그인시켜줘

Node.js는 웹서버로도 사용할 수 있고 was로도 사용할 수 있다

3)웹 서버 왜써야하는가?

  • 웹 서버 별도로 운영하는 이유는 WAS의 부담을 줄여주기 위해
    정적인 이미지같은거 주는거까지 WAS가 부담하기에는 일이 너무 많음.
    nginx같은 웹서버에 "나 일 너무 많으니까 너가 대신해줘!"

WHY? 왜써야하는가?

4) 굳이 Nginx를 사용하는 이유

1. 빠르다

3000개의 동시 요청을 했을때와 50개의 동시 요청을 했을때 메모리 사용량이 거의 비슷함
초당 요청 처리: 동접자가 많아질 수록 다른 것에 비해 처리할 수 있는게 많다. 굉장히 빠르다

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

프록시: 대리

  • 리버스 프록시: 인터넷과 백엔드 사이의 서버
  • 포워드 프록시: 클라이언트와 인터넷 사이에 있는

리버스 프록시를 사용하면 왜 좋나?

2-1 로드 밸런싱: 사용하는 앱서버가 여러대일 때 어떤 요청이오면 클라이언트1너는 얘, 2번너는 얘 이런식으로 길을 정해줌
2-2 캐싱 서버 역할: 이미지를 요청했을때 너 뒷단까지 갈 필요 없어 내가줄게~
2-3 보안: WAS가 응답할때 그 응답에는 굉장히 많은 데이터들이 들어있음. 외부에서는 어디서 이 데이터가 온건지 알 수 없게끔, 암호화 해주는 기능을 리버스프록시가 할 수 있다.
2-4 SSL을 지원: 우리사이트는 보안이 잘돼있다. 인증해. nginx가 https 인증서를 제공해 줄 수 있다.
https도 nginx를 쓰면 쉽게 설정할 수 있구나~
2-5 웹페이지 접근을 인증해준다: 로그인 정보가 올바른 정보인지 WAS에서 검증할 수 있는데 굳이 WAS에서 하지 않고 Nginx에서 해줄 수 있다. 너는 관리자야~ 너는 관리자 아니고 사용자야~
2-6 압축: 클라이언트가 보내는 내용이 텍스트타입을 압축해서 전달해줄 수 있다
2-7 이벤트루프 방식 사용: node.js도 이벤트 루프라는 녀석이 비동기로 동작하도록 해줌, 비동기 방식으로 동작을 해서 상당히 많은 트래픽을 동시에 처리할 수 있다. 10000개의 트래픽까지
등등의 기능

nginx도 비동기, Node.js도 비동기 => 둘은 환상의 조합

Nginx를 Proxy 서버로 앞단에 두고 Node.js를 뒷단에 두면, 버퍼 오버플로우 취약점에 의한 공격을 방지할 수 있다 -Node.js 창시자, 라이언 달-

버퍼 오버플로우? 버퍼(메모리: 스택과 힙이 메모리 안의 구조로 있다)는 할당돼있는 한계점이 있는데 그 한계를 넘어가면 오버플로우 된다

HOW? 어떻게 써야하는가?

완전 이해가 쏙쏙가는 그림
http로 통신하면 엔진엑스의 80번 포트에서 443포트로 redirect 시켜줌.
443에서는 노드의 5000으로 갈 수 있게 해줌
http로 접속해도 https로 접속하게 해주는 효과

sudo apt-get update
sudo apt-get upgrade -y #OS install

sudo apt-get install nginx

sudo service nginx start

cd/etc/ngins/sites-enabled
sudo rm default
sudo vi default
# 설정파일 안에 들어가서 설정 지우고 내가 만든 설정 추가

server{
	listen 80;
    server_name idu-market.shop;
    
    # access_log /var/log/nginx/reverse-access.log;
    # error_log /var/log/nginx/reverse-error.log;
    
    if ($host = idu-market.shop) {
    	return 301 https://$host$request_uri:
    }
}

server {
	listen 443 ssl: #인증서 설정을 해주겠다
    server_name idu-market.shop:
    
    # access_log /var/log/nginx/reverse-access.log;
    # error_log /var/log/nginx/reverse-error.log;
    
    location / {
    	proxy_pass http://127.0.0.1:5000; #5000번포트로 우회시켜주겠다
    }

sudo service nginx restart

생각1 : SSL 적용, cloudflare로 할 것인가 let's Encrypt로 할것인가.
let's encrypt
장점1) 무료, 인증서 갱신 자동

생각2: 어떤 사용자인지 접근 권한 인증해주는건 우리 페이지에 적용해볼만한 기능인 것 같다.

0개의 댓글