일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Kafka
- JPA 공부
- JPA공부
- 코테준비
- 프로그래머스
- nestjs스터디
- 플러터 개발
- nestjs공부
- JPA예제
- 코테공부
- 스프링
- 스프링부트공부
- querydsl
- 카프카
- nestjs
- 스프링공부
- 스프링 공부
- 플러터 공부
- JPA스터디
- JPA
- 기술공부
- 자바공부
- 자료구조공부
- 알고리즘공부
- 스프링부트
- Axon framework
- DDD
- 기술면접공부
- Flutter
- K8S
- Today
- Total
DevBoi
Nginx 본문
엔진엑스는 동시접속 처리에 특화된 웹 서버 프로그램이다.
아파치 보다 동작이 단순하고, 전달자 역할만 하기 때문에 동시접속 처리에 특화 되어있다.
웹 서버의 역할은?
1) 정적 컨텐츠 전달
웹서버의 역할은 HTML,Css,js이미지 와 같은 정보를 웹 브라우저에 전송하는 역할을 한다.
2)리버스 프록시
nginx.conf파일에서 location지시어를 사용하여 요청을 배분한다.
클라이언트는 가짜 서버에 요청하면, 프록시 서버가 배후 서버로 부터 데이터를 가져온다.
프록시 서버가 Nginx, 리버스 서버가 응용프로그램 서버를 의미한다.
nginx.conf
-Nginx기본동작이외, 파일 확장자의 MIME type , 가상 호스트, 리버스 프록시를 위한 설정 파일들이 포함
접속자수, 동작 프로세스 수 등 퍼포먼스에 기본적인 설정 항목을 담고있다.
user는, NGINX프로세스가 실행되는 권한, worker_processess는 Nginx프로세스 실행 가능 수
pid는 Nginx의 파스터 프로세스 id 정보가 기록된다.
user는 NGINX 프로세스 실행권한
worker_processes는 NGINX프로세스 실행 가능수
pid 는 NGINX의 마스터 프로세스 ID정보
권한 탈취에도 ssh를 비롯한 접속 및 파일 엑세스가 불가능하기때문에 위로 설정.
worker_processes는 코어 수만큼 할당
events block은 비동기 이벤트 방식의 처리 방식을 가지고있다.
worker_connections는 한 프로세스가 처리할 수 있는 커넥션수
http block은 웹서버에 대한 동작 설명이다. keepalive_timeout 옵션은 접속시 커넥션을 몇초 동안 유지할건지?
값이 높으면 불필요한 커넥션을 유지하기때문에, 낮은값 or 0이 제일 좋다
server_names_hash_bucket_size, server_names_hash_max_size는
호스트 도메인의 이름에 대한 공간을 설정하는 것으로, 이 값이 낮으면, 가상 호스트 도메인을 등록하거나
도메인 이름이 길 경우 bucket공간이 모자라 에러가 생길 수 있다.
엑세스 로그는 하나의 파일에 모든 접속 로그가 남게되어 관리가 불편, 각 가상 호스트마다 로그를 배분하는 것이 관리가 편하다
로그로 인해 최대한 디스크 엑세스를 하지 않게한다.
Nginx는 가상호스트 설정이나 반복되는 옵션항목을 include를 통해 불러올수 있다.
리버스 프록시를 각 도메인에 설정하다고 했을때 헤더 처리 옵션등을 일일히 붙여 넣고 수정하며, 효율성이 떨어진다.
include를 활용하는 것이 좋다.
Nginx를 사용하는 이유
이벤트 기반 구조?
아파치 서버랑 차이?
아파치는 request가 들어오면 process, 쓰레드를 신규생성, prefork를 사용하면 미리 프로세스를 만들어 놓고
요청에 따라 해당 프로세스를 사용할 수 있도록해준다.
점점 커넥션이 동시에 많아지면... 커넥션 생성이 ... 불가능하다
C10K -> 커넥션 만개문제
헤더의 종류중 keep-alive 타임은 한번 연결된 커넥션을 그대로 유지하기 위한 시간 지표
근데 동시 접속일때는? 무의미하다 왜냐면, 빠르게 처리하기 위해 커넥션을 재사용하는 거겠지만
keep-alive는 이렇게 다시 커넥션 생성을 하지않아도되서 빠를순있지만
동시에 많은 것에 대해서는 할수 없긔
또한 keep alive가 늘어날수록 동시 커넥션수는 많아진다
왜냐면 한번 생성된 커넥션을 사용하고있으면, 신규 커넥션을 생성해야하기 때문이다.
아파치는 프로세스를 할당하는데, 동시 처리 커넥션이 많아지면 프로세스가 많아지고
이는 메모리 부족과, 컨텍스트 스위칭, 즉 cpu가 해야할일이 너무 많아진다....
동시 커넥션에 대한 아파치 서버 구조는 적합하지 않다.
엔진엑스
엔진엑스는 마스터 프로세스와 워커 프로세스로 나뉜다.
마스터 프로세스는 설정 파일을 읽어 워커 프로세스를 생성한다.
이 워커프로세스는 지정된 listen소켓을 배정 받는다.
그 소켓에 새로운 클라이언트로 부터 요청이 오면 처리한다.
워커프로세스는 소켓하나만 담당하지 않고
새로운 커넥션 및 요청이 들어오면 이를 처리한다.
이 커넥션 형성 요청, 처리 등을 이벤트라고 엔진엑스에서는 한다.
여러개의 요청은 큐 형식으로 커널에 워커프로세스가 처리할때까지 비동기 방식으로 대기한다.
하나의 스레드로 이벤트를 꺼내서 처리해나간다.
시간이 오래걸리는 쓰레드 풀을 따로 만들어서 배정한다.
worker process는 코어수만큼 생성한다.
nginx의 단점?
()
동시 커넥션을 유지한채, 뒷단에 서버를 추가할수있다.
동적으로 설정을 변경하게 되면, master는 worker process를 새로 생성하게 되고
이전에 쓰는 프로세스는 더이상 커넥션을 생성하지 않게 한다.
그리고 모든 커넥션이 종료가 되면 해당 워커 프로세스는 종료를 시킨다.
아파치 MPM로 동시커넥션에 대한 개선을 하고, 모듈에 대한 건 아파치가 엔진엑스보다 많다.
Nginx ssl터미네이션 가능
CORS처리
TCP/UDP 커넥션 부하 분산
https://github.com/h5bp/server-configs-nginx
'Infra > [AWS]' 카테고리의 다른 글
[AWS] EKS 세팅 방법 (0) | 2023.05.12 |
---|---|
[AWS] RDS 연결하다가 죽을 뻔 쓰 (1) | 2022.12.03 |
[AWS] 일단 EC2에 테스트 API를 띄워봅시다 (1) | 2022.11.19 |
[AWS] Jenkins 설정 및 세팅 (0) | 2022.04.20 |
[AWS] AWS 웹서버 세팅 및 구축 정리 (0) | 2021.12.21 |