Nginx란?

namkun·2021년 6월 29일
0

서버개발

목록 보기
1/7

Nginx?

웹서버의 종류중 하나. 만들어진 이유는 2002년 아파치 C10K 이슈를 해결하기 위해서이다.

가볍고, 여러 요청을 한번에 처리할 수 있다는 장점때문에 사용량이 급등하고 있다. apache 보다 동작이 단순하고 전달자 역할만 하기 때문에, 동시접속에 특화되어있다.

위의 그림을 보면 모든 사이트들 중, 최근에는 nginx의 점유율이 다른 웹서버에 비해 높다는 것을 확인할 수 있다.

그야말로 최근들어 가장 핫한 웹서버라고 할 수 있다.

자 그럼 이제 이렇게 핫한 Nginx 에 대해 알아보자.

왜 Nginx?

추가로...이 글을 쓰고나서 알게되었는데 apache도 2.4 버전부터는 event-driven방식을 지원한다고 한다. 뒤의 링크를 따라가 읽어보도록 하자 - 🙈[Web Server] 아파치 2.4와 Nginx 특징 및 비교🐵 - 결론만 냈을땐 성능은 여전히 nginx가 앞선다.

Nginx가 왜 Apache의 점유율을 따라잡았을까? 뭐가 더 좋길래?

Nginx는 아파치와 다르게 비동기 이벤트 구동에 의한 처리를 한다.

이게 무슨소리인가 하면,

위의 그림에서 볼 수 있다 싶이, 아파치는 클라이언트로부터 받은 요청을 처리할 때 새로운 프로세스 or 쓰레드를 생성해서 처리한다.

요청마다 쓰레드가 생성되므로 접속하는 사용자가 많다면, 그만큼 쓰레드가 생성되어 CPU와 메모리 자원의 소모가 커진다.

그러나 Nginx 는 Event-Driven 구조로 동작하기 때문에 한 개 또는 고정된 프로세스만 생성해서 사용하고, 비동기 방식으로 요청들을 동시에 처리할 수 있다.  - (1)

즉, 동시 접속수가 늘어날 수록 물리 메모리가 증가하는 프로세스 기반의 apache와는 다르게 자원(cpu, mem)의 소모량이 적고 동시성을 보장할 수 있다. - (2)

그러나 프로그램의 제어가 이벤트 핸들러로 넘어왔다고 한들, 실제 데이터를 읽고 쓰는 것은 OS내의 시스템 호출 프로그램과 하드웨어 사이에서 실행되기에, 해당 처리가 길어지면(I/O 시간이 길어진다면) 결국 시스템 호출 큐에 요청이 많이 쌓여 성능이 저하될 수 있다.

그렇기에 nginx는 매우 작은 데이터를 대량으로 전송하는 서버나, 하드웨어의 r/w가 발생하지 않는 캐시 제공, 리버스 프록시 서버, 로드밸런서 등의 역할을 주로 담당하게 된다.

자 위에서 알아봤으니, 이제 Nginx를 직접 설치해서 사용해보자.

설치

자 이제 본격적으로 설치해서 사용해보자.

개발 환경은 ec2 서버 위에서 진행했다.

nginx 를 설치하기 위해 yum 명령어를 날려보면 안되는 경우가 있다.

우선 /etc/yum.repos.d 경로로 가서 nginx.repo 파일을 만들어 주자.

내용은 다음과 같이 세팅한다.

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

그 다음에 동일한 yum 명령어를 날려서 설치하면 /etc/ 아래에 nginx 가 설치되어있을 것이다.

설정

etc/nginx 에 들어가면 다음과 같이 구성되어있다.

(tomcat.conf, nginx_tomcat_access.log는 개인적으로 만든 것...)

여기서 설정에 사용되는 파일은 nginx.conf 그리고 conf.d 폴더안에 있는 파일들이다.

nginx.conf

nginx 의 전체 설정을 다루는 파일이다.

conf.d

nginx.conf 에서 include해서 사용할 수 있는 설정파일들을 넣어두는 폴더이다.

nginx.conf를 까보면 다음과 같이 설정이 되어있는 것을 볼 수 있다.

user  nginx;
worker_processes  auto;

error_log  /etc/nginx/logs/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    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  /etc/nginx/logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/tomcat.conf;
}

내부의 코드는 다음과 같은 기능을 갖는다.

User

  • worker 프로세스를 실행할 사용자 설정
  • 이 사용자에 따라 권한이 달라질 수 있다.

worker_process

  • 몇개의 워커 프로세스를 생성할 것인지 지정하는 지시어
  • 서버에 장착되어 있는 코어 수 만큼 할당하는 것이 보통. 더 높게도 설정 가능
  • 1이면 모든 요청을 하나의 프로세스로 실행하겠다는 뜻. CPU 멀티코어 시스템에서 1이면 하나의 코어만으로 요청을 처리하는 셈이다.
  • auto로 놓으면 해당 서버에 맞게 알아서 조절한다.

error_log

  • 에러 로그를 저장할 경로를 적는다.
  • 어느 레벨까지 정할지 뒤어 적는다. (Ex. notice, warn...)

pid

  • 해당 nginx 의 pid 번호를 저장할 경로를 둔다.

events

  • 이벤트 블록은 네트워크 동작방법과 관련된 설정이다.
  • worker_connections : 하나의 프로세스가 처리할 수 있는 커넥션의 수
  • 고로 최대 접속자수는 worker_processes X worker_connections가 된다.

