웹서버를 사용할 때 요즘에는 대부분 nginx 를 많이 이용할 것으로 생각합니다. 그래서 이번에 공부하는 김에 nginx 에 대해서 한번 정리해보고자 블로그 작성을 하게 되었습니다.

웹 서버란?

nginx 는 결국 웹 서버의 한 종류입니다. 그렇다면 웹 서버는 무엇일까요? 웹 서버란 이미지, 동영상, 자바스크립트, HTML, 등 다양한 문서를 제공하는 서버 시스템입니다. 주로 HTTP 통신 프로토콜을 통해 리소스를 전달하지만 FTP, SMTP 와 같은 다른 프로토콜도 지원하는 것이 대부분입니다.

nginx-01

대부분의 웹 서비스는 위의 아키텍처처럼 구성되어 있으며 웹서버는 그 중 다음과 같은 역할을 주로 담당하게 됩니다.

  1. 데이터 전송
    • HTML 텍스트 파일을 비롯하여 이미지나 음성 데이터 같은 정적인 컨텐츠를 웹 클라이언트에 전송합니다.
    • 이를 이용하면 최근 유행하는 클라이언트 사이드 랜더링(React, Vue, Angular 등)에 의해 생성된 빌드 파일(정적 파일)을 제공할 수 있습니다.
  2. 어플리케이션 실행
    • 위 아키텍처와는 다르게 웹서버 내에 PHP 와 같은 모듈을 내장해서 웹 서버가 직접 Application Server 를 실행할 수 있습니다.
    • 이를 이용해 이미지 압축 등의 기능을 사용할 수 있게 됩니다.
  3. 프록시 처리
    • 클라이언트의 요청을 Application Server 로 전달하는 역할을 합니다.
    • 이를 이용해 캐시 처리를 할 수 있고 로드 밸런싱 기능, 암호화 기능 등 처리할 수 있으며, 웹 서버가 사용되는 가장 큰 이유 중 하나이기도 합니다.

간단하게 웹서버에 대해서 알아봤습니다. 그럼 nginx 웹 서버는 어떤 특징을 가지고 있으며 왜 최근 사람들이 많이 사용하는지 알아보도록 하겠습니다.

nginx 특징

nginx 의 가장 큰 특징은 비동기 Event Driven 에 의한 Non Blocking 처리를 한다는 것입니다. 그에 따라 동시 접속수가 늘어날 수록 물리 메모리가 증가하는 프로세스 기반의 apache 서버 에 비해 소비 메모리량이 적어지면서 동시 처리수를 급격하게 늘릴 수 있습니다.

또한 single Thread 기반으로 마스터 / worker 프로세스 구동 방식을 채택하여 context switching 를 하지 않기 때문에 CPU 사용률을 감소시킬 수 있습니다.

nginx-01 (이미지 출처: 가그린 밀크 블로그)

다만 결국 하드웨어 자원을 사용하는 것이므로 nginx 에서 읽기/쓰기가 자주 일어난다면 아파치가 더 좋을 수도 있습니다. 하지만 대부분의 웹 서버에서는 하드웨어 읽기가 발생하지 않는 캐시 제공, 리버스 프록시 서버, 로드 벨런서 등의 역할을 주로 담당하게 되므로 최근들어 더 자주 사용된다고 생각할 수 있을 것 같습니다.

그 외에도 nginx 는 여러 기능을 모듈 단위로 개발하여 nginx 를 컴파일할 때 필요한 모듈들만 조합해서 사용할 수 있습니다.

nginx 설치하기

간단하게 nginx 설치하는 방법을 알아보겠습니다. 공식 사이트 에서 설치하는 방법이 자세히 나와있으니 참고 바랍니다.

먼저 ubuntu 인 경우 설치 방법입니다.

# apt repository 에 설치하고자 하는 nginx 버전 추가 
# ubuntu 버전 (18.04: bionic, 16.04: xenial)
sudo touch /etc/apt/sources.list.d/nginx.list
echo "deb http://nginx.org/packages/ubuntu/ bionic nginx" | sudo tee -a /etc/apt/sources.list.d/nginx.list
echo "deb-src http://nginx.org/packages/ubuntu/ bionic nginx"| sudo tee -a /etc/apt/sources.list.d/nginx.list

# 인증 키 등록
wget http://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key

# 저장소 업데이트
sudo apt-get update

# nginx 설치
sudo apt-get install nginx

만약 centOS 기반이라면 아래처럼 설치합니다.

# nginx 공식 저장소 추가
sudo vim /etc/yum.repos.d/nginx.repo
# 파일에 아래 내용 추가
  [nginx]
  name=nginx repo
  baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
  gpgcheck=0
  enabled=1

# nginx 설치
sudo yum install nginx

각각 설치 후 다음 명령어를 이용해 nginx 버전을 확인하고 실행할 수 있습니다.

# nginx 버전 확인
nginx -v

# nginx 시작
sudo /etc/init.d/nginx start

nginx 기본 환경 변수

nginx 를 설치하면 /etc/nginx 에 아래와 같은 디렉토리가 나올 것입니다.

├── conf.d # nginx.conf 에서 불러들일수 있는 설정 파일
├── fastcgi.conf
├── fastcgi_params
├── koi-utf
├── koi-win
├── mime.types
├── nginx.conf # 기본 설정 파일
├── proxy_params
├── scgi_params
├── sites-available # 가상 호스트 설정 파일들 위치
│   └── default
├── sites-enabled
│   └── default -> /etc/nginx/sites-available/default
├── snippets # nginx와 관련된 잡다한 설정파일들 위치 (ubuntu 에서는 여기에 위치시키는 것이 관례)
│   ├── fastcgi-php.conf
│   └── snakeoil.conf
├── uwsgi_params
└── win-utf

먼저 기본 설정 파일인 nginx.conf 에 대해서 알아보기 위해 cat /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;
}

만약 기본 설정을 수정하였으면 아래 명령어를 통해 nginx 에 반영할 수 있습니다. (권한이 없다면 sudo 를 입력해주세요)

# ubuntu
$ service nginx reload;

# centOS
$ systemctl start nginx

마무리

이번에 웹서버는 무엇인지 알아보고, 그 중 nginx 는 어떤 특징을 가지고 있는지에 대해서 정리해 보았습니다. 그 이후에 설치와 기본적으로 세팅되어 있는 값들에 대해서 알아보았는데요. 다음 포스팅에서는 nginx 를 활용해서 정적 파일 호스팅 서버, 프록시 서버 를 구축해보겠습니다.