# Nginx 선택 근거 ###### tags: `유플러스-What I learned` ### 웹 서버 - HTTP 요청을 읽어서 응답을 해주는 프로그램 - 상용으로 많이 쓰이는 웹 서버 프로그램은 크게 apache와 nginx 있음. ### Apache vs nginx #### 1. Apache - 기본적으로 2가지 방식이 있음. - Prefork MPM(Multi Processing Module) - HTTP 요청이 올 때마다 프로세스 복제해서 각각 별도 프로세스에서 해당 HTTP 요청 처리 - Worker MPM - 하나의 HTTP 연결 후, 여러 요청을 처리하기 위해 복제된 프로세스 내에서 여러 쓰레드를 생성해서 여러 HTTP 요청 - 아무래도 이런 방식은 프로세스를 생성하든 쓰레드를 생성하든 요청에 따라 뭔가를 생성해야한다. 더 좋은 방법이 없을까? #### 2. Nginx - Event Driven 방식으로 구동 - 하나의 프로세스로 동작하며, HTTP 요청을 event로 비동기식으로 처리함. - 대부분의 HTTP 응답은 결국 html 파일을 제공하는 것이므로, IO 작업. IO 작업으로 event를 포워딩하고, 요청 순이 아닌, 요청이 끝난 순으로 처리함. - HTTP 요청마다 프로세스든 쓰레드등 생성이 필요없으므로, 시스템 자원 관리에 장점이 있음. #### 결론 Apache와 nginx 중 HTML 파일 사이즈, 어떤 추가 기능을 쓰느냐 등 다양한 조건 때문에 무엇이 더 무조건 성능이 좋다고는 이야기 할 수 없음. 하지만 많은 접속자가 있을 경우, 시스템 자원 관리 효율성 때문에 Nginx가 일반적으로는 성능이 더 좋을 수 있으므로 해당 프로젝트에서는 Nginx를 사용함. ### ubuntu 컨테이너 만들어서 실습해보기 - 내부는 80, 외부는 8080으로 열어주기 / 컨테이너 이름 myos / 우분투 20.04 사용하겠다. $ sudo su $ docker run -dit -p 80:8080 --name myos ubuntu:20.04 - 컨테이너 접속하기 $ docker exec -it myos /bin/bash $ apt-get update - nginx 설치 $ apt-get install nginx=1.18.0-0ubuntu1 $ apt-get install vim - nginx conf 파일 찾아보기 $ find -name nginx.conf > ./etc/nginx/nginx.conf 이 설정 파일에 대해 완벽히 이해할 필요는 없음! 추후 참고용 - include ![](https://i.imgur.com/1lTzNKM.png) 이렇게 include 된 폴더의 파일들이 자동으로 nginx.conf의 include 명령을 통해 웹 서버에 적용 됨. - include 된 sited-enabled의 default 파일을 보자. - listen은 HTTP 요청을 받을 포트 설정 - default_server는 모든 웹서버 요청을 받는다는 의미 ![](https://i.imgur.com/7Y5Dq7I.png) - 포트 8080으로 설정해보자. ![](https://i.imgur.com/8IA1sjU.png) - 수정 했으니까 nginx 다시 켜보기 $ service nginx restart (이 명령도 확인해 봐야함.) - 현재 ip 주소로 가면 nginx 기본 index.html 파일 보임. ![](https://i.imgur.com/khrgAPW.png) - root 뒤에 어디에서 html 파일 참고하겠냐가 정의 돼 있음. ![](https://i.imgur.com/wxplv86.png) - 폴더에서 index 찾고 없으면 index.html 찾고 없으면 index.nginx-debian.htm 찾겠다. - index.nginx-debian.html을 수정해보자 - html 파일 있는 경로 가보기 $ cd /var/www/html $ vi index.nginx-debian.html ![](https://i.imgur.com/Ce0KGPK.png) ![](https://i.imgur.com/YI1YaU5.png) - blog 라는 데로 리다이렉트 보내고 싶어. - $ cd /var/www - $ cd html - $ cp index.nginx-debian.html ../blog/index.html - $ cd blog - $ vi index.html - Welcome to Blog로 바꿔주기 - sites-enabled default 파일도 수정 (location) ![](https://i.imgur.com/HsMidWS.png) - localhost/blog/ ![](https://i.imgur.com/pT3ZQxA.png) # nginx reverse proxy ### Proxy Server - 원래 클라이언트와 서버가 통신을 함. - 여기에 중간에 있으면서 뭔가 다른 곳으로 연결한다든지 하는 역할 - 클라이언트가 자신을 통해 `다른 네트워크 서비스에 접속`하게 해줄 수 있는 서버 ### Forward Proxy란 ![](https://i.imgur.com/KdB1VNc.png) - 중국은 Forward Proxy 서버가 있어서 중국 내 모든 사용자의 접속을 다 받아서, 국외 인터넷 접속을 제어함. 이렇게 중간에 있으면서 어디로 가는 거 막아주는 역할도 할 수 있음. - 클라이언트가 외부 인터넷에 직접 접근하는 것이 아니라, - 클라이언트가 Proxy 서버에 외부 인터넷 접근 요청을 하고, - Proxy Server가 외부 인터넷에 대신 접속하여 결과를 받은 후, 클라이언트에 전달하는 서버 ![](https://i.imgur.com/cxs5lFM.png) - 꼭 나쁜 건 아닌게, 아프리카에서 한국서버 접속하려는데 너무 느리다 => 클라이언트가 자주 접속하는 외부 인터넷 서비스를 캐쉬로 저장해서 성능향상 가능 ### Reverse Proxy란 - 클라이언트가 Reverse Proxy에 요청하면, Reverse Proxy가 관련 요청에 따라 적절한 내부 서버에 접속하여, 결과를 받은 후, 클라이언트에 전달. #### 예시1 : 트래픽 몰릴 때 분산 ![](https://i.imgur.com/kTBbe5u.png) #### 예시2 : 적절한 서버로 이동 ![](https://i.imgur.com/5XFkHq8.png) - 즉, 서버를 여러대 두고, 클라이언트가 요청하면 `적절한 서버로 분산`해주는 기능 - 내부 데이터베이스 등의 직접 접속등을 허용하지 않을 수 있으므로 보안에도 유익함. - 요청 트래픽을 관리할 수 있는 로드 밸런싱 등에도 유익함. ### Forward와 Reverse 차이가 뭐냐? Reverse는 목적지 서버 내부를 한번 거쳤다가 출발지 서버로 해당 내용을 보내주는 거고 (그러니까 `사용자는 목적지 서버랑 직접 접속은 못하는 거!`) Forward는 경유지 느낌으로 목적지 서버 가는거!