[Nginx] Nginx 이해하기

메린·2023년 3월 13일
0

Nginx

목록 보기
1/1

Nginx 란?

  • Nginx는 경량 웹 서버이다.
  • 클라이언트로부터 요청을 받았을때 요청에 맞는 정적 파일을 응답해주는 HTTP Web server로 활용되기도 하고, Reverse Proxy Server로 활용하여 WAS 서버의 부하를 줄일 수 있는 로드 밸런서로 활용되기도 한다.

Apache 란

  • 클라이언트로부터 받은 요청을 처리할 때 새로운 프로세스 또는 쓰레드를 생성하여 처리
  • 요청마다 쓰레드가 생성되므로 접속하는 사용자가 많으면 그만큼 쓰레드가 생성되어 CPU와 메모리 자원의 소모가 커짐

Nginx 란

  • Event-Driven 구조로 동작, 한 개 또는 고정된 프로세스만 생성하여 사용하고, 비동기 방식으로 요청들을 Concurrency하게 처리
  • 새로운 요청이 들어오더라도 새로운 프로세스와 쓰레드를 생성하지 않기 때문에 프로세스와 쓰레드 생성 비용이 존재하지 않고, 적은 자원으로도 효율적인 운용이 가능하다.
  • 단일 서버에서도 동시에 많은 연결 처리 가능

Nginx 구조

  • 하나의 Master Process와 다수의 Worker Process로 구성되어 실행
  • Master Process : 설정 파일을 읽고, 유효성을 검사, 그리고 Worker Process 관리
  • 모든 요청은 Worker Process에서 처리
  • Nginx는 이벤트 기반 모델을 사용하고, Worker Process 사이에 요청을 효율적으로 분배하기 위해 OS에 의존적인 메커니즘을 사용
  • Worker Process의 개수는 설정 파일에서 정의, 정의된 프로세스 개수와 사용가능한 CPU 코어 숫자에 맞게 자동으로 조절

Nginx 설정

Nginx는 지시어에 부여하는 값에 의해 작동한다.
Nginx의 메인 설정 파일 경로는 /etc/nginx/nginx.conf 이다.
Nginx 모듈의 동작은 Configuration 파일에 있는 directives(지시어)에 의해 제어된다.
directive는 simple directiveblock directive 두가지 종류가 있다.

  • simple directive : 이름, 값이 있고 세미콜론(;)으로 끝
worker_process 1;
  • block directive : simple directive의 구조에 블록("{","}")을 감싼 형태의 지시어
events {
    worker_connections  1024;
}
  • block directive는 해당 directive 안에 또 다른 block directive가 포함 될 수 있다.
http {
  server {

    location / {
      root /path/to/html ;
    }

    location /images/ {
      root /path/to/image ;
    }

  }
}
  • include 지시어는 특정 파일을 포함하는 기능을 수행, 파일의 내용은 지시어가 이쓴 바로 그 위치에 해당 파일 내용이 삽입
