본문 바로가기
Programming

Nginx 란? 웹 서버 개념 이해하기

by 개발자 염상진 2022. 9. 20.

 

웹 서버란?

 

팀 버너스 리가 구축한 월드 와이드 웹(WWW)은 인터넷 네트워크에서 동작하는 프로토콜입니다. 인터넷에서는 클라이언트가 웹 서버에게 요청을 보내고 연결은 HTTP 프로토콜로 연결이 확립된 후 데이터가 전송됩니다. 

클라이언트는 쉽게 말해 정보를 요청하는 쪽이고, 서버는 정보를 전달해주는 역할을 담당합니다. 서버 컴퓨터라고 따로 있는게 아니라 우리가 일반적으로 사용하는 PC도 서버로써의 동작을 할 수 있습니다. 대표적으로 개발을 할 때 많이 사용하는 localhost가 웹 서버가 될 수 있습니다.

 

 

웹 서버의 큰 특징 중 2가지는 우선 정적 리소스를 반환해주는 기능입니다. HTML, CSS와 같이 동적으로 변하는 데이터가 아닌 데이터들을 반환해줍니다. 

 

두번째 역할은 프록시 기능입니다. 

구글과 같이 트래픽이 엄청난 서비스들은 어떻게 서버를 구축할까요? 우리가 실제 요청을 보내는 서버로 클라이언트가 바로 요청을 보내는것이 아니라 중간에 트래픽을 분산시켜주는 로드밸런서 역할을 하는 프록시 서버가 미들웨어로 작동합니다. 이 기능을 웹 서버가 담당합니다.

 

웹 서버가 되기 위해서는 서버로써의 역할을 할 수 있도록 지원하는 프로그램이 필요한데, 이중 하나가 Apache, Nginx가 되는 것입니다. 2022년 웹 서버 점유율을 보면 아직까지도 Apache의 아성을 이길 수는 없지만, Nginx도 꾸준히 점유율을 늘려가는 모습입니다.

 

 

Apache VS Nginx

 

 

Apache는 1996년에 등장한 웹 서버 프로그램입니다. 오픈소스로 배포되었고, 웹이 뜨기 시작한 이래로 단 한번도 웹 시장 점유율 1위를 내준적이 없습니다. 반면 Nginx는 차세대 웹 서버로 사용되지 않는 기능은 과감히 내다 버리고, 보다 적은 리소스를 가지고 웹 서버의 기능을 구현해 내고 있습니다. 

 

Nginx 환경 구성하기

 

Nginx프로젝트에 적용하기 위해서는 conf 파일을 구성해야 합니다. 이 파일에 프록시를 정하고 정적 파일은 어떤걸 보내줄지 결정할 수 있습니다. 즉 Nginx가 어떻게 작동해야 할지를 명시하는 기술 명세서라고 생각하시면 됩니다. Nginx 설정파일은 대략 4개정도 구성됩니다.

 

Nginx 구성 파일

  • default.conf : 메인 설정 파일
  • fcgi.conf : FastCGI 환경 설정 파일
  • sites-enabled : Apache의 Virtual Host 설정 영역입니다. Optional 한 파일이지만 활성화된 사이트들의 설정 파일들을 명시합니다.
  • sites-avalable : 비활성화된 사이트들을 명시하는 파일입니다.

 

 

nginx.conf 파일

user  www www;
worker_processes  2;
pid /var/run/nginx.pid;

# [ debug | info | notice | warn | error | crit ]
error_log  /var/log/nginx.error_log  info;

events {
  worker_connections   2000;
  # use [ kqueue | rtsig | epoll | /dev/poll | select | poll ] ;
  use kqueue;
}

http {
  include       conf/mime.types;
  default_type  application/octet-stream;

  log_format main      '$remote_addr - $remote_user [$time_local]  '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$gzip_ratio"';

  log_format download  '$remote_addr - $remote_user [$time_local]  '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$http_range" "$sent_http_content_range"';

  client_header_timeout  3m;
  client_body_timeout    3m;
  send_timeout           3m;

  client_header_buffer_size    1k;
  large_client_header_buffers  4 4k;

  gzip on;
  gzip_min_length  1100;
  gzip_buffers     4 8k;
  gzip_types       text/plain;

  output_buffers   1 32k;
  postpone_output  1460;

  sendfile         on;
  tcp_nopush       on;

  tcp_nodelay      on;
  send_lowat       12000;

  keepalive_timeout  75 20;

  # lingering_time     30;
  # lingering_timeout  10;
  # reset_timedout_connection  on;


  server {
    listen        one.example.com;
    server_name   one.example.com  www.one.example.com;

    access_log   /var/log/nginx.access_log  main;

    location / {
      proxy_pass         http://127.0.0.1/;
      proxy_redirect     off;

      proxy_set_header   Host             $host;
      proxy_set_header   X-Real-IP        $remote_addr;
      # proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

      client_max_body_size       10m;
      client_body_buffer_size    128k;

      client_body_temp_path      /var/nginx/client_body_temp;

      proxy_connect_timeout      90;
      proxy_send_timeout         90;
      proxy_read_timeout         90;
      proxy_send_lowat           12000;

      proxy_buffer_size          4k;
      proxy_buffers              4 32k;
      proxy_busy_buffers_size    64k;
      proxy_temp_file_write_size 64k;

      proxy_temp_path            /var/nginx/proxy_temp;

      charset  koi8-r;
    }

    error_page  404  /404.html;

    location /404.html {
      root  /spool/www;

      charset         on;
      source_charset  koi8-r;
    }

    location /old_stuff/ {
      rewrite   ^/old_stuff/(.*)$  /new_stuff/$1  permanent;
    }

    location /download/ {
      valid_referers  none  blocked  server_names  *.example.com;

      if ($invalid_referer) {
        #rewrite   ^/   http://www.example.com/;
        return   403;
      }

      # rewrite_log  on;
      # rewrite /download/*/mp3/*.any_ext to /download/*/mp3/*.mp3
      rewrite ^/(download/.*)/mp3/(.*)\..*$ /$1/mp3/$2.mp3 break;

      root         /spool/www;
      # autoindex    on;
      access_log   /var/log/nginx-download.access_log  download;
    }

    location ~* ^.+\.(jpg|jpeg|gif)$ {
      root         /spool/www;
      access_log   off;
      expires      30d;
    }
  }
}

 

