Ngnix 설명
nginx는 기존 웹서버에서 많은 트래픽을 감당하기 위해서 확정성을 가지고 설계된 비동기 이벤트 드라이븐 방식의 웹서버를 칭한다.
Nginx 설치
nginx를 맥이 있으면 brew를 통해서 간단하게 설치가 가능하다.
1 | brew install nginx | cs |
Nginx 프로세스
nginx는 하나의 마스터 프로세스와 여러 worker 프로세스를 가진다. 마스터 프로세스의 주요 목적은 read 권한 그리고 성능 측정과 worker 프로세스 관리이다. worker 프로세스는 요청을 처리한다. nginx는 event-based 모델을 사용하고 worker 프로세스 사이에 요청을 효율적으로 분배하기 위해서 os에 의존하는 매커니즘을 사용한다. worker 프로세스에 개수는 설정 파일에서 정의되며 정의된 프로세스 개수와 사용가능한 cpu 코어 숫자에 맞게 자동으로 조정된다.
Nginx 동작 -S
nginx를 동작시키기 위해서는 다음 옵션을 붙여서 진행한다.
1 | nginx -s signal | cs |
signal의 종류는 다음과 같다.
종류 |
설명 |
stop |
빠른 중지 |
quip |
graceful stop ##graceful stop은 요청이 중단되었을 때 로드밸런스에게 해당 노드에 요청을 추가적으로 못하게 하고 현재 노드에 작업을 중지시키고 정상적으로 끝내는 것을 말한다. |
reload |
설정 파일 재 로드 |
reopen |
로그 파일 재 오픈 |
quip를 진행하면 현재 요청을 워커 프로세스에게 끝내라고 보낸다. 그럼 해당 워커 프로세스에 새로운 요청을 보내지 않고 워커 프로세스가 진행중이던 작업이 마무리되면 정상적으로 애플리케이션이 꺼진다. 이를 graceful stop이라고 한다.
reload를 진행하면 syntax 체크를 진행하고 성공하게 되면 older worker 프로세스를 중지 시키고 새로운 worker 프로세스를 만들어서 동작 시킨다. 만약 설정이 이상하면 마스터 프로세스는 작업을 롤백하고 예전 설정으로 동작한다. 중지 요청을 받은 workder 프로세스들은 새로운 요청을 받는 것을 멈추고 자신이 하고 있는 동작을 마무리 한다. 이 동작이 완료되면 그때 older worker 프로세스는 죽는다.
Nginx 설정파일
nginx 정책과 그 모듈들에 동작은 /usr/local/nginx/conf, /etc/nginx, /usr/local/etc/nginx 위치중에 존재하는 nginx.conf 파일 내에서 설정한대로 동작한다. (brew로 설치하는 경우 /usr/local/etc/nginx에 위치)
설정 파일 구조.
설정 파일에 입력하는 값들은 두 가지 형태로 입력이 가능하다. simple 디렉티브와 block 디렉티브 두 가지이다. simple은 이름과 파라미터로 구성되어있고 마지막에 ;이 붙는다. block 디렉티브은 simple과 구조가 같지만 끝에 ; 대신 ({ })이 붙는다. block 명령은 내부에 다른 명령들을 포함할 수있다.
events, http 명령은 main context에 위치하고 server, location은 http에 위치한다.
static content
웹 서버에서 중요한 역할중 하나는 image, html pages와 같은 정적 페이지를 전달하는 것이다. 이를 위해서 http 블록 내부에 있는 server와 location 블록을 수정해보자.
일반적으로 설정 파일은 server_name과 listen port로 구분되는 여러 server 블록을 가지고 있다.
1 2 3 4 | http { server { } } | cs |
기본형태는 이렇다.
그럼 이걸 이용해서 static content에 접근할 수 있게 해보자.
아래와 같이 설정하면 /dd로 오는 요청은 무조건 저쪽 static 페이지를 통하게 된다.
1 2 3 4 | location /dd { root /Users/we/Documents index index.html } | cs |
만약 호출 uri가 중첩되는 경우가 아래와 같이 발생하면 가장 긴 uri의 매칭을 따르게 된다.
1 2 3 4 5 6 7 8 9 | server { location / { root /data/www; } location /images/ { root /data; } } | cs |
만약 설정이 정상적으로 동작하지 않을 때는 로그를 확인해봐야 한다. 로그에는 access.log, error.log가 존재한다. 맥 기준으로 log 폴더는 /usr/local/var/log/nginx에 존재한다.
proxy 설정
정적 페이지 연결과 더불어서 proxy로서 역할을 진행할 수 있다. 여러 서버들 사이에서 요청을 분배하는 것을 reverse proxy라고 한다.
proxy설정은 정적 페이지와 동일하게 http 블록 내에 server 블록으로 설정한다.
1 2 3 4 5 6 7 8 9 10 11 12 | server { listen 80; location / { proxy_pass http://127.0.0.1:8081; } location /dd { root /Users/we/Documents/static; index index.html; } } | cs |
만약 listen을 기재하지 않으면 80으로 기본으로 매핑된다. 만약 아래와 같이 server 바로 밑에 root를 적게되면 server에 기재한 root에서 정적페이지 index.html을 찾고 각 location에 root를 입력해도 무시된다.
1 2 3 4 5 6 7 | server { listen 8080; root /data/up1; location / { } } | cs |
또한 경로 매핑을 정규식으로도 진행할 수 있다. 아래와 같이 설정하면 .gif, .jpg, .png 형태로 들어오는 경우에 매핑 된다.
1 2 3 | location ~ \.(gif|jpg|png)$ { root /data/images; } | cs |
설정 파일 폴더 구조
sites-available
: 가상 서버 환경들에 대한 설정 파일들이 위치하는 부분. 가상 서버를 사용하거나 사용하지 않던간에 그에 대한 설정 파일들이 위치하는 곳sites-enabled
:sites-available
에 있는 가상 서버 파일들중에서 실행시키고 싶은 파일을 symlink로 연결한 폴더. 실제로 이 폴더에 위치한 가상서버 환경 파일들을 읽어서 서버를 세팅한다.nginx.conf
: Nginx에 관한 설정파일로 Nginx 설정에 관한 블록들이 작성되어 있으며 이 파일에서sites-enabled
폴더에 있는 파일들을 가져온다. (include 명령어를 사용).
gzip
gzip은 전달해오는 요청을 압축해서 진행하기 위해서 사용하는 옵션이다. types를 통해서 수용하는 타입도 정의할 수 있다.
apache와 많은 부분이 다르다. 정확하게 어떤 웹 서버가 좋다고 할 수는 없지만 많은 트래픽을 받는 경우에는 nginx를 사용하면 좋을 것 같다.