안녕하세요, 오늘은 NginX 에 대해 정리해보았습니다.
💡 아파치는 오픈 소스 웹 서버중 하나이다. 다양한 운영 체제에서 동작하며 **안정성, 확장성, 모듈화**로 널리 사용된다. SSL, 가상 호스팅 등 기능 제공으로 **웹 호스팅에 적합하며, 로드 밸런싱, 보안 기능**도 갖추고 있습니다.APACHE SERVER



💡 Apache Server는 Web Server이다. 즉, Web 통신 방법인 HTTP를 사용한다.APACHE SERVER의 구조
Request가 들어오면 Connection을 위해 Process를 생성한다.

새로운 요청이 들어올 때 마다 새로운 프로세스를 만든다.

PREFORK 방식
- Process를 생성하는것은 무거운 작업이다.
- 미리 Process를 만들어놓는 PREFORK 방식 사용.
- 만약, 만들어진 Process가 모두 할당되면 추가 생성

확장성
- 위와같은 Apacher Server의 구조는 개발하기 쉽다는 장점이 있다.
- 개발자는 다양한 모듈을 만들어서 서버에 빠르게 기능을 추가할 수 있다.
- 즉, 확장성을 가지고 있다.
- Apache Server는 동적 컨텐츠까지 처리할 수 있게 되었다.
- 확장성 덕분에 Request, Response 모든 과정을 하나의 서버에서 처리할 수 있게 되었다.

Apache Server가 인기를 얻은 비결.
Apacher Server는 출시된지 1년도 되지 않은 시점에 세계 점유율 1위의 Server가 되었다.
💡 1999년은 Internet Traffic이 지속적으로 증가하는 상황에 놓였다. 점점 Traffic이 증가함에 따라서 기존 Server는 감당하지 못하기 시작했고 Server에 문제가 발생하기 시작한다.1999년



C10K 문제는 하드웨어 문제가 아니다.
문제는 Web SERVER의 구조(점유율 1위인 Apache Server 포함)
Apache Server가 장점으로 가지고있던 확장성은 Process가 차지하는 리소스의 양을 늘리게됨
많은 Connection에서 요청이 들어오면 CPU는 컨텍스트 스위칭을 하며 프로세스를 바꾸며 일한다.

정리하자면 많은 동시 커넥션을 감당하고자 한다면 Apache Server는 적합하지 않다.
Apache Server는 이러한 문제를 해결하고자 꾸준히 성능 개선이 이루어지고 있다.
하지만, 이 시기부터 새로 만들어진 서버들은 기존의 Web Server와 다른 구조를 채택하였다.
💡 Apache Server를 보완하기 위한 소프트웨어인 Nginx가 등장한 년도 기존의 Server들과는 다른 구조를 채택하였다.2004년


동적 파일요청을 받았을 경우에만 Apache Server와 Connection을 형성한다.
NginX는 어떤 구조를 채택하여서 수많은 동시 커넥션을 유지할 수 있을까?
💡 NginX와 Apache Server는 **만들어지는 프로세스 수**에 대한 차이가 있다.NginX 구조


Request가 NginX로 들어온 후
Worker Process가 배정받은 Listen Socket에 Request가 전달된다.
Worker Process에 Connection이 형성되어있다고 해서 하나의 Connection만 담당하지 않는다.



NginX에 기능 추가를 시도하는 경우
NginX는 직접 모듈을 만들어 확장하기 까다롭다.

💡 클라이언트의 요청을 대신 받아 적절한 서버로 전달(로드 밸런싱)하고, 서버에서 받은 응답을 클라이언트에게 반환하는 중간 서버를 **리버스 프록시 서버**라고 한다.리버스 프록시

NginX가 여러 동시 Connection을 관리하는 도중에 Server가 추가된다면?
NginX는 로드 밸런서의 역할을 수행한다.
이 모든것은 NginX가 이벤트 기반 구조이기 때문에 가능한 일이다.
💡 수많은 장점들에도 불구하고 NginX의 점유율은 그리 높지 않았다. 2007년 까지만해도 Apache는 여전히 점유율 1위 자리를 놓치지 않았고 Nginx는 순위권에도 없었다.2008년

자연스럽게 회사들은 NginX를 찾게 되었고, 특히 대기업에서 각광받게 되었다.
스마트폰의 등장 이후 NginX의 수요는 점점 증가하게 되었다.
이러한 시대에 맞게 Apache 진영에서도 MPM이란 모듈을 추가하여 성능을 개선한다.

MPM은 Apache Server를 어떤 방식으로 운영할지 선택할 수 있게 만들어주는 모듈이다.
이러한 Apache 진영의 노력에도 아직까지 성능테스트(동시 커넥션 수당 메모리 사용률
와 처리하는 초당 요청의 수) 결과 NginX가 월등히 앞서있다.
NginX가 얼마나 동시 Connection 관리를 잘 하는지 알 수 있는 부분이다.
Apache Server는 오랜기간 업데이트를 통해 다양한 OS에서 안정적이라는 장점이 있다.
NginX는 다양한 장점들이 있지만, Window에서 제대로된 성능을 발휘하지 못한다.
NginX는 기능 확장이 어렵다. 하지만 Apache Server는 쉽다.
위 내용을 통해 어떤 서버를 선택해야하는지에 도움이 되셨길 바랍니다.
NginX는 동시 Connection을 여러개 유지할 수 있다.
자원을 효율적으로 사용하여 가볍다.
추가 사용방법

위 그림과같은 구조를 만들어서 서버가 보안과 관련된 복호화 과정을 담당하지 않도록 할 수 있다.
일반적으로 NginX와 Server는 같은 네트워크 안에서 존재한다.

Advanced Load Balancer, Web Server, & Reverse Proxy - NGINX
HSTS (HTTP Strict Transport Security)
CORS 처리
TCP/UDP Connection 부하 분산
HTTP/2 지원
https://github.com/h5bp/server-configs-nginx
💡현역 개발자들이 모은 NginX 설정 템플릿 모음이다. 일반적으로 사용할 때 해당 템플릿을 사용하면 매우 유용하다. 단, 제대로된 아키텍처를 위해서라면 실제로 튜닝되어야한다.오늘의 코드카타
class Solution {
public int solution(int[] arr) {
int answer = 0;
boolean bool = true;
while (bool) {
answer++;
bool = false;
for (int i = 0; i < arr.length; i++) {
if (arr[i] >= 50 && arr[i] % 2 == 0) {
arr[i] /= 2;
bool = true;
} else if (arr[i] < 50 && arr[i] % 2 != 0) {
arr[i] = arr[i] * 2 + 1;
bool = true;
}
}
}
return answer - 1;
}
}
public class Main {
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(solution.solution(new int[]{1, 2, 3, 100, 99, 98}));
}
}
조건에 맞게 수열 변환하기