Nginx conf 파일은 위와 같이 생겼습니다. 길이가 길어서 당황스럽지만, 하나하나 뜯어보면서 설정하고자 하는 부분을 잘 적어주시면 됩니다. 

① Simple directives

최상단에는 멀티 코어로 작동할 worker의 갯수와 사용자의 이름 등을 기록합니다. 이를 Simple Directives라고 합니다. Nginx conf 파일은 무조건 세미콜론(;)으로 마무리를 해줘야 합니다.

  • user : 어떤 유저가 Nginx를 작동할지 명시합니다.
  • worker_processes : 몇개의 쓰레드가 작동할지 명시합니다. 갯수는 CPU 코어 갯수만큼만 사용하길 권장드립니다.
  • pid : Nginx pid(process Id)가 적힙니다.
  • include : 외부에서 작성한 conf 파일 내용을 가져옵니다. 

 

② Block Directives

{} 안에 Ngnix 웹 서버가 동작할 서버와 로케이션, 이벤트, 프록시 설정등을 기록합니다.

events

이벤트에는 worker process 당 몇개의 connection을 처리할지 정합니다. 

Include

Nginx가 설치되면 /etc/nginx/conf.d 폴더안에 conf 파일이 저장됩니다. include를 사용하면 기존에 저장한 파일 내용을 가져와서 conf 파일에서 사용할 수 있습니다.

Context

conf 파일의 Directive안에 또 다른 Directive가 들어있는 것을 Context라고 합니다. 

http

http Directive 안에는 특정 도메인 혹은 IP 주소로 요청을 분기해서 처리합니다. server Directive는 가상 서버를 설정하는 부분입니다. server > location은 사용자가 보내는 URL을 어떻게 분기할지 명시합니다. 

location

사용자가 보내는 URL을 명시합니다. 

upstream

현재 사용중인 서버 주소 목록을 관리합니다. 

 

Nginx로 웹 서버 구성하기

 

1. 우선 upstream에서 운영중인 서버들을 관리합니다.

2. server Directives를 만들고 Location으로 사용자가 보내는 URL Path를 분기합니다. 

3. Location에서는 URL 별로 Proxy Server를 운영할 수 있습니다. 

  • proxy_pass : 사용할 프록시 서버 주소를 기입합니다.
  • proxy_connect_timeout : 프록시 연결 시간을 설정합니다.
  • proxy_set_header : 프록시 서버의 헤더를 설정할 수 있습니다.

 

 

upstream client {
    server 172.18.0.1:3010;
}

upstream api {
    server 172.18.0.1:9192;
}

server {

    location / {
        proxy_pass http://client/;
    }
    
    location /api/ {
        proxy_pass http://api;
    }
}

 

SSL

만약 HTTPS 프로토콜을 프로젝트 붙인다고 하면 SSL / TLS 인증서가 필요합니다. Nginx에서 HTTPS 프로토콜을 사용하기 위해서는 conf 파일에 SSL 설정을 명시해줍니다.

# SSL
    ssl			on;
    ssl_certificate	/home/ubuntu/SSL/01/nginx_ssl.crt;
    ssl_certificate_key /home/ubuntu/SSL/01/private.key;

    ssl_session_timeout 5m;

    ssl_protocols 	SSLv2 SSLv3 TLSv1.2;
    ssl_ciphers 	HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers	on;

 

 

 

 

 

 

AWS EC2 인스턴스 삭제 하는 방법

AWS는 웹 호스팅을 위한 IaaS를 제공하는 서비스 입니다. 처음 회원가입 후 최초 1년간은 무료 티어를 사용할 수 있으므로, 테스트 목적으로 사용하기에는 최적의 서비스 입니다. 다만 테스트가 완

about-tech.tistory.com

 

 

Artillery 부하테스트 사용 방법 [Node.js test]

백엔드 작업을 할 때 가장 신경써야 하는 부분은 뭘까요? Restful API를 작성한다고 할 때 DB Schema도 작성해야 하고, router, controller도 작성해야 한다. 하지만 이 이상으로 중요한게 서버가 얼마만큼

about-tech.tistory.com

 

 

Ubuntu Version 확인 명령어 (terminal 에서 버전 정보 체크 방법)

CLI 환경에서 우분투 버전을 확인할 수 있습니다. 여러가지 방법으로 확인할 수 있는데, 편한 방법으로 알아보시면 됩니다. 첫번째 방법 첫번째 방법은 cat 명령어로 간단하게 버전을 확인할 수

about-tech.tistory.com

 

댓글