RockyLinux 10 Nginx 최신 버전 설치 및 Brotli·보안 모듈 적용

  • 1st July 2026
  • 12 min read

본 문서는 RockyLinux 10 환경에서 nginx 공식 저장소를 이용해 nginx mainline 버전을 설치하고, Brotli 압축 모듈과 보안 헤더 관련 동적 모듈을 추가로 컴파일하여 적용하는 방법을 정리한 서버 구축 매뉴얼입니다.

이 글은 RockyLinux 10 웹서버 구축 시리즈의 4편입니다. 앞선 글에서 기본 서버 설정, PHP 8.5, PHP-FPM, Valkey 기반 PHP 세션 저장소까지 구성했다면, 이번 글에서는 실제 웹 요청을 받아 PHP-FPM으로 전달할 nginx 웹서버를 구성합니다.

nginx는 기본 패키지만 설치해도 충분히 사용할 수 있지만, 운영 환경에서는 정적 파일 압축, 보안 헤더, 서버 정보 노출 제한, 캐시 설정, SSL/TLS 설정 등을 함께 정리해두는 것이 좋습니다. 특히 PHP 기반 CMS, 게시판, 뉴스 사이트, 기관 홈페이지처럼 정적 리소스와 PHP 요청이 함께 존재하는 구조에서는 nginx 설정 품질이 전체 응답 속도와 보안 수준에 직접적인 영향을 줍니다.


1. nginx 설치 방식 정리

RockyLinux에서 nginx를 설치하는 방법은 크게 두 가지입니다. 하나는 OS 기본 저장소에서 제공하는 nginx를 설치하는 방식이고, 다른 하나는 nginx 공식 저장소를 추가해서 최신 stable 또는 mainline 버전을 설치하는 방식입니다.

운영 서버에서는 OS 기본 저장소의 nginx도 사용할 수 있지만, Brotli 같은 추가 모듈을 직접 컴파일하거나 nginx 최신 기능을 활용하려면 nginx 공식 저장소를 사용하는 편이 관리하기 쉽습니다. 이 글에서는 nginx 공식 저장소를 추가하고 mainline 버전을 설치하는 방식으로 진행합니다.

Stable 과 Mainline 차이

  • Stable: 안정성을 중시하는 릴리스입니다. 기능 추가보다는 버그 수정과 안정성 유지에 초점이 있습니다.

  • Mainline: 최신 기능과 개선 사항이 빠르게 반영되는 릴리스입니다. nginx 공식 문서에서도 mainline과 stable 저장소를 모두 제공합니다.

실무적으로는 보수적인 운영 서버라면 stable을 선택하고, HTTP/3, 최신 보안 패치, 최신 기능 반영을 빠르게 따라가야 하는 서버라면 mainline을 선택할 수 있습니다. 이 문서에서는 사용자가 메모해둔 기준에 맞춰 mainline을 사용합니다.


2. nginx 저장소 추가

nginx 공식 저장소 설정 파일을 생성합니다.

vi /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

기본값은 stable 저장소가 활성화되어 있습니다. mainline 버전을 설치하려면 아래 명령으로 mainline 저장소를 활성화합니다.

dnf config-manager --set-enabled nginx-mainline

이후 nginx를 설치합니다.

dnf install -y nginx

설치가 완료되면 nginx 버전을 확인합니다.

nginx -v

이 글에서는 예시로 nginx-1.31.2 기준으로 진행합니다. 실제 서버에 설치된 버전이 다르다면, 이후 소스 다운로드 단계에서 반드시 설치된 nginx와 동일한 버전의 소스를 받아야 합니다.


3. 설치된 nginx와 동일한 버전의 소스 다운로드

nginx 동적 모듈을 컴파일하려면 현재 설치된 nginx와 동일한 버전의 nginx 소스가 필요합니다. 버전이 맞지 않으면 모듈 로드 시 binary compatibility 문제가 발생할 수 있습니다.

cd ~
wget http://nginx.org/download/nginx-1.31.2.tar.gz

