0215 TIL ☃️

looggi·2023년 2월 15일
1

TILs

목록 보기
9/114
post-thumbnail

CS

웹서버

  1. nginx란?
    Nginx는 비동기 이벤트 기반 구조의 경량화 웹서버 소프트웨어입니다. HTTP 웹서버로 활용되기도 하고, 리버스 프록시 서버로 활용되어 로드밸런서 역할을 하기도 하고 보안을 향상시켜주는 역할을 하기도 합니다.

🛸간단하게

경량 웹서버 소프트웨어
빠르고 안정적이며 신뢰도가 높음

🛸기능

요청에 맞는 정적 파일을 응답해주는 웹서버의 기능도 하고
리버스 프록시 서버로도 활용되어 WAS 서버의 부하를 줄일 수 있는 로드밸런서로써 사용되기도함

  • 리버스 프록시의 역할

    • 보안 향상
      • 모든 요청을 리버스 프록시에서 받아서 매핑되는 내부 서버로 요청을 전달하므로 외부로부터 내부 서버의 존재를 숨길 수 있음
      • SSL설정 가능
    • 로드 밸런싱: 내부 서버에 대한 정보를 가지고 있으므로 각 서버의 상태에 따라 부하를 분산시켜 요청을 전달할 수 있음
  • 메일 프록시 기능

프록시란?

직접 통신할 수 없는(ex.보안)/설계상 하지 않도록 한 두 점 사이의 통신을 중계하는 기능

프록시 서버

외부 클라이언트에서 서버로 접근시 중개자 역할을 하여 내부 서버로 접근할 수 있도록 도와주는 서버
프록시 서버에 요청된 내용들은 캐시에 저장되어 이후 같은 요청이 들어올 경우 서버까지 갈 필욕 없어 시간 및 자원을 절약할 수 있음
트래픽을 줄여 네트워크 병목현상도 방지
프록시 서버의 위치에 따라 2가지로 나눌 수 있음

  • Forward 프록시: 주로 캐싱.
    원격 서버로부터 요청된 리소스를 가져와서 요청한 사용자에게 돌려줌
  • Reverse 프록시: 주로 보안, 로드밸런싱
    https://brownbears.tistory.com/191

🛸원리

  • nginx.config 파일에 의해 동작됨
  • 이벤트 driven 구조로 동작하여 한 개 이상의 고정된 갯수의 프로세스만 생성하여 사용하고 비동기 방식으로 요청들을 동시에 처리할 수 있음 -> 속도가 빠름
  • master process와 worker process로 구성되며 master가 worker에게 일을 분배해줌
    • 효율적 분배를 위해 os에 의존적인 매커니즘을 사용함
    • worker의 수는 설정 파일에서 정의되며 정의된 프로세스 갯수와 사용가능한 cpu 코어 수에 맞게 자동으로 조정됨(보통 서버의 코어수만큼)

🛸장점

  • 설정이 대부분 지시어 값을 정하는 일로 이뤄지기때문에 비교적 간단함
  • 트래픽이 높은 웹사이트를 호스팅하는 데 가장 이상적인 웹서버-- 아파치를 능가

https://12bme.tistory.com/366
https://dkswnkk.tistory.com/513

  1. apache가 아닌 nginx를 사용한 이유?
    Nginx는 하나의 서버만으로도 효율적으로 높은 트래픽을 감당할 수 있어서 처음 배포를 해보는 상황에서 어느정도의 트래픽이 생길지 예상이 되지 않는 상황이었기때문에 Nginx를 사용했습니다.

🛸요청 응답 방식의 차이

Nginx 비동기 이벤트 기반 <---> 아파치 스레드/프로세스 기반
→ Nginx는 새로운 프로세스나 스레드를 생성하지 않아 비용이 들지 않고 적은 자원으로 효율적인 운용이 가능함 -> 단일 서버에서도 많은 연결을 처리할 수 있음

🛸비동기 이벤트 기반

