우리가 일상적으로 사용하는 컴퓨터의 브라우저 또는 Galaxy, iPhone과 같은 모바일 장치에서 웹 사이트 또는 애플리케이션에 접속할 때, 그 뒤에서는 웹 서버라는 컴퓨터 장치가 끊임없이 활동하고 있습니다. 웹 서버는 사용자의 요청을 받아 그에 알맞은 정보를 반환하는 역할을 합니다. 이러한 웹 서버 소프트웨어 중에서도 Nginx는 그 역할을 훌륭하게 수행하는 프로그램으로 알려져 있습니다.
Nginx는 웹 서버뿐만 아니라 리버스 프록시, 메일 프록시, 로드 밸런서 등 다양한 기능을 제공하는 오픈 소스 소프트웨어입니다. 이는 웹 사이트나 애플리케이션을 안정적으로 운영하고, 대량의 트래픽을 효율적으로 분산시키는 역할을 합니다. 또한, 가벼운 메모리 사용량과 높은 성능으로 유명하여 많은 개발자들과 시스템 관리자들에게 사랑받고 있습니다.
개요
Nginx는 웹 서버 , 리버스 프록시, 메일 프록시, 로드 밸런서 등의 다양한 기능을 제공하는 오픈 소스 소프트웨어입니다. 이 소프트웨어는 메모리 사용량이 적고 성능이 뛰어나며, 높은 확장성과 다양한 기능들을 통해 전 세계적으로 광범위하게 사용되고 있습니다.
Nginx 역사
Nginx는 2004년 러시아의 Igor Sysoev에 의해 개발되었습니다. 당시 Sysoev는 Rambler.ru에서 웹 서버를 관리하는 일을 맡고 있었는데, 기존 웹 서버들은 높은 트래픽을 처리하는 데 어려움을 겪고 있었습니다. 이러한 문제를 해결하기 위해 Sysoev는 Nginx를 개발했습니다.
Nginx는 빠른 속도와 안정적인 작동으로 빠르게 인기를 얻었고, 현재는 전 세계적으로 가장 많이 사용되는 웹 서버 중 하나입니다.
주요 특징
Nginx는 이벤트 기반 아키텍처를 통해 높은 성능과 낮은 메모리 사용량을 제공하며, 다양한 환경에서 확장 가능한 기능과 안정적인 작동으로 사용자에게 편리한 웹 서버 및 리버스 프록시 솔루션을 제공합니다.
- 높은 성능: Nginx는 이벤트 기반 아키텍처를 사용하여 동시 연결 수를 효율적으로 처리합니다. 이는 비동기식 처리 모델을 채택함으로써 많은 연결을 효율적으로 처리할 수 있어, 빠른 응답 시간과 높은 처리량을 보장합니다.
- 낮은 메모리 사용량: Nginx는 적은 메모리를 사용하여 리소스를 효율적으로 활용합니다. 이는 Nginx가 불필요한 자원을 최소화하고 경량화된 디자인을 채택하여 메모리 사용량을 최적화함으로써 가능합니다.
- 높은 확장성: 다양한 모듈을 통해 Nginx의 기능을 확장하고 다양한 환경에 적용할 수 있습니다. 모듈 시스템을 통해 필요에 따라 웹 서버, 리버스 프록시, 메일 프록시, 로드 밸런서, HTTP 캐싱 등 다양한 기능을 추가할 수 있습니다.
- 다양한 기능: Nginx는 웹 서버 기능뿐만 아니라 리버스 프록시, 메일 프록시, 로드 밸런서, HTTP 캐싱 등 다양한 기능을 제공합니다. 이는 Nginx가 다양한 용도로 활용될 수 있으며, 특정 환경에 맞게 설정할 수 있도록 다양한 기능을 제공함을 의미합니다.
- 안정성: Nginx는 오랜 기간 동안 개발되고 검증되어 안정적인 작동을 보장합니다. 안정성은 Nginx의 핵심 가치 중 하나로, 많은 기업과 개발자들이 Nginx를 신뢰하는 이유 중 하나입니다.
- 사용 편의성: Nginx는 설정 파일이 간결하고 명확하여 사용하기 쉽습니다. 이는 Nginx가 사용자 친화적인 구조를 갖추고 있어, 초기 설정부터 운영까지 편리하게 사용할 수 있음을 의미합니다.
Nginx 구성
Nginx는 nginx.conf라는 설정 파일을 통해 구성됩니다. 설정 파일에는 Nginx의 작동 방식을 정의하는 다양한 지시어가 포함됩니다.
user
: Nginx를 실행하는 사용자를 지정합니다. 이 사용자는 Nginx 프로세스가 해당 사용자의 권한으로 실행됩니다. 보안 측면에서 중요한 설정으로, 권한을 최소한으로 할당하여 시스템 보안을 강화할 수 있습니다.worker_processes
: Nginx 프로세스의 수를 지정합니다. 이는 Nginx가 사용할 CPU 코어의 수를 결정하는 중요한 설정입니다. 보통 CPU 코어 수에 맞추어 설정하여 최적의 성능을 얻을 수 있습니다.events
: Nginx가 동시에 처리할 수 있는 이벤트 수를 지정합니다. 이벤트 모듈을 통해 연결 처리 및 비동기 이벤트 처리 등을 설정할 수 있습니다. 이 설정은 서버의 동시 접속 처리 능력에 직접적인 영향을 미칩니다.http
: HTTP 서버 설정을 지정합니다. 이 부분에서는 HTTP 요청에 대한 전반적인 설정을 정의합니다. 예를 들어, MIME 유형 설정, HTTP 요청 헤더 조작, HTTP 응답 헤더 설정 등을 포함할 수 있습니다.server
: 가상 서버 설정을 지정합니다. 각 가상 서버는 서로 다른 도메인 또는 IP 주소를 가지며, 요청된 호스트에 따라 다른 서버 블록으로 라우팅됩니다. 이 부분에서는 가상 호스트에 대한 설정을 정의하며, 이를 통해 다중 도메인 호스팅 및 로드 밸런싱 등을 구현할 수 있습니다.location
: URL 경로에 대한 설정을 지정합니다. 이 부분에서는 특정 URL 패턴에 대한 처리 방법을 정의합니다. 정적 파일 제공, 리버스 프록시 설정, HTTP 요청 리다이렉션 등을 설정할 수 있습니다.
Nginx 모듈
Nginx는 다양한 모듈을 제공하여 기본 기능 외에도 리버스 프록시, 로드 밸런싱, HTTP 캐싱, Gzip 압축, SSL/TLS 암호화 등 다양한 기능을 추가할 수 있습니다. 이를 통해 Nginx는 다양한 환경과 요구 사항에 맞게 유연하게 확장할 수 있는 웹 서버 및 리버스 프록시 솔루션을 제공합니다.
ngx_http_proxy_module
: 이 모듈은 Nginx를 리버스 프록시로 사용할 수 있게 해줍니다. 클라이언트 요청을 받아 백엔드 서버로 전달하고, 백엔드 서버의 응답을 클라이언트에게 반환합니다. 이를 통해 로드 밸런싱, 캐싱, 보안 등 다양한 기능을 구현할 수 있습니다. 백엔드(Backend)(링크 업데이트 예정)ngx_http_load_balancing_module
: 이 모듈은 Nginx를 사용하여 로드 밸런싱을 수행할 수 있게 해줍니다. 여러 대의 백엔드 서버에 대한 부하를 균등하게 분산시켜 성능을 향상시키고 가용성을 높일 수 있습니다. 다양한 로드 밸런싱 알고리즘을 지원하여 사용자의 요구에 맞게 선택할 수 있습니다.ngx_http_cache_module
: 이 모듈은 HTTP 캐싱 기능을 제공하여 정적 콘텐츠를 캐시하여 서버 부하를 줄이고 응답 시간을 개선합니다. 캐시된 콘텐츠를 빠르게 제공함으로써 웹 페이지의 로딩 속도를 향상시킵니다.ngx_http_gzip_module
: 이 모듈은 HTTP 응답을 Gzip으로 압축하여 전송함으로써 대역폭을 절약하고 네트워크 성능을 향상시킵니다. 클라이언트가 Gzip으로 압축된 콘텐츠를 요청하면 Nginx는 해당 콘텐츠를 압축하여 응답합니다.ngx_http_ssl_module
: 이 모듈은 SSL/TLS 암호화를 지원하여 안전한 통신을 제공합니다. 클라이언트와 서버 간의 데이터 전송을 암호화하여 중간자 공격과 같은 보안 위협으로부터 보호합니다.
Nginx 설치 및 시작
Nginx를 설치하는 주요 방법은 패키지 매니저를 통한 설치와 공식 웹페이지에서 제공하는 설치 파일을 다운로드하여 설치하는 것입니다. 또한, 이 설치 파일의 소스 코드를 직접 컴파일하여 사용자의 요구 사항에 맞게 커스터마이징된 방식으로도 설치할 수 있습니다.
- 패키지 매니저를 통한 설치: 대부분의 운영 체제는 Nginx 패키지를 제공합니다. 패키지 매니저를 사용하여 Nginx를 설치하는 방법은 운영 체제마다 다릅니다. Ubuntu를 사용 중이라면 Ubuntu 서버에서 Nginx 설치하는 방법(링크 업데이트 예정) 문서에서 설치 과정을 확인할 수 있습니다.
- 소스 코드로부터 설치: 최신 버전의 Nginx를 설치하거나 특정 옵션을 사용하여 설치하려는 경우 소스 코드로부터 Nginx를 설치할 수 있습니다.
기본 디렉토리 구성
Nginx를 설치하고 기본 디렉토리로 이동하면 다음과 같은 구조로 구성되어 있습니다. 이러한 디렉토리 구조와 설정 파일들을 이해하고 활용하면, Nginx를 보다 효과적으로 설정하고 관리할 수 있습니다.
/etc/nginx
├── conf.d
├── fastcgi.conf
├── fastcgi_params
├── koi-utf
├── koi-win
├── mime.types
├── modules-available
│ ├── 50-mod-http-geoip.conf
│ ├── 50-mod-http-image-filter.conf
│ ├── 50-mod-http-xslt-filter.conf
│ ├── 50-mod-mail.conf
│ └── 50-mod-stream.conf
├── modules-enabled
├── nginx.conf
├── proxy_params
├── scgi_params
├── sites-available
│ └── default
├── sites-enabled
├── snippets
│ ├── fastcgi-php.conf
│ └── snakeoil.conf
├── uwsgi_params
└── win-utf
Nginx를 Ubuntu에 설치하면 일반적으로 다음과 같은 디렉토리 구조가 생성되며, 각부의 역할은 다음과 같습니다.
/etc/nginx/
: 이 디렉토리는 Nginx의 기본 설정 파일들을 포함하고 있습니다.nginx.conf
: 이 파일은 Nginx의 전체적인 설정을 담당하는 메인 설정 파일입니다.sites-available/
: 이 디렉토리에는 가능한 모든 웹사이트의 설정 파일들이 들어 있습니다. 웹사이트마다 별도의 설정 파일을 만들 수 있습니다.sites-enabled/
: 이 디렉토리에는 실제로 Nginx 서버에서 활성화된 웹사이트의 설정 파일들이 들어 있습니다.sites-available
디렉토리에서 설정 파일을 이 디렉토리로 심볼릭 링크를 생성하여 웹사이트를 활성화합니다.modules-available/
&modules-enabled/
: 이 두 디렉토리는 Nginx 모듈들의 설정을 담당합니다.modules-available
에는 가능한 모든 모듈의 설정 파일들이 있고,modules-enabled
에는 활성화된 모듈의 설정 파일들이 있습니다.snippets/
: 이 디렉토리에는 재사용 가능한 설정 조각들을 저장합니다. 이 설정들은 다른 Nginx 설정 파일에서 include 지시어를 사용하여 재사용할 수 있습니다.conf.d/
: 이 디렉토리에는 추가적인 설정 파일들을 넣을 수 있습니다. 이 디렉토리의 모든.conf
파일은 Nginx가 시작될 때 자동으로 읽힙니다.fastcgi_params
,koi-utf
,koi-win
,scgi_params
,uwsgi_params
,win-utf
: 이 파일들은 Nginx의 다양한 기능을 설정하는 데 사용됩니다.
Nginx 설정(예시)
Nginx 설정 구조는 전반적인 서버 설정과 개별 사이트 설정으로 나뉘어져 있습니다.
Nginx 전체 설정 파일 nginx.conf
Nginx 전체 설정을 구성하는 파일인 nginx.conf
는 일반적으로 /etc/nginx/nginx.conf
위치에 있습니다. 아래는 Nginx 설정 파일의 기본적인 예시입니다.
user nginx;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 2048;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
이 설정 파일의 각 부분은 다음과 같은 역할을 합니다.
user nginx;
: Nginx가 실행될 때 사용할 사용자를 설정합니다. 여기서는 nginx 사용자로 설정되어 있습니다.worker_processes auto;
: 워커 프로세스의 개수를 설정합니다. auto로 설정하면 시스템의 CPU 개수에 따라 자동으로 결정됩니다.pid /run/nginx.pid;
: PID 파일의 위치를 설정합니다. Nginx의 메인 프로세스 ID가 저장됩니다.events { worker_connections 2048; }
: 하나의 워커 프로세스가 동시에 처리할 수 있는 연결 개수를 설정합니다.http { ... }
: HTTP 서버에 대한 설정을 기술합니다. 여기에는 MIME 타입 설정, 로그 파일 위치, 서버 설정 등이 포함됩니다.server { ... }
: 가상 호스트에 대한 설정을 기술합니다. 여기에서는 포트 80에서 동작하는 서버 하나를 설정하고 있습니다.location / { ... }
: 특정 URL 경로에 대한 설정을 기술합니다. 여기에서는 웹 사이트의 루트 디렉토리와 기본 문서를 설정하고 있습니다.
개별 사이트 설정 파일 default
개별 사이트의 설정은 /etc/nginx/sites-available/
디렉토리에 위치한 파일들을 통해 관리됩니다. 이 중 default 파일은 기본 사이트 설정을 담당합니다. 아래는 default 파일의 예시입니다.
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
이 설정 파일의 각 부분은 다음과 같은 역할을 합니다.
server
: Nginx의 서버 블록을 정의합니다. 이 블록 안에는 하나의 웹 서버를 구성하는 설정이 들어갑니다.listen 80 default_server;
및listen [::]:80 default_server;
: 웹 서버가 클라이언트의 HTTP 요청을 수신하는 포트를 지정합니다. 여기서80
은 기본적인 HTTP 요청을 받는 포트를 나타냅니다.default_server
는 여러 서버 블록 중에서 기본 서버 블록임을 나타냅니다. 이 블록은 요청된 호스트 이름에 대한 매치가 없을 때 사용됩니다.root /var/www/html;
: 웹 서버의 기본 문서 루트 디렉토리를 설정합니다. 이 디렉토리에서 Nginx는 웹 페이지를 찾습니다. 여기서는/var/www/html
디렉토리가 설정되어 있으므로 웹 페이지 파일은 해당 디렉토리에 있어야 합니다.index index.html index.htm index.nginx-debian.html;
: 클라이언트가 요청한 디렉토리에 있는 파일 중에서 보여줄 기본 문서를 설정합니다. 여기서는index.html
,index.htm
,index.nginx-debian.html
순서로 파일을 찾아보고, 파일이 없을 경우 404 오류를 반환합니다.server_name _;
: 이 서버 블록이 요청된 호스트 이름에 매치되지 않을 경우 사용할 기본 서버 이름을 설정합니다. 여기서는 언더스코어(_
)를 사용하여 모든 호스트 이름에 매치되도록 설정되어 있습니다.location / { ... }
: 요청된 URL에 대한 처리 방법을 설정합니다. 여기서는 모든 URL에 대해 같은 설정을 사용하도록 지정되어 있습니다.try_files
지시어는 Nginx가 요청된 파일이나 디렉토리가 존재하는지 확인하고, 존재하지 않을 경우404 Not Found
오류를 반환합니다.