tar xvzf nginx-1.31.2.tar.gz

다운로드할 버전은 반드시 nginx -v로 확인한 버전과 맞춰야 합니다.

nginx -v
# nginx version: nginx/1.31.2

4. 추가로 설치할 nginx 모듈

이번 구성에서는 nginx 기본 패키지에 포함되지 않은 모듈 3가지를 추가로 컴파일합니다.

  • ngx_brotli: gzip보다 높은 압축률을 제공하는 Brotli 압축 모듈입니다.

  • headers-more-nginx-module: nginx 응답 헤더를 더 세밀하게 제어할 수 있는 모듈입니다. 서버 정보 노출을 줄이는 데 사용할 수 있습니다.

  • ngx_security_headers: 보안 관련 HTTP 헤더를 관리하기 위한 모듈입니다.

nginx는 모듈을 정적으로 포함하여 다시 빌드할 수도 있고, --with-compat 옵션을 이용해 동적 모듈 형태로 빌드할 수도 있습니다. 여기서는 운영 중인 nginx 패키지를 유지하면서 필요한 모듈만 .so 파일로 컴파일하는 동적 모듈 방식을 사용합니다.


5. headers-more 모듈 다운로드

headers-more 모듈은 nginx 응답 헤더를 추가, 변경, 제거하는 데 사용할 수 있습니다. 기본 nginx 설정의 server_tokens off;는 버전 정보는 숨기지만 Server: nginx라는 서버 이름은 남습니다. 더 강하게 서버 정보를 숨기려면 headers-more 계열 모듈을 활용할 수 있습니다.

cd ~

# https://github.com/openresty/headers-more-nginx-module/tags
# 위 주소에서 최신 버전 확인 후 다운로드
wget https://github.com/openresty/headers-more-nginx-module/archive/v0.40.tar.gz -O headers-more-nginx-module-0.40.tar.gz

tar xvzf headers-more-nginx-module-0.40.tar.gz

버전은 글 작성 시점의 예시입니다. 실제 설치 시에는 GitHub tags 페이지에서 최신 릴리스를 확인한 후 사용하는 것이 좋습니다.


6. ngx_security_headers 모듈 다운로드

ngx_security_headers 모듈은 보안 관련 응답 헤더를 관리하는 데 사용하는 모듈입니다. 일반적으로 웹서버에서는 X-Content-Type-Options, X-Frame-Options, Referrer-Policy, Content-Security-Policy 같은 헤더를 적절히 설정해야 합니다.

단, 보안 헤더는 사이트 구조와 프론트엔드 리소스 구성에 따라 다르게 적용해야 합니다. 특히 Content-Security-Policy는 외부 스크립트, 폰트, 이미지, 지도 API, 결제 모듈, 광고 스크립트 사용 여부에 따라 세밀하게 조정해야 하므로 무작정 강하게 적용하면 사이트 기능이 깨질 수 있습니다.

cd ~

# https://github.com/GetPageSpeed/ngx_security_headers/tags
# 위 주소에서 최신 버전 확인 후 다운로드
wget https://github.com/GetPageSpeed/ngx_security_headers/archive/0.3.0.tar.gz -O ngx_security_headers-0.3.0.tar.gz

tar xvzf ngx_security_headers-0.3.0.tar.gz

7. Brotli 모듈 다운로드

Brotli는 Google에서 개발한 압축 알고리즘입니다. HTML, CSS, JavaScript, JSON, SVG 같은 텍스트 기반 리소스를 전송할 때 gzip보다 더 좋은 압축률을 기대할 수 있습니다.

nginx에서 Brotli를 사용하려면 ngx_brotli 모듈을 추가해야 합니다. 이 모듈은 git submodule을 사용하므로 --recursive 옵션으로 clone 하는 것이 좋습니다.

dnf install -y brotli brotli-devel git

git clone --recursive https://github.com/google/ngx_brotli.git
cd /root/ngx_brotli && git submodule update --init