하나 이상의 고정된 갯수의 프로세스만 생성
여러개의 커넥션이 모두 이벤트 핸들러를 통해 비동기식으로 처리되어 순서 없이 되는대로 처리해버림

  • os커널이 이벤트를 큐 구조로 워커에게 전달하면 이벤트는 큐에서 비동기 상태로 대기
  • 워커는 하나의 스레드로 이벤트를 꺼내서 처리하여 자원을 효율적으로 사용하고 속도가 빠름

event: 커넥션의 형성과 제거, 새로운 요청을 처리하는 것

🛸스레드/프로세스 기반

스레드 기반 방식은 커넥션: 스레드 = 1:1
요청이 없을 때 프로세스를 방치시킴.

🛸Apache HTTP server(Red Hat 배포판에서 httpd)

기타 특징: 무료 오픈 소스, 웹서버 사용량 1위, c언어로 작성됨
다중 프로토콜 지원, 가상 호스팅 지원

클라이언트로부터 받은 요청을 처리할 때 새로운 프로세스나 스레드를 생성하여 처리함.

프로세스를 생성하는 것은 시간이 오래걸려서 프로세스를 미리 만들어놓음(PREFORK)
→ 요청마다 할당해주고 없으면 새로 만듬
컴퓨터의 대중화로 요청이 증가함에따라 서버에 동시에 연결된 커넥션이 이미 많아서 새로운 커넥션을 생성하기가 어려워짐== 대용량 요청에서 한계

  • 메모리 부족: 커넥션이 연결될 때마다 프로세스를 생성
  • 무거운 프로그램: 리소스가 많이 소모됨 (확장성이 좋음= 하나의 서버에서 요청을 받고 응답을 처리하는 것을 다 할 수 있음)
  • CPU부하 증가: 많은 프로세스 -> 잦은 context switching에 따른 부하 증가

*C10K PROBLEM
클라이언트가 많아질수록 논블로킹 방식과 비순차방식이 필수가 된다.

➡️엔진엑스의 탄생!

원래는 엔진엑스가 웹서버의 역할, 아파치가 WAS의 역할을 해서 같이 사용됨 → 동적 파일 요청을 받을 때만 아파치와 커넥션을 형성함 → 부하감소

동적 컨텐츠란?

자주 변경되는 데이터 ex. 쇼핑몰의 장바구니
엔진엑스는 keep-alive 시간만큼 connection을 유지하는데 이 커넥션에서 아무 요청이 없으면 다른 커넥션을 형성하여 그 요청을 처리함

https://dkswnkk.tistory.com/513

WSGI

  1. Gunicorn을 사용한 이유?
    파이썬의 WSGI를 구현하는 HTTP서버입니다. 웹서버에서 파이썬 장고 앱을 호출하기 위해 사용했습니다. 다수의 웹프레임워크와 호환되며 구현이 간단하고 서버 리소스가 적으며 속도가 빠릅니다.

클라이언트 요청 → 웹서버(엔진엑스) → WSGI Server(구니콘) → WSGI를 지원하는 웹 어플리케이션(장고(백엔드))

: WSGI + 어플리케이션 서버 == WAS
→ WAS가 따로 없어도 동적 컨텐츠를 제공할 수 있음

🛸WSGI

웹서버 게이트웨이(=웹서버와 통신하기 위한) 인터페이스
웹서버의 요청을 서버 어플리케이션(장고)로 전달해줌

  • runserver 명령어는 장고 내장 서버 를 실행시킴 - 개발시에만 사용
  • Gunicorn: 성능과 편의성 모두 uwsgi 상향
    개발이 아니라 서버에 필요한 도구이므로 로컬 환경에 설치할 필요가 없다.
    서버환경에 구니콘을 설치한다. 터미널에서 AWS서버에 접속 후 가상환경에서 pip install gunicorn
    AWS 서버에 구니콘을 서비스로 등록해야 구니콘의 시작과 중지가 쉽고 AWS서버를 다시 켤 때 구니콘이 자동으로 실행된다. 서비스로 등록하려면 환경변수 파일과 서비스 파일을 작성해야한다.
  • uwsgi

서버란?

