1.개요
지금까지 내가 운영했던 대부분의 웹 서버는 nginx였다. 그리고 이번에 정기점검 페이지 전환 작업을 위한 proxy 서버 또한 nginx로 구성하게 되었는데 이렇게 nginx를 많이 사용하면서 제대로 공부한 적은 없던 것 같아 이번 기회에 한번 정리를 해보려 한다.
2. nginx의 기본 원리
Nginx는 하나의 master process와 하나 이상의 worker process로 구성되어 있다.
- master process : configuration file을 읽고 실행하며 worker process들을 관리
- worker process : 유저가 요청한 request에 대한 실제 작업을 수행
즉, Nginx는 멀티 프로세스 싱글 스레드 방식으로 동작한다.
* 비동기 이벤트 방식으로 동작하여 메모리 사용률이 낮고, 클라이언트의 요청마다 프로세스, 스레드를 생성하는 apache에 비해 N개의 고정된 프로세스로 처리하기 때문에 요청이 많아져도 CPU, 메모리 사용을 유지할 수 있다.
* 비동기 : Async, 어떠한 작업이 동시에 일어날 수 있다는 개념. 반대로 동기(Sync)의 경우 순차적으로 실행된다.
3. Configuration File 구조 분석
Nginx의 기본 설정 파일은 nginx.conf 이며 보통 /etc/nginx, /usr/local/etc/nginx 등의 경로에 존재한다.
Nginx의 모듈들은 configuration 파일에 있는 directives에 의해서 제어된다.
directives에는 두 가지 종류가 있다.
user, worker_processes 등 가장 위 4줄은 simple directive, 나머지 { } 로 감싸진 events, http 등의 경우 block directive이다.
simpel directive
이름, 인자값이 있고 세미콜론(;) 으로 끝난다.
- user : linux 시스템의 어떤 사용자가 Nginx 서버를 동작할 지 정의한다.
- worker_processes : 몇 개의 thread가 사용될지 정의한다. (CPU 코어 수에 맞추는 것이 권장됨)
- pid : Nginx pid 가 기재된 파일이다.
- incloud : 외부 configuration 내용을 가져온다. (모듈에 따라 다른 파일에 작성하고 incloud하는 것이 권장됨)
block directive
simple directive와 구성이 같지만 세미콜론 대신 추가적인 설정들이 { } 내부에 들어간다.
nginx.conf 파일의 초기 구성은 다음과 같다.
# /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
. . .
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
events 블록
events 블록은 네트워크의 작동 환경을 설정하는 지시어를 제공한다.이벤트 블록의 지시어는 이벤트 블록에서만 사용할 수 있고, http, server, local 블록과는 상속 관계를 갖지 않는다. 다음 지시어는 반드시 events 블록 내에서만 사용해야 한다.
- accept_mutex : LISTEN 소켓을 오픈하기 위한 accept 뮤텍스의 사용/해제를 설정한다.
- accept_mutex_delay : 자원 획득을 다시 시도하기 전에 작업자 프로세스가 기다려야 하는 시간을 정의한다.
- worker_connections : Worker Process 가 동시에 처리할 수 있는 접속자 수를 정의한다. (worker_processes * worker_connections = 최대 접속자 수)
http 블록
http 블록은 웹 트래픽을 처리하는 디렉티브를 담고있다. 서버 전체에 적용되는 전역 설정들이 들어간다. 보통 HTTP 리다이렉트, SSL/TLS 구성, HTTP/2 활성화 등 전반적인 HTTP 설정을 한다.
- 여러 conf를 생성하여 따로 관리할 예정이라 관리를 용이하게 하기 위해 conf.d 디렉터리에 conf를 쪼개어 구성하여 위 코드에선 http 블록이 제외되었다.
- 그렇지만 부모격인 nginx.conf에 해당 proxy-test.conf가 incloud되어있기 때문에 http 모듈은 적용받고 있는 상태이다.
# /etc/nginx/conf.d/cwtest.conf
server {
listen 80;
server_name test1.cwking.net ;
location / {
root /data/www;
}
}
Server 블록
Server 블록은 각 독립된 서버/호스트의 고유 설정을 가지며 도메인, 서브도메인, 포트 등 설정을 정의한다. 하나의 http 블록 내에 여러개 server블록을 정의할 수 있으며 server 블록들은 각각 독립적인 설정을 담당한다.
- 본인처럼 별도의 파일로 분리하여 관리할 수 있다.
listening port
listen 설정으로 nginx에게 http 연결을 위해 필요한 hostname/IP와 port를 지정할 수 있다. 본인은 80port로 지정하였다.
- server_name : 하나의 IP 주소에 여러개의 도메인을 사용할 수 있게 한다. 서버는 전달받은 요청 헤더(request header)에 기반하여 어떤 도메인을 서브할지 결정한다.
- ex, 본인은 test1.cwking.net 서브도메인으로 구성했다.
location 블록
location은 서버 안 리소스에 대한 요청을 어떻게 응답해야 할 지 설정한다. 특정 파일과 특정 디렉토리에 대한 요청을 처리한다.
'DevOps > open source_오픈소스' 카테고리의 다른 글
[NGINX] Nginx에서 Client IP(접속자 IP) 확인 방법 (0) | 2024.10.07 |
---|---|
[NGINX] nginx reverse proxy (0) | 2024.09.09 |
[Redmine] 프로젝트 관리 오픈소스, 레드마인 (1) | 2023.11.30 |