Brotli를 사용하면 정적 리소스 전송량을 줄일 수 있지만, 실시간 압축 레벨을 너무 높게 설정하면 CPU 사용량이 증가하고 TTFB가 길어질 수 있습니다. 운영 서버에서는 보통 brotli_comp_level 5 또는 6 정도부터 테스트하는 것이 무난합니다.


8. 컴파일 도구 설치

nginx 모듈을 빌드하려면 컴파일에 필요한 패키지가 필요합니다. 서버에 따라 이미 설치되어 있을 수 있지만, 깨끗한 서버라면 아래 패키지를 먼저 설치합니다.

dnf install -y gcc gcc-c++ make pcre-devel zlib-devel openssl-devel

모듈이나 nginx 빌드 옵션에 따라 추가 라이브러리가 필요할 수 있습니다. 빌드 중 특정 헤더 파일이나 라이브러리가 없다는 오류가 발생하면 해당 devel 패키지를 추가 설치하면 됩니다.


9. nginx 동적 모듈 컴파일

nginx 소스 디렉터리로 이동한 뒤 ./configure를 실행합니다. 여기서 핵심은 --with-compat 옵션입니다. 이 옵션은 패키지로 설치된 nginx와 호환되는 동적 모듈을 만들기 위해 사용합니다.

cd ~/nginx-1.31.2

./configure \
    --with-compat \
    --add-dynamic-module=/root/headers-more-nginx-module-0.40 \
    --add-dynamic-module=/root/ngx_security_headers-0.3.0 \
    --add-dynamic-module=/root/ngx_brotli

make modules

빌드가 성공하면 objs 디렉터리 안에 .so 파일이 생성됩니다.

