본 매뉴얼은 nginx repo 에서 제공되는 버전으로 설치를 진행 후, brotli 압축 및 보안에 관한 몇가지 모듈을 추가하는 매뉴얼입니다. 문서를 참조하신 후 각자의 환경에 맞춰서 수정하여 사용하시면 됩니다.
nginx 의 repo 에는 stable 과 mainline 의 이름을 가진 두가지 배포판이 존재합니다. 각각의 특징은 다음과 같습니다.
1. Stable 릴리스
목적: 안정성을 중시하는 사용자들을 위해 제공됩니다.
특징: 기능 추가보다는 버그 수정 및 보안 패치에 집중합니다. 새로운 기능이 도입되기보다는 기존 기능의 안정성을 보장하는 데 중점을 둡니다.
업데이트 빈도: Mainline 릴리스에 비해 업데이트 빈도가 낮습니다. 주로 중요한 버그 수정이나 보안 패치가 있을 때만 업데이트됩니다.
적합한 환경: 프로덕션 환경에서 사용하기에 적합합니다. 안정성과 보안이 최우선인 경우, Stable 릴리스를 사용하는 것이 좋습니다.
2. Mainline 릴리스
목적: 최신 기능을 신속하게 제공하기 위해 제공됩니다.
특징: 새로운 기능, 성능 개선, 및 기타 변경 사항이 빠르게 반영됩니다. 안정성보다는 최신 기술 적용 및 기능 추가에 중점을 둡니다.
업데이트 빈도: 업데이트가 빈번하며, 새로운 기능이나 성능 개선이 빠르게 도입됩니다.
적합한 환경: 최신 기능을 테스트하거나 필요로 하는 개발 및 테스트 환경에 적합합니다. 프로덕션 환경에서도 사용할 수 있지만, 최신 기술을 빠르게 적용해야 하는 경우에 주로 사용됩니다.
요약하자면, Stable은 안정성과 보안을 우선시하는 릴리스 트랙이고, Mainline은 최신 기능과 개선 사항을 빠르게 반영하는 트랙입니다. 프로덕션 환경에서는 보통 Stable 버전을 사용하는 것이 일반적이고, 최신 기능이나 기술을 필요로 하는 환경에서는 Mainline 버전을 사용할 수 있습니다.
/etc/yum.repos.d/nginx.repo 파일을 생성해서 아래의 내용을 작성합니다.
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
위의 배포판에 대한 설명을 참조하신 후 하나를 선택하여 아래의 명령을 실행 후, nginx 를 설치합니다.
# mainline 선택시
yum-config-manager --enable nginx-mainline
# stable 선택시
yum-config-manager --enable nginx-stable
# nginx 설치
yum install nginx
설치된 nginx 의 버전을 확인합니다.
[root@manuzcom ~]# nginx -v
nginx version: nginx/1.27.1
[root@manuzcom ~]#
설치된 버전과 동일한 버전의 nginx 소스를 다운로드 후 압축을 풉니다.
# 같은 버전의 nginx의 소스를 다운로드
cd ~
wget http://nginx.org/download/nginx-1.27.1.tar.gz
tar xvzf nginx-1.27.1.tar.gz
추가 모듈은 2가지를 설치합니다. 하나는 gzip 과 같은 컨텐츠 압축 전달을 위한 brotli 모듈, 그리고 또 하나는 http 헤더에 추가적인 정보를 넣거나 빼기 위한 headers-more 모듈입니다.
Brotli 에 대하여
Brotli는 Google에서 개발한 최신 데이터 압축 알고리즘으로, 웹 페이지 및 기타 콘텐츠를 더 작게 압축하여 네트워크 전송 속도를 높이는 데 사용됩니다. Brotli는 주로 HTTP 콘텐츠 인코딩 방법으로 사용되며, Gzip보다 더 나은 압축률을 제공하면서도 비슷한 압축 및 해제 속도를 유지합니다. 이는 웹 페이지의 로딩 시간을 단축하고 대역폭을 절약하는 데 도움이 됩니다.
텍스트 파일 압축: HTML, CSS, JavaScript와 같은 텍스트 파일을 Brotli 알고리즘으로 압축하여 클라이언트에게 전달할 수 있습니다.
압축 수준 설정: 압축 수준을 조정하여 압축률과 성능 사이의 균형을 맞출 수 있습니다. 압축 수준이 높을수록 더 작은 파일 크기를 얻을 수 있지만, CPU 사용량이 증가할 수 있습니다.
브라우저 호환성: 대부분의 현대적인 웹 브라우저는 Brotli 압축을 지원합니다. Nginx는 클라이언트가 Brotli를 지원하는지 확인하고, 지원하는 경우에만 Brotli로 압축된 콘텐츠를 제공합니다.
장점
높은 압축률: Gzip보다 더 높은 압축률을 제공하므로, 페이지 로딩 시간을 더 단축할 수 있습니다.
광범위한 브라우저 지원: 대부분의 최신 브라우저는 Brotli를 지원하므로, 많은 사용자가 혜택을 누릴 수 있습니다.
단점
추가적인 CPU 사용량: 높은 압축률을 위해 CPU 사용량이 증가할 수 있으며, 서버 리소스가 부족한 경우 성능에 영향을 미칠 수 있습니다. 즉, 웹의 반응이 굉장히 느려질 수 있습니다. TTFB 반응에 악영향. 하지만 서버 성능에 맞추어 잘 설정하면 오히려 좋아. 러키비기자나!
복잡한 설치: 기본 Nginx에는 포함되어 있지 않으므로, 추가적인 설치 및 설정 과정이 필요합니다. - 귀찮다는 소리임.
Brotli 모듈을 활용하면 웹 사이트의 성능을 향상시킬 수 있지만, 서버 리소스와 호환성 요구 사항을 고려해야 합니다.
header-more 모듈에 대하여
nginx 를 사용하는 웹서버의 헤더에 보면 nginx 를 사용하는 것과 버전정보까지 노출되는 것을 알 수 있습니다. 하지만 이것을 없애기 위해서 server_tokens off; 설정을 사용하면 Nginx가 클라이언트에게 보내는 응답 헤더와 자동 생성된 에러 페이지에서 Nginx의 버전 정보만 제거됩니다. 이 설정을 적용하면 HTTP 응답 헤더의 Server 필드에서 버전 번호가 제거되지만, 여전히 nginx라는 문자열은 남아 있어 Nginx를 사용하고 있다는 사실은 노출됩니다.
즉, 다음과 같습니다.
기본 설정 (server_tokens on;) : HTTP 응답 헤더에 Server: nginx/1.20.1과 같이 Nginx의 버전 정보가 포함됩니다.
server_tokens off; 설정 적용 시 : HTTP 응답 헤더에 Server: nginx로 Nginx라는 정보는 남지만, 버전 정보는 제거됩니다.
따라서 nginx 를 사용하고 있다는 사실까지 숨기기 위해 headers-more 모듈을 설치합니다. 이 모듈을 설치하게 되면 hide_server_tokens on; 이라는 지시문을 사용할 수 있게 됩니다. 이 지시문을 사용하여 Server: 라는 HTTP 응답 헤더를 완전히 숨기는 것이 가능합니다.
cd ~
# https://github.com/openresty/headers-more-nginx-module/tags
# 위 주소에서 최신버전 다운로드
wget https://github.com/openresty/headers-more-nginx-module/archive/v0.37.tar.gz -O headers-more-nginx-module-0.37.tar.gz
tar xvzf headers-more-nginx-module-0.37.tar.gz
# Brotli
dnf install brotli brotli-devel
git clone --recursive https://github.com/google/ngx_brotli.git
cd /root/ngx_brotli && git submodule update --init && cd /root/nginx-1.27.1
# 컴파일 준비
cd ~
dnf install gcc-c++ pcre-devel zlib-devel make unzip libuuid-devel libxslt libxslt-devel gd-devel perl-ExtUtils-Embed gperftools
## 모듈별로 컴파일
cd ~/nginx-1.27.1
./configure --with-compat --add-dynamic-module=/root/headers-more-nginx-module-0.37 --add-dynamic-module=/root/ngx_brotli
make modules
## 컴파일된 모듈 nginx 폴더로 복사
cp ./objs/*.so /etc/nginx/modules
모듈의 컴파일과 설치는 완료되었습니다. nginx 설정에 모듈 사용을 선언합니다.
/etc/nginx/nginx.conf 파일을 수정하여 아래의 내용을 추가하도록 합니다.
load_module "modules/ngx_http_headers_more_filter_module.so";
load_module "modules/ngx_http_brotli_static_module.so";
load_module "modules/ngx_http_brotli_filter_module.so";
server_tokens off;
hide_server_tokens on;
#http 블록에 아래의 내용 추가
http {
brotli on;
brotli_static on;
brotli_comp_level 6;
brotli_types text/plain text/css application/javascript application/json image/svg+xml application/xml+rss;
}
이제 nginx 가 파일을 서빙할때 위 설정에 선언된 타입과 같은 파일의 경우에는 brotli 압축이 진행된 후 서빙되게 됩니다. comp_level 을 높이게 되면 서버의 성능에 따라 TTFB 시간이 길어질 우려가 있으니 5-7 정도의 레벨로 유지하는 것이 좋습니다.
압축하여 제공해야 하는 파일들의 변경이 거의 없는 경우의 파일이라면 brotli_static on; 옵션을 켜두었다면, 미리 brotli 압축을 진행하여 파일을 압축해두면 nginx 가 실시간으로 압축하지 않고 미리 압축되어있는 파일을 서빙하게 할 수 있습니다. 파일의 압축 방법은 다음과 같습니다.
[manu@manuz css]$ brotli --best style.css
[manu@manuz css]$ ls -al *.br
-rw-r--r-- 1 manu manu 10009 Aug 26 13:34 style.css.br
[manu@manuz css]$
이제 nginx 는 미리 압축된 style.css.br 파일을 서빙하게 됩니다.