http {
    # mime.types 파일을 읽어들인다. (단일 파일을 include)
    include       /etc/nginx/mime.types;

    # /etc/nginx/conf.d 디렉토리 아래 있는 .conf 파일을 모두 읽어 들임 (특정 디렉토리의 모든 파일을 include)
    include /etc/nginx/conf.d/*.conf;
}

메인설정 /etc/nginx/nginx.conf

# worker 프로세스를 실행할 사용자 설정
# - 이 사용자에 따라 권한이 달라질 수 있다.
user  nginx;
# 실행할 worker 프로세스 설정
# - 서버에 장착되어 있는 코어 수 만큼 할당하는 것이 보통, 더 높게도 설정 가능
worker_processes  1;

# 오류 로그를 남길 파일 경로 지정
error_log  /var/log/nginx/error.log warn;
# NGINX 마스터 프로세스 ID 를 저장할 파일 경로 지정
pid        /var/run/nginx.pid;


# 접속 처리에 관한 설정을 한다.
events {
    # 워커 프로레스 한 개당 동시 접속 수 지정 (512 혹은 1024 를 기준으로 지정)
    worker_connections  1024;
}

# 웹, 프록시 관련 서버 설정
http {
    # mime.types 파일을 읽어들인다.
    include       /etc/nginx/mime.types;
    # MIME 타입 설정
    default_type  application/octet-stream;

    # 엑세스 로그 형식 지정
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    # 엑세스 로그를 남길 파일 경로 지정
    access_log  /var/log/nginx/access.log  main;

    # sendfile api 를 사용할지 말지 결정
    sendfile        on;
    #tcp_nopush     on;

    # 접속시 커넥션을 몇 초동안 유지할지에 대한 설정
    keepalive_timeout  65;

    # (추가) nginx 버전을 숨길 수 있다. (보통 아래를 사용해서 숨기는게 일반적)
    server_tokens off

    #gzip  on;

    # /etc/nginx/conf.d 디렉토리 아래 있는 .conf 파일을 모두 읽어 들임
    include /etc/nginx/conf.d/*.conf;
}

http 블록

http 블록은 HTTP 부분과 관련된 모듈의 지시어와 블록을 정의하며, server와 location의 루트 블록이라고 할 수 있습니다. http, server, location 블록은 계층 구조를 가지고 있습니다. 많은 지시어가 각 블록에서 동시에 사용될 수 있는데, http 블록의 내용은 server 블록의 기본값이 되고, server 블록의 내용은 location 블록의 기본값이 됩니다. 만약 상위 블록에서 선언된 지시어를 하위 블록에서 다시 선언하면 상위의 지시어는 무시됩니다. http 블록 안에 한 개 이상의 server 블록을 선언할 수 있습니다.

server 블록

server 블록은 하나의 호스트를 선언하는데 사용하며, http 블록 안에서만 사용할 수 있습니다. server 블록에는 한 개 이상의 location 블록을 선언할 수 있습니다.

location 블록

location 블록에는 server 블록 안에 정의되며, 특정 URL을 처리하는 방법을 정의합니다. 예를 들면 http://example.com/hello/1http://example.com/world/1 접근하는 요청을 다르게 처리하고 싶을 때 사용합니다.

events 블록

events 블록은 네트워크의 작동 환경을 설정하는 지시어를 제공합니다. 이벤트 블록의 지시어는 이벤트 블록에서만 사용할 수 있고, http, server, local 블록과는 상속 관계를 갖지 않습니다. 아래의 지시어들은 반드시 events 블록 안에서만 사용해야 합니다.

1. accept_mutex

accept_mutex on;
LISTEN 소켓을 오픈하기 위한 accept 뮤텍스의 사용/해제를 설정합니다.
 
2. accept_mutex_delay

accept_mutex_delay 500ms;
자원 획득을 다시 시도하기 전에 작업자 프로세스가 기다려야 하는 시간을 정의합니다. accept_mutex 지시어가 off 로 설정되어 있으면 이 값은 사용되지 않습니다.

3. worker_connections

worker_connections 1024;
Worker Process 가 동시에 처리할 수 있는 접속자 수를 정의합니다. worker_processes * worker_connections = 최대 접속자 수

Reverse Proxy


Nginx는 리버스 프록시로도 사용할 수 있다.
*리버스 프록시란? 외부 클라이언트에서 서버로 접근 시, 중간에서 중개자 역할을 하여 내부서버로 접근할 수 있도록 도와주는 서버

  • 보안 : 외부 사용자로부터 내부망에 있는 서버의 존재를 숨길 수 있다. 모든 요청은 리버스 프록시 서버에서 받으며, 매핑되는 내부 서버로 요청을 전달합니다. 또한 Nginx는 SSL 설정도 가능합니다.
  • 로드밸런싱 : 리버스 프록시 서버가 내부 서버에 대한 정보를 알고 있으므로, 각 서버의 상태에 따라 부하를 분산시키며 요청 전달 가능

Reverse Proxy 설정하기

http {
    server {
        listen 80;
        location / {
            proxy_pass http://127.0.0.1:8081;
        }
    }
}

만약, listen 지시어를 선언하지 않으면 default 값인 80포트로 설정됩니다.

참고자료

링크텍스트

profile
I can do it ! 苦盡甘來

0개의 댓글