이번에 주제는 Nginx 입니다.
1. Nginx란
Nginx는 높은 성능과 안정성으로 현재 가장 많이 사용되고 있는 웹 서버입니다. Apache(아파치)와 비교했을 때 더 빠르고 가벼우며 대규모 어플리케이션 처리에 적합하다는 장점이 있습니다.
여기서 웹 서버란 클라이언트 요청에 따라 HTML, CSS, JS 같은 정적인 파일을 응답해 제공하는 소프트웨어 입니다. 웹 서버는 HTTP 프로토콜을 사용해 클라이언트와 통신합니다.
WAS(Web Application Server)란 것도 존재하는데 WAS의 경우 동일하게 클라이언트의 요청을 처리하지만 동적인 요청을 처리 하고 애플리케이션 로직을 실행할 수 있도록 구성되었다는 점에서 웹 서버와 차이점이 있습니다.
예를 들어 Database CRUD, 회원가입 , 트랜잭션 관리, 보안, 로깅 등의 로직을 처리할 수 있습니다.
보통 웹 서비스는 클라이언트 => Web Server => WAS => DB 순으로 요청을 보내고
DB => WAS => 웹 서버 => 클라이언트 순으로 응답을 전송합니다.
2. 왜 Web Server 인가?
1. WAS에 부담을 줄이기 위해 사용합니다. WAS가 모든 작업을 처리하게 되면 작업량이 너무 많아지게 됩니다. 그래서 HTML, CSS, JS 등 정적인 요청에 대한 응답을 웹 서버에게 위임해 WAS의 작업 부담을 줄입니다.
2. 보안 기능을 제공할 수 있습니다. 웹 서버는 SSL/TLS 프로토콜을 사용해 데이터를 암호화하고 액세스 제어, 웹 방화벽 등의 보안 기능을 제공해 웹 사이트를 보호할 수 있습니다.
SSL:보안 소켓 계층(Secure Socket Layer) : 웹 페이지와 브라우저 사이(또는 두 서버 사이)에 전송되는 데이터를 암호화해 인터넷 연결을 보호하기 위한 표준 기술입니다.
TLS:전송 계층 보안(Tranport Layer Security) : SSL의 후속 버전으로 더 강력하고 안전한 프로토콜입니다. 현재의 웹 보안에서는 주로 TLS가 사용되고 있습니다.
SSl/TLS 를 사용하는 웹사이트 URL은 HTTP 대신 HTTPS가 사용된다.
3. 이벤트 기반, 단일 스레드, 스레드 풀 등의 방식으로 대부분 비동기 처리 방식을 사용해 높은 성능을 제공합니다.
3. 왜 Nginx 인가?
1. Nginx는 이벤트 기반 비동기 I/O 방식을 사용하여 높은 성능을 제공합니다. 이를 바탕으로 대규모 웹 사이트에서도 빠른 응답 시간을 보당하고 적은 메모리 사용량으로 높은 성능을 제공해 서버 운용 비용을 절감할 수 있습니다.
2. 리버스 프록시(Reverse Proxy) 사용 가능
프록시(Proxy)란 인터넷 접속을 할 때 보안상의 문제로 직접 통신을 주고 받을 수 없을 대 그 사이의 중재인으로써 통신을 수행하는 기능을 말합니다. 프록시는 포워드 프록시, 리버스 프록시로 구분됩니다.
포워드 프록시는 클라이언트와 인터넷 사이에 있는 영역을 말합니다. 클라이언트가 데이터를 요청하면 포워드 프록시가 이를 받아 서버에게 전달 후 서버의 응답을 받아 클라이언트에게 전달합니다.
포워드 프록시를 사용하면 클라이언트의 IP 주소가 웹 서버에 노출되지 않습니다. 따라서 클라이언트의 위치나 신원을 식별하는 것이 어려워 보안이 강화되고 특정 IP 주소 또는 도메인, URL 에 대해 접근 제어를 수행할 수 있습니다.
출처 : https://www.cloudflare.com/ko-kr/learning/cdn/glossary/reverse-proxy/
리버스 프록시는 인터넷과 서버 사이 영역에 위치해 클라이언트의 요청을 가로채 대신 전송합니다
출처 : https://www.cloudflare.com/ko-kr/learning/cdn/glossary/reverse-proxy/
최종 적으로 프록시는 어떤 클라이언트도 원본 서버와 직접 통신하지 못 하도록 합니다.
3. 캐싱 서버로 이용할 수 있습니다. 캐싱 서버란 클라이언트가 이전과 동일한 요청을 할 경우 캐시 서버에서 가져와 클라이언트에게 전송함으로써 사이트의 접속 속도를 향상시킵니다.
4. 동작 방식
1. Nginx는 실제 동작을 수행할 worker Processer와 worker Process을 생성하는 master Processor 이루어졌습니다.
master Processor는 Configuration File을 읽고 실행하기 때문에 웹 서버의 동작을 설정하기 위해선 Configuration File을 수정하면 됩니다. 여기서 Configuration File은 nginx.conf 파일 입니다.
- master Process : configuration file을 읽고 실행하며 worker process 들을 관리한다.
- worker process : User Request에 대한 실제 작업을 수행한다.
2. 초창기에는 nginx + Apache를 연동해 앞단에서 각각 동작, 정적 요청을 처리했습니다.
3. Worker Processor 생성 → Listen Socket 생성 → Client Request → Connection 생성 → Event가 없으면 새로운 커넥션을 형성 OR 다른 Event를 받아옵니다. 여기서 Event란 nginx에서 connection에 관한 요청입니다.
4. 이벤트는 OS Kernel이 Queue 형태로 worker Process에 전달하여 비동기로 처리합니다.
5. 오래 걸리는 작업에 대해서는 스레드 풀을 생성해 전달합니다.
5. Nginx 설치
설치 경로 : https://nginx.org/en/download.html
Nginx를 다운로드 후 윈도우 터미널창에서 설치 경로로 이동해 Nginx 를 입력해 Nginx를 실행한다.
Error Cause!
nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: an attempt was made to access a socket in a way forbidden by its access permissions)
해당 에러는 이미 80번 포트가 사용중이라는 메시지다.
다음 명령어를 입력해 포트가 사용중인지 확인해 본다.
netstat -ano | find "80"
실제로 현재 80번 포트가 사용 중 이다. 작성자의 경우 이전에 Tomcat을 사용한적이 있어 이로 인해 발생한 문제인거 같다.
다음 명령어를 입력해 해당 포트 종료를 시도 해보자. PID 뒤 숫자는 netstat 명령어를 입력해서 나온 PID로 입력해준다.
taskkill /F /PID 4
권한이 거부되어 구글링해 본 결과 윈도우 터미널을 관리자 모드로 실행 후 시도하면 삭제된다고 해서 해봤지만 여전히 똑같은 에러가 발생한다.
또 다른 방법을 찾던 중 다음 명령어를 찾았다.
NET Stop HTTP
다시 Nginx 설치 경로로 이동해 Nginx를 실행했더니 잘 작동했다!
이제 URL 검색창에 localhost를 입력해 다음 창이 출력되면 잘 실행중이란 뜻이다
'BACK END' 카테고리의 다른 글
Docker + Node.js + Nginx 1 (0) | 2023.12.10 |
---|---|
Node.js Multer (2) | 2023.12.10 |
HTTP multipart/form-data (1) | 2023.12.10 |
Nginx와 Node.js 쿵짝쿵짝 환경 구축하기 (0) | 2023.12.10 |
Android Studio MySQL 연동 1 (1) | 2023.12.08 |