Nginx 구조와 파일 소개: 웹 서버 관리의 핵심
작성자 정보
- 차태식 작성
- 작성일
본문
엔진엑스(Nginx)는 Apache와 비교하여 우수한 성능과 뛰어난 동작의 간결함을 제공하는 웹 서버 프로그램이다. 주로 전달자 역할에 특화되어 있어 동시 접속 처리에 탁월한 성능을 발휘한다.
서버 모니터링 관련 프로젝트를 위해 리눅스 서버에 엔진엑스 환경 설정을 진행했던 경험으로 자세히 알아보려한다.
1. Nginx란?
Nginx (엔진엑스)는 높은 성능과 확장성을 갖춘 오픈 소스 웹 서버 소프트웨어다. Igor Sysoev에 의해 개발되었으며, 비동기 이벤트 기반 아키텍처를 기반으로 설계되어 있어 많은 연결을 동시에 처리할 수 있다.
2. Nginx의 특징
Nginx는 다음과 같은 주요 특징으로 인해 많은 사용자들에게 인기가 있다.
- 높은 성능: 비동기 처리 및 이벤트 기반 아키텍처로 인해 높은 동시 연결 처리가 가능하며, 뛰어난 성능을 제공한다.
- 가벼움 및 저용량 리소스 사용: Nginx는 메모리 사용량이 적어 가볍고, 높은 효율성을 보장한다.
- 리버스 프록시 지원: 리버스 프록시를 통해 클라이언트 요청을 여러 서버로 분산하고, 부하 분산을 구현할 수 있다.
- 정적 파일 및 동적 콘텐츠 서빙: 정적 파일을 빠르게 서빙하며, 필요시 백엔드 서버로부터 동적 콘텐츠를 가져올 수 있다.
- SSL/TLS 지원: 안전한 통신을 위해 SSL/TLS 프로토콜을 지원하고, HTTPS를 통한 통신을 간편하게 설정할 수 있다.
3. Nginx의 중요성
- 높은 가용성: Nginx는 리버스 프록시 및 부하 분산을 통해 여러 서버 간의 트래픽을 분산하고, 고가용성을 제공하여 서버 다운 시스템의 가용성을 높인다.
- 성능 최적화: 비동기 처리 방식과 효율적인 리소스 사용으로 인해 높은 성능을 제공하며, 대규모 트래픽을 효과적으로 관리할 수 있다.
- 웹 응용 프로그램 서버의 보완: Nginx는 정적 파일 서빙 및 부하 분산에 특화되어 있어 웹 응용 프로그램 서버(예: Apache, Node.js)와 함께 사용하여 서비스의 전체적인 성능을 최적화한다.
- 보안 강화: Nginx는 보안 설정을 통해 웹 서버를 안전하게 운영할 수 있도록 도와주며, DDoS 공격 및 다양한 보안 위협으로부터 보호할 수 있다.
- 컨테이너 및 마이크로서비스 환경 지원: Nginx는 컨테이너 환경에서 사용하기 적합하며, 마이크로서비스 아키텍처에서 필요한 부하 분산 및 라우팅을 효율적으로 구현할 수 있다.
4. Nginx 구조 및 주요 구성 요소
- Master Process: Nginx를 시작할 때 실행되며, 설정 파일을 읽고 워커 프로세스를 관리한다.
- Worker Processes: 실제 요청을 처리하고 응답을 반환하는 프로세스들이다. 이들은 Master Process의 지시에 따라 동작하며, 여러 개의 Worker Process가 병렬로 동작하여 성능을 향상시킨다.
- Configuration: Nginx의 설정은 각종 디렉토리와 파일에 나누어 저장된다. 이러한 설정은 설정 파일을 통해 정의되며, 서버의 동작 방식 및 동작에 영향을 받는다.
5. Nginx 디렉토리 구조
- /etc/nginx: Nginx 설정 파일들이 위치한 디렉토리다.
- /etc/nginx/nginx.conf: Nginx의 주요 설정 파일로, 전체적인 서버의 동작 방식 및 설정을 포함하고 있다.
- /etc/nginx/sites-available, /etc/nginx/sites-enabled: 가상 호스트(Virtual Host) 설정 파일들이 위치한 디렉토리다.
sites-available
에 설정 파일을 작성하고, 필요 시sites-enabled
로 심볼릭 링크를 생성하여 활성화할 수 있다. - /var/log/nginx: Nginx의 로그 파일들이 위치한 디렉토리다. 주요 로그 파일은
access.log
(접속 로그)와error.log
(에러 로그)다. - /usr/share/nginx/html: 기본적으로 Nginx가 서빙하는 정적 파일들이 위치한 디렉토리다.
6. 주요 설정 파일과 역할
- nginx.conf: Nginx의 주요 설정 파일로, 전반적인 동작을 제어하는데 사용된다.
- sites-available/, sites-enabled/: 가상 호스트 설정 파일들이 위치한 디렉토리로, 웹 서버의 가상 호스트에 대한 설정을 포함한다.
- conf.d/*.conf: 추가적인 설정 파일들이 위치한 디렉토리로, 모듈별로 설정을 정의할 때 사용한다.
7. nginx.conf 파일 구조 및 설정 블록
nginx.conf
파일은 중요한 설정들을 블록으로 구성하여 관리한다. 각 블록은 중괄호({})로 감싸져 있다
- main : 전반적인 설정을 관리하는 블록으로, 전역 설정들을 포함한다.
- Core 모듈 : 코어 모듈은 대부분 환경 설정 파일의 최상단에 위치하며 한번만 사용할 수 있다. nginx의 기본적인 동작 방식을 정의한다.
- http 블록 : 웹서버에 대한 동작을 설정하는 영역으로, server 블록과 location 블록의 루트 블록이다.
- server 블록 : 하나의 웹사이트를 선언하는 데 사용된다. 가상 호스팅(Virtual Host)의 개념이다.
- location 블록 : server 블록 내에서 특정 URL을 처리하는 방법을 정의한다.
- events : 주로 네트워크 동작에 관련된 설정하는 영역으로, 이벤트 모듈을 사용한다.
보통 /etc/nginx/* 아래에 설정파일이 위치해있고, 로그파일은 /var/log/nginx/* 에 위치해있다.
user nginx; # 프로세스의 실행되는 권한. 보안상 root를 사용하지 않는다.
worker_processes 1; # 프로세스를 생성할 것인지를 지정. 1이면 모든 요청을 하나의 프로세스로 실행, CPU 멀티코어 시스템에서 1이면 하나의 코어만으로 요청을 처리. 보통 auto로 적용한다.
error_log /var/log/nginx/error.log warn; # 로그 레벨을 설정. 로그레벨은 [ debug | info | notice | warn | error | crit ] 같은 종류가 있다.
pid /var/run/nginx.pid; # nginx의 마스터 프로세스 id정보가 저장된다.
events {
worker_connections 1024; # 하나의 프로세스가 처리할 수 있는 커넥션의 숫자
}
http {
include /etc/nginx/mime.types; # 옵션 항목을 설정해둔 파일의 경로를 지정하는데 보통 파일 확장명과 MIME 타입 목록을 지정한다.
default_type application/octet-stream; # 옥텟 스트림 기반의 http를 사용한다는 지시어
# orgin 서버라고도 하는데, 여기서는 WAS, 웹 어플리케이션 서버를 의미하며 nginx는 downstream에 해당한다. nginx와 연결한 웹 어플리케이션 서버를 지정하는데 사용되며 하위에 있는 server 지시어는 연결할 웹 어플리케이션 서버의 host주소:포트를 지정한다.
upstream docker-server {
server server:8080;
}
# 하나의 웹 사이트를 선언하는데 사용된다. server 블록이 여러 개이면 한 개의 머신(호스트)에 여러 웹사이트를 서빙할수있으며 가상 호스트라고 한다. 실제로 호스트는 1개인데, 여러 개 인것처럼 보이게 만든다.
server {
listen 80; # 이 웹 사이트가 바라보는 포트이다.
server_name localhost; # 클라이언트가 접속하는 서버(주로 도메인). 이것과 실제로 들어온 request의 header에 명시된 값이 일치하는지 확인해서 server를 분기해준다.
# server 블록 안에서 특정 웹 사이트의 url을 처리하는데 사용한다. 예를 들어 https://web.com/internal과 https://web.com/external로 접근하는 요청을 다르게 처리하고 싶을 때 사용한다. 내부의 root는 웹사이트가 바라보는 root 폴더의 경로를 의미한다.
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri$uri/ /index.html =404;
}
location /api {
proxy_pass http://docker-server;
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;
}
location /socket {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_pass http://docker-server;
}
}
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 on;
server_tokens off; # 헤더에 nginx버전을 숨기는 기능을 한다. 보안상 off로 설정을 권장
keepalive_timeout 65; # 접속시 커넥션 유지 시간을 지정한다.
include /etc/nginx/conf.d/*.conf;
}
Nginx는 현대적인 웹 서버 환경에서 필수적인 도구로써, 안정성, 성능, 보안 측면에서 웹 애플리케이션을 운영하는데 필수적이다. Nginx의 효율적인 활용은 웹 서비스의 성능 향상과 안정성 확보에 큰 기여를 할 것이다.
NGINX 환경파일 공식문서
- nginx.conf : 어플리케이션 기본 환경 설정
- proxy.conf : 프록시 관련 환경 설정
- fastcgi.conf : FastCGI 관련 환경 설정
- mime.types : 파일 확장명과 MIME 타입 목록
관련자료
댓글 0
등록된 댓글이 없습니다.