Nginx 란?

Nginx 란 러시아의 이고르 시쇼브란 개발자가 Apache 의 C10K Problem (하나의 웹서버에 10,000개의 클라이언트의 접속을 동시에 다룰 수 있는 기술적인 문제) 을 해결하기 위해 Event-Driven 구조로 만든 오픈 소스 소프트웨어다.


Apache 와의 차이점

Apache

Client가 HTTP 요청을 보낼 때, Apache는 MPM (Multi Processing Module) 을 사용하여 처리한다.


1. Prefork 방식 (멀티 프로세스 방식)

자식 프로세스를 미리 생성해두고 클라이언트 요청에 하나에 대해 한 프로세스가 담당한다.

따라서 한 자식 프로세스가 알 수 없는 원인으로 정지하더라도 다른 자식 프로세스에 영향을 주지 않는다.

자식 프로세스의 수는 최대 1024 개다.

프로세스 당 한 개의 스레드만 존재하기 때문에 스레드간 메모리 공유를 하지 않아서 안정적인 대신에 메모리 사용량이 많다.

시작 시 생성한 프로세스의 수보다 요청이 많아지면 실행 중인 프로세스를 복제하여 실행한다. 이 때, 메모리 영역까지 같이 복제된다.


2. Worker 방식 (멀티 프로세스 & 멀티 스레드 방식)

자식 프로세스마다 멀티 스레드로 실행하며 각 클라이언트의 요청을 스레드가 처리한다.

하나의 프로세스가 여러 요청을 담당하며 Prefork 와 비교해서 시작 프로세스 수를 줄일 수 있다.

스레드 간 메모리를 공유하기 때문에 메모리 사용량이 적다.

한 프로세스 당 최대 64 개의 스레드 처리가 가능하다.


Apache 한계

Apache는 접속마다 Process 또는 Thread를 생성하는 구조이다.

동시 접속 요청이 10,000 개라면 그 만큼 Process or Thread 생성 비용이 들 것이고 대용량 요청을 처리할 수 있는 웹서버로서의 한계를 드러내게 된다.


Nginx

Nginx 는 Event-Driven 방식으로 동작한다.

한 개 또는 고정된 프로세스만 생성 하고, 그 프로세스 내부에서 비 동기 방식으로 효율적으로 작업들을 처리한다.

따라서 동시 접속 요청이 많아도 Process 또는 Thread 생성 비용이 존재하지 않는다.

Event-Driven 방식에선 작업을 하다 I/O, socket read/write 등 CPU가 관여하지 않는 작업이 시작되면 기다리지 않고 바로 다른 작업을 수행한다.


Config

Nginx 블록

server {
    root /home/a;

    location / {
        root /home/b;
        index main.html;
    }
}

server 블록에 root 정의해두면 하위 블록에 전부 적용된다.

location 블록에 root 를 재정의하면 location 블록에 있는게 우선시된다.

위 nginx 서버에 접근하면 /home/b/main.html 파일을 연다.


error_page 설정

server {
    location / {
        error_page 404 main.html;
        ..
    }
}

www.a.com 에 접속했을 때 파일을 찾지 못해 404 에러가 발생하면 www.a.com/main.html 로 URL 을 이동시켜준다.


error_page 커스터마이징

server {
    location / {
        error_page 404 main.html;
    }

    location /main.html {
        root /home/c;
    }
}

error_page 로 이동시킬 때 location 블록으로 다시 root 경로를 설정해 줄 수 있다.

www.a.com/main.html URL 로 이동할 때 띄우는 html 경로를 강제로 지정할 수 있다.

위 예시에서는 /home/c/main.html 페이지를 띄워준다. (URL 에 맞는 html 파일로 이동)


Reverse Proxy 설정

server {
    server_name aa.bb.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        error_page 404 502 main.html;
    }
}

aa.bb.com 도메인에 접근하면 http://127.0.0.1:8080 로 연결해준다.

404 나 502 에러가 발생하면 aa.bb.com/main.html URL 로 이동시킨다.


명령어

nginx 디렉토리로 가서 명령어 타이핑 (권한이 필요하면 sudo)

# nginx 시작
$ ./nginx

# nginx 중지
$ ./nginx -s stop

# nginx 재시작
$ ./nginx -s reload