ls -al ./objs/*.so

생성된 모듈 파일을 nginx 모듈 디렉터리로 복사합니다.

cp ./objs/*.so /etc/nginx/modules

복사 후 모듈 파일이 존재하는지 확인합니다.

ls -al /etc/nginx/modules

10. nginx 서비스 등록

nginx가 부팅 시 자동으로 시작되도록 등록합니다.

systemctl enable nginx

아직 설정 파일을 작성하지 않았다면 바로 시작하지 말고, 먼저 nginx 설정을 정리한 뒤 nginx -t로 검증하는 것이 좋습니다.


11. nginx.conf 기본 설정

nginx의 메인 설정 파일을 수정합니다.

vi /etc/nginx/nginx.conf

아래는 PHP 웹서비스 운영을 기준으로 한 예시 설정입니다. 서버 성능, 동시 접속 수, 파일 수, 로그 정책에 따라 값을 조정해서 사용하면 됩니다.

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log crit;
pid        /run/nginx.pid;

worker_rlimit_nofile 100000;

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";
load_module "modules/ngx_http_security_headers_module.so";

events {
    worker_connections 4000;
    use epoll;
    multi_accept on;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    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;

    open_file_cache max=200000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;

    client_max_body_size 200M;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    types_hash_max_size 2048;

    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;

    gzip on;
    gzip_comp_level 6;
    gzip_vary on;
    gzip_min_length 100;
    gzip_proxied any;
    gzip_types application/octet-stream text/plain text/css application/json application/x-javascript application/javascript text/xml application/xml application/rss+xml text/javascript image/svg+xml application/vnd.ms-fontobject application/x-font-ttf font/opentype;
    gzip_disable "msie6";

    reset_timedout_connection on;
    client_body_timeout 10;
    send_timeout 2;
    keepalive_timeout 30;
    keepalive_requests 100000;

    include /etc/nginx/conf.d/*.conf;
}

load_module 지시문은 반드시 eventshttp 블록보다 위쪽, 즉 메인 컨텍스트에 작성해야 합니다. 위치가 잘못되면 nginx가 시작되지 않습니다.


12. 주요 nginx 설정 설명

  • worker_processes auto: CPU 코어 수에 맞춰 worker 프로세스를 자동으로 설정합니다.

  • worker_connections 4000: worker 하나가 처리할 수 있는 최대 연결 수입니다. 서버 트래픽에 따라 조정합니다.

  • worker_rlimit_nofile: nginx 프로세스가 열 수 있는 파일 디스크립터 한도를 높입니다.

  • open_file_cache: 자주 접근하는 파일 정보 캐시를 유지해 정적 파일 서빙 성능을 높입니다.

  • client_max_body_size: 업로드 가능한 요청 본문 크기를 지정합니다. PHP의 upload_max_filesize, post_max_size와 함께 맞춰야 합니다.

  • sendfile on: 정적 파일 전송 성능을 높이는 설정입니다.

  • brotli_static on: 미리 압축된 .br 파일이 있으면 실시간 압축 대신 해당 파일을 제공합니다.

  • gzip on: Brotli를 지원하지 않는 클라이언트를 위해 gzip 압축도 함께 활성화합니다.


13. 보안 설정 파일 분리

보안 관련 설정은 여러 server 블록에서 재사용할 수 있도록 별도 파일로 분리하는 것이 좋습니다.

vi /etc/nginx/security.conf

아래 내용을 작성합니다.

server_tokens off;
security_headers on;
hide_server_tokens on;

server_tokens off;는 nginx 버전 정보를 숨깁니다. hide_server_tokens on;은 headers-more 모듈을 통해 서버 헤더 노출을 더 줄이기 위한 설정입니다. 단, 보안 헤더는 모듈 버전과 설정 방식에 따라 동작이 다를 수 있으므로 적용 후 반드시 응답 헤더를 확인해야 합니다.

curl -I http://도메인

14. 기본 사이트 설정 파일 생성

사이트별 nginx 설정은 /etc/nginx/conf.d 아래에 분리해서 작성합니다.

vi /etc/nginx/conf.d/www.conf

아래는 HTTP 80 포트용 기본 설정입니다. DOMAIN.COM, USER, /home/USER/src는 실제 환경에 맞게 변경해야 합니다.

server {
    listen       80 default_server;
    server_name  _ www.DOMAIN.COM;

    # HTTPS 강제 전환 시 사용
    # return 301 https://$host$request_uri;

    error_log /var/log/nginx/USER.error.log error;
    access_log /var/log/nginx/USER.access.log combined;

    root  /home/USER/src;
    index index.php index.html;

    error_page 400 401 402 403 404 405 /400;

    include /etc/nginx/security.conf;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ /(\.ht|\.git|\.svn) {
        access_log off;
        log_not_found off;
        deny all;
    }

    location ~* \.(js|less|css)$ {
        add_header X-Content-Type-Options "nosniff" always;
        include /etc/nginx/security.conf;
        access_log off;
        log_not_found off;
        expires max;
    }

    location ~* \.(js|less|css|png|jpg|jpeg|gif|ico|svg|wav|swf|eot|ttf|otf|woff|woff2|flv|mp3|mp4|xml)$ {
        access_log off;
        log_not_found off;
        expires max;
    }

    location ~ \.php$ {
        try_files      $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass   php-fpm;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

try_files $uri $uri/ /index.php$is_args$args; 설정은 PHP 프레임워크나 CMS에서 자주 사용하는 프론트 컨트롤러 패턴을 지원하기 위한 설정입니다. 실제 파일이 존재하면 해당 파일을 제공하고, 없으면 index.php로 요청을 넘깁니다.

location ~ /(\.ht|\.git|\.svn) 블록은 민감한 숨김 파일이나 버전관리 디렉터리에 대한 접근을 차단합니다. 운영 서버에서는 반드시 필요한 설정입니다.


15. PHP-FPM upstream 확인

위 예시에서는 fastcgi_pass php-fpm;을 사용합니다. 이 설정을 사용하려면 별도로 upstream이 정의되어 있어야 합니다. nginx 기본 설정에 없다면 아래처럼 추가할 수 있습니다.

upstream php-fpm {
    server 127.0.0.1:9000;
}

또는 PHP-FPM이 Unix socket으로 동작한다면 다음처럼 지정할 수 있습니다.

fastcgi_pass unix:/run/php-fpm/www.sock;

PHP-FPM 설정 파일의 listen 값과 nginx의 fastcgi_pass 값은 반드시 일치해야 합니다.

grep '^listen' /etc/php-fpm.d/www.conf

16. SSL 서버 블록 추가

HTTPS를 사용할 경우 443 포트용 server 블록을 추가합니다. 아래 예시는 기본 구조를 보여주기 위한 것입니다. SSL/TLS 설정은 서버의 nginx 버전, OpenSSL 버전, 브라우저 호환성 요구에 따라 반드시 최신 권장 설정을 확인해야 합니다.

server {
    listen       443 ssl http2;
    server_name  www.DOMAIN.COM;

    error_log /var/log/nginx/USER.ssl.error error;
    access_log /var/log/nginx/USER.ssl.access combined;

    root  /home/USER/src;
    index index.php index.html;

    ssl_certificate      /etc/letsencrypt/live/www.DOMAIN.COM/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/www.DOMAIN.COM/privkey.pem;

    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;

    error_page 400 401 402 403 404 405 /400;

    include /etc/nginx/security.conf;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ /(\.ht|\.git|\.svn) {
        access_log off;
        log_not_found off;
        deny all;
    }

    location ~* \.(js|less|css)$ {
        add_header X-Content-Type-Options "nosniff" always;
        include /etc/nginx/security.conf;
        access_log off;
        log_not_found off;
        expires max;
    }

    location ~* \.(js|less|css|png|jpg|jpeg|gif|ico|svg|wav|swf|eot|ttf|otf|woff|woff2|flv|mp3|mp4|xml)$ {
        access_log off;
        log_not_found off;
        expires max;
    }

    location ~ \.php$ {
        try_files      $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass   php-fpm;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

기존 메모에 있는 ssl on; 지시문은 현재 nginx 설정에서는 사용하지 않는 방향이 좋습니다. 대신 listen 443 ssl http2;처럼 listen 지시문에 ssl을 명시하는 방식을 사용합니다.

또한 TLSv1, TLSv1.1은 보안상 권장되지 않습니다. 특별히 오래된 클라이언트 호환성이 필요한 경우가 아니라면 TLSv1.2TLSv1.3만 사용하는 것이 일반적입니다.


17. Mozilla SSL/TLS 설정 생성기 활용

SSL/TLS 설정은 시간이 지나면서 권장값이 바뀝니다. 따라서 예전 설정을 계속 복사해서 사용하는 것보다 Mozilla SSL Configuration Generator 또는 TLSRef Configurator 같은 도구를 참고해 현재 서버 환경에 맞는 설정을 생성하는 것이 좋습니다.

https://ssl-config.mozilla.org/

설정 생성 시에는 다음 값을 실제 서버 환경에 맞춰 선택합니다.

  • Server Software: nginx

  • nginx version: 현재 설치된 nginx 버전

  • OpenSSL version: 서버에 설치된 OpenSSL 버전

  • Configuration: 일반 운영 서버라면 Intermediate 권장

OpenSSL 버전은 아래 명령으로 확인할 수 있습니다.

openssl version

18. nginx 설정 문법 검사

설정 파일을 수정한 뒤에는 nginx를 시작하거나 재시작하기 전에 반드시 문법 검사를 실행합니다.

nginx -t

정상이라면 다음과 유사한 메시지가 출력됩니다.

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

오류가 있다면 nginx를 재시작하지 말고, 표시된 파일명과 라인 번호를 기준으로 먼저 수정해야 합니다.


19. nginx 서비스 시작

설정 검사가 완료되면 nginx 서비스를 시작합니다.

systemctl start nginx

상태를 확인합니다.

systemctl status nginx

설정 변경 후에는 다음 명령으로 재시작하거나 reload 할 수 있습니다.

systemctl reload nginx
# 또는
systemctl restart nginx

일반적인 설정 변경은 reload로 충분합니다. 모듈 로드나 nginx 프로세스 자체 재기동이 필요한 경우에는 restart를 사용합니다.


20. Brotli 동작 확인

Brotli가 정상적으로 적용되는지 확인하려면 Accept-Encoding: br 헤더를 포함해서 요청합니다.

curl -I -H 'Accept-Encoding: br' https://www.DOMAIN.COM/style.css

응답 헤더에 아래와 같은 값이 있으면 Brotli 압축이 적용된 것입니다.

Content-Encoding: br

gzip 확인은 다음과 같이 할 수 있습니다.

curl -I -H 'Accept-Encoding: gzip' https://www.DOMAIN.COM/style.css
Content-Encoding: gzip

21. 정적 Brotli 파일 미리 생성하기

brotli_static on;을 사용하면 nginx가 요청 시 실시간으로 압축하지 않고, 미리 생성된 .br 파일을 우선 제공할 수 있습니다. CSS, JavaScript처럼 배포 후 자주 바뀌지 않는 파일은 빌드 과정에서 미리 압축해두면 서버 CPU 사용량을 줄일 수 있습니다.

cd /home/USER/src/public/css
brotli --best style.css

ls -al style.css.br

위와 같이 style.css.br 파일이 존재하면, Brotli를 지원하는 브라우저에는 해당 파일이 제공됩니다.


22. Certbot 설치

Let's Encrypt 인증서를 발급받기 위해 Certbot을 설치합니다.

dnf install -y certbot python3-certbot-nginx

nginx 플러그인을 이용해 인증서를 발급받을 수 있습니다.

certbot --nginx -d 도메인

위 방식이 실패하거나 DNS 검증이 필요한 환경이라면 수동 DNS 인증 방식을 사용할 수 있습니다.

certbot certonly \
    --manual \
    --preferred-challenges dns \
    -d 도메인

인증서 발급 후 nginx 설정에는 아래 경로를 사용합니다.

ssl_certificate     /etc/letsencrypt/live/도메인/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/도메인/privkey.pem;

23. 운영 시 주의할 점

  • nginx 버전과 소스 버전을 맞춰야 합니다. 동적 모듈은 설치된 nginx와 동일한 버전의 소스로 컴파일하는 것이 안전합니다.

  • 모듈 업데이트는 nginx 업데이트와 함께 관리해야 합니다. nginx 패키지를 업데이트했다면 모듈도 새 nginx 버전에 맞춰 다시 빌드해야 할 수 있습니다.

  • SSL 설정은 오래된 예제를 그대로 사용하지 않는 것이 좋습니다. TLS 권장 설정은 계속 변하므로 최신 생성기를 참고합니다.

  • 보안 헤더는 사이트 기능을 확인하면서 적용해야 합니다. 특히 CSP는 광고, 지도, 외부 스크립트, 결제 모듈과 충돌할 수 있습니다.

  • Brotli 압축 레벨을 과도하게 높이지 않습니다. 압축률은 좋아질 수 있지만 CPU 사용량과 응답 지연이 증가할 수 있습니다.


24. 마무리

이번 글에서는 RockyLinux 10 환경에서 nginx 공식 저장소를 추가하고, nginx mainline 버전을 설치한 뒤, Brotli 압축 모듈과 보안 헤더 관련 모듈을 동적 모듈 형태로 컴파일하여 적용하는 과정을 정리했습니다.

nginx는 단순히 PHP 요청을 전달하는 웹서버 역할만 하는 것이 아니라, 정적 리소스 압축, 캐시, 보안 헤더, SSL/TLS 처리, 접근 차단, 업로드 제한 등 웹서비스의 앞단에서 매우 중요한 역할을 담당합니다. 따라서 처음 구축할 때부터 설정 파일을 구조화하고, 사이트별 설정과 공통 보안 설정을 분리해두는 것이 좋습니다.

다음 편에서는 RockyLinux 10 환경에서 MariaDB 11.8 설치 및 운영 환경 구성을 다룹니다. PHP 애플리케이션이 사용할 데이터베이스 서버를 설치하고, 저장소 구성, 서비스 등록, 초기 확인 절차까지 정리합니다.