컴퓨터에서 실행되는 프로그램
네트워크에서 클라이언트(다른 컴퓨터나 소프트웨어)에게 서비스를 제공하는 컴퓨터
네트워크 통신을 하는 모든 서비스는 서버가 있다

  • 서버가 될 수 있는 것: 노트북/ 데스크탑
  • 서버에서 실행되는 것: 웹사이트 등의 프로그램
  • 서버의 역할
    • 원격의 다른 시스템으로 접근할 수 있게 함
    • 클라이언트의 요청을 받아 응답과 데이터를 보내줌
      • 서버와 클라어인트 구조: 클라이언트가 서버에게 요청하면 서버에서 요청을 처리해서 응답을 해주고 클라이언트에서 응답을 받아서 보여주는 구조
    • 컴퓨터 언어가 실행될 런타임을 제공
  • 서버의 종류
    • 어플리케이션 서버: 사용자가 원격으로 엑세스할 수 있는 앱을 호스팅/배포하는 서버
    • 웹 서버: 웹페이지만 배포할 수 있음
      웹서버는 별도 로직을 담고 있는게 아니라 대부분 파일을 엑세스 해서 내용을 클라이언트로 보내주는 역할을 한다. 프로그램 동작되는 것은 아니다. 웹이 초창기에는 단순하게 파일 처리 위주로 했으면 됐기 때문에 웹서버의 본연의 기능으로 충분했을 것이다. 하지만 웹이 발전하고 브라우저 기반의 서비스 내지는 사내 시스템도 많이 나오게 되었는데, 이를 위해서는 서버에서도 DB도 조회하고, 로직들이 만들어져야 했다. 이를 위해서 등장한 것이 WAS서버이다.
    • WAS: 서버상에서 로직을 수행하는 서버이다. 프로그램을 WAS에 올려서 동작 시킨다. 어플리케이션이 구동된다고는 하지만, 비중있는 로직을 넣어서 고도화된 프로그램을 동작 시키는 것은 무리가 있다. 왜냐면 클라이언트가 접속되어 있고, 클라이언트는 응답을 기다리고 있기 때문이다. 응답을 못받으면 계속 클라이언트는 연결을 유지하고 있어서 상당한 부담으로 작용한다. 연결을 유지하는 것은 자원의 한계가 있고, 한계적인 자원 환경에서 계속 접속되어 있는 것은 서버의 부하 증가 또는 응답 대기를 만들어낸다. 로직을 구현하더라도 서버에서는 최대한 빠른 시간 안에 응답을 해주는 것이 좋다. 그래서 서버에서 많은 로직은 구현하기보다는 응답을 빨리 보내주고, 클라이언트에서 구현을 해주는 것이 좋다.
    • 프록시 서버: 클라이언트와 서버의 중간에 위치하는 서버
      요청에 따라 각 서버에 맞게 라우팅을 해주거나 데이터를 전달해주는 서버
    • 메일 서버: 이메일을 수락하고 수신자에게 전자메일을 발송해주는 서버
    • 데이터베이스 서버: 데이터베이스 정보를 제공하는 서버
      *웹사이트 상에서 세션 정도에 저장되는 데이터는 보통 기록을 해둬야 하는 정보성이 아니라 상태를 저장하는 데이터 ex.로그인 여부, 현재 사용자의 계정정보
      • 세션에 저장하는 이유는 데이터가 많아서가 아니라 데이터베이스까지 연결하지 않고도 확인할 수 있게 하기 위해서이다. +빠른 속도로 알 수 있다.
      • 데이터베이스는 웹서버, WAS서버와 별도로 있기때문에 거기까지 물어보려면 데이터베이스를 연결하고, 조회해와야 한다.
        하지만 세션 변수는 대개 어플리케이션 서버 정도에 있기때문에 그 정보를 바로 알 수 있다.

https://wikidocs.net/22354
https://wikidocs.net/22357

프로그래머스 문제풀기

➡️3진법 뒤집기

for문에서 리스트 거꾸로 반복하기

profile
looooggi

0개의 댓글