Reference


'공부 > Server' 카테고리의 다른 글

RabbitMQ  (0) 2020.11.09
Forward Proxy, Reverse Proxy 정의와 차이점  (2) 2020.05.21

Proxy

프록시 서버는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 컴퓨터 시스템이나 응용 프로그램을 가리킨다.

서버와 클라이언트 사이에 중계기로서 대리로 통신을 수행하는 것을 가리켜 '프록시', 그 중계 기능을 하는 것을 프록시 서버라고 부른다.

프록시 서버 중 일부는 프록시 서버에 요청된 내용들을 캐시를 이용하여 저장해 둔다.

프록시는 크게 Forward ProxyReverse Proxy 로 나뉜다.


Forward Proxy

클라이언트(사용자)가 인터넷에 직접 접근하는게 아니라 포워드 프록시 서버가 요청을 받고 인터넷에 연결하여 결과를 클라이언트에 전달 (forward) 해준다.

프록시 서버는 Cache 를 사용하여 자주 사용하는 데이터라면 요청을 보내지 않고 캐시에서 가져올 수 있기 때문에 성능 향상이 가능하다.


Reverse Proxy

클라이언트가 인터넷에 데이터를 요청하면 리버스 프록시가 이 요청을 받아 내부 서버에서 데이터를 받은 후 클라이언트에 전달한다.

클라이언트는 내부 서버에 대한 정보를 알 필요 없이 리버스 프록시에만 요청하면 된다.

내부 서버 (WAS) 에 직접적으로 접근한다면 DB 에 접근이 가능하기 때문에 중간에 리버스 프록시를 두고 클라이언트와 내부 서버 사이의 통신을 담당한다.

또한 내부 서버에 대한 설정으로 로드 밸런싱(Load Balancing) 이나 서버 확장 등에 유리하다.


차이점

1. End Point

Forward Proxy 는 클라이언트가 요청하는 End Point 가 실제 서버 도메인이고 프록시는 둘 사이의 통신을 담당해준다.

Reverse Proxy 는 클라이언트가 요청하는 End Point 가 프록시 서버의 도메인이고 실제 서버의 정보는 알 수 없다.


2. 감춰지는 대상

Forward Proxy 는 클라이언트가 감춰진다.

요청 받는 서버는 포워드 프록시 서버를 통해서 요청을 받기 때문에 클라이언트의 정보를 알 수 없다.

Reverse Proxy 는 반대로 서버가 감춰진다.

클라이언트는 리버스 프록시 서버에게 요청하기 때문에 실제 서버의 정보를 알 수가 없다.


Reference

'공부 > Server' 카테고리의 다른 글

RabbitMQ  (0) 2020.11.09
Nginx  (0) 2020.05.21

Git Directory 이름 변경

Algorithm repo 에서 디렉토리 이름을 변경할 필요가 생겼습니다.


별거 아닌 이유지만 boj -> BOJ 로 leetcode -> LeetCode 로 변경하고 싶었습니다.


우선 Github 에서 디렉토리 이름을 변경하는 방법을 검색했습니다.


  1. 이름을 변경하려는 디렉토리의 상위로 이동
  2. git mv oldName newName 입력
  3. git add git commit 하면 반영



그런데 막상 사용하려니 문제점이 하나 있었습니다.


바로 대소문자를 구분하지 않는다 는 점


$ git mv boj BOJ
fatal: bad source, source=boj, destination=BOJ



해결법은 단순했습니다.


다른 이름으로 변경 후 다시 변경하면 됩니다.


$ git mv boj baekjoon
$ git mv baekjoon BOJ
$ git add .
$ git commit -m "Rename boj to BOJ"

[master 9f7487f] Rename boj to BOJ
 68 files changed, 0 insertions(+), 0 deletions(-)
 rename {boj => BOJ}/1005.java (100%)
 rename {boj => BOJ}/1057.java (100%)
 rename {boj => BOJ}/1074.java (100%)
 .
 .
 .
 rename {boj => BOJ}/image/5397_4.PNG (100%)


'공부 > Git' 카테고리의 다른 글

Git Merge (feat. Github)  (0) 2022.06.20
Gitmoji (for Git Commit Convention)  (0) 2022.06.18

+ Recent posts