http

  • 하위에 server 블록, 그리고 location 블록을 갖는 루트 블록 이다. 여기서 선언된 값은 하위 블록에 상속된다. 서버의 기본값이 된다.
  • include : server 블록에서도 사용할 수 있다. conf.d 에 정의해놓은 파일들을 적용하는데 사용된다. ( 여기서는 tomcat.conf도 include 하고 있다.)
  • default_type : Mime 타입을 지정한다.
  • log_format :엑세스 로그 형식을 지정한다.
  • access_log : 억세스 로그를 어느 레벨까지 저장할지 경로와 레벨을 지정한다.
  • sendfile : sendfile api 를 사용할지 말지 결정
  • keepalive_timeout : 접속 시에 얼마나 커넥션을 유지할지 설정한다.
  • gzip on : 컨텐츠 압축 사용을 할지 말지..! (잘 모릅니다.)

위에서 보았듯이, 우리는 이미 conf.d 폴더아래에 tomcat이라는 설정파일을 만들어서 사용하고 있다.

이는 관리가 용이하도록 하기 위함인데, 모든 설정을 nginx.conf 에 넣는다면, 해당 파일이 너무 복잡해질 것이다.

그렇기에 우리는 따로 분리해서 보기 편하도록 따로 설정해놓은 것이다.

이제 해당 파일에 들어간 옵션들을 확인해보자.

#tomcat 위치지정
upstream tomcat{
        server localhost:port1;
        server localhost:port2;
}

server{
        listen listeningPort;
        server_name analyzer1;

        #로그위치 설정
        access_log /etc/nginx/logs/nginx_tomcat_access.log;

        location / {
                proxy_set_header        Host $http_host;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header        X-Forwarded-Proto $scheme;
                proxy_set_header        X-NginX-Proxy true;

                #위에서 설정한 upstream 경로 복사
                proxy_pass http://tomcat;
                proxy_redirect  off;
                charset utf-8;

        }

upstream

  • origin 서버라고도 한다. 여기서는 WAS 를 의미하고, nginx는 downstream에 해당한다고 할 수 있다. 여러 서버를 지정해두고, weight 을 정할 수 있다.
  • 다음 그림을 보고 쉽게 이해하자

  • 여러개의 was를 지정할 수 있다.
  • 내부에는 host:port 형태의 값이 들어온다.
  • 안에서 선택할 수 있는 옵션으로는 다음과 같은 값들이 있다.
    • Load-Balancing Option
      • round-robin : 로드 밸런싱을 라운드 로빈 방식으로 처리할 수 있도록 한다.
      • least-connected : 두 was중에 커넥션이 적은 곳으로 요청을 보낸다.
      • ip_hash : 같은 방문자로부터 도착한 요청은 항상 같은 업스트림 서버가 처리 할 수 있게 한다.
    • Upstream Server Option
      • weight=n : 업스트림 서버의 비중을 나타낸다. 이 값을 2로 설정하면 그렇지 않은 서버에 비해 두배 더 자주 선택된다.
      • max_fails=n : n으로 지정한 횟수만큼 실패가 일어나면 서버가 죽은 것으로 간주한다.
      • fail_timeout=n : max_fails가 지정된 상태에서 이 값이 설정만큼 서버가 응답하지 않으면 죽은 것으로 간주한다.
      • down : 해당 서버를 사용하지 않게 지정한다. ip_hash; 지시어가 설정된 상태에서만 유효하다.
      • backup : 모든 서버가 동작하지 않을 때 backup으로 표시된 서버가 사용되고 그 전까지는 사용되지 않는다.

server 블록

  • 하나의 웹사이트를 선언하는데 사용된다. server 블록이 여러개이면, 한대의 머신(호스트)에 여러 웹사이트를 서빙할 수 있다.
  • 이런 것을 가상 호스트 라고 한다. 실제로 호스트는 한대 이지만, 가상으로 마치 호스트가 여러개 존재하는 것처럼 동작하게 할 수 있다.
  • listen : 이 웹사이트가 바라보는 포트를 의미한다.
  • server_name : 클라이언트가 접속하는 서버(주로 도메인)이다. 이것과 실제 들어온 request 의 header 에 명시된 값이 일치하는지 확인해서 분기한다.
  • root : 웹사이트가 바라보는 root 폴더의 경로를 의미한다.

location

  • server 블록 안에서 특정 웹 사이트의 url을 처리하는데 사용
  • proxy_pass : 위의 설정한 upstream으로 넘길 수 있다.
  • proxy_set_header
    • nginx 가 proxy로 중계할 때, 중계받는 서버에 request header를 다시 재정의해서 전달할 때 사용한다.
    • host는 nginx의 변수인 $http_host 를 사용하면된다.
    • X-Forwarded-For는 프록시 확경에서 HTTP Server에 요청한 client 의 IP를 식별하기 위한 헤더이다.
    • X-Forwarded-Proto는 클라이언트가 프록시에 접속할 때, 사용했던 프로토콜이 무엇인지 확인하는 헤더이다.

어떻게 실행하지?

sudo systemctl [start / stop / reload] nginx

차례로 시작, 정지, 새로 설정한 것들 반영(리로드)이다. 쉽다!

이정도면 필요한 옵션은 잘 설명 된 것 같다.

조금더 상세한 설명을 원한다면 작성자가 참조한 페이지들을 참고해보자!


참조


  1. 여기서 말하는 비동기 방식은 A의 요청을 B가 즉시 주지 않아도, A의 유휴시간으로 또 다른 작업 처리가 가능한 방식을 말한다.

  2. 10,000개의 동시 접속을 하면 그 10000개에 드는 메모리 점유는 평균 2.5MB라고 한다..

profile
개발하는 중국학과 사람

0개의 댓글