본문 바로가기
DevOps

Nginx 주요 사용사례 7가지

by 나하니인데 2024. 12. 17.
반응형

1.  Web 서버

Nginx는 가장 널리 사용되는 고성능 Web 서버 중 하나로, 정적 콘텐츠(HTML, CSS, JS 등)를 제공하는 데 최적화되어 있습니다. 간단한 설정으로 빠르게 웹 서버를 구성할 수 있습니다.

 

기본 설정

Nginx에서 정적 웹 페이지를 제공하려면 server 블록 안에 location을 사용해 경로를 지정하면 됩니다. 아래는 기본적인 HTTP 설정입니다:

HTTPS 설정

점점 더 많은 웹사이트가 보안을 위해 HTTPS(SSL/TLS 암호화)를 기본으로 사용합니다. HTTPS를 활성화하려면 Nginx에서 SSL 인증서와 키 파일을 설정해야 합니다. 아래는 HTTPS를 활성화한 예제입니다:

# HTTP 서버 설정
server {
    # 80포트로 들어오는 HTTP 요청을 처리
    listen 80;
    # 서버 도메인 이름 설정
    server_name localhost;

    # 기본 웹 루트 디렉토리 설정
    location / {
       # 웹 문서 루트 디렉토리 경로
       root /data/wwwroot;
       # 기본 인덱스 파일 설정
       index index.html index.htm;
    }
}

# HTTPS 서버 설정
server {
    # 433포트로 들어오는 HTTPS 요청을 처리 (SSL/TLS 활성화)
    listen 433 ssl;
    # 서버 도메인 이름 설정
    server_name localhost;

    # SSL 인증서 및 개인키 경로 설정
    # 공개키(인증서) 경로 설정
    ssl_certificate /etc/nginx/ssl/nginx.crt;
    # 비공개키 경로 설정
    ssl_certificate_key /etc/nginx/ssl/nginx.key;

    # HTTPS의 기본 웹 루트 디렉토리 설정
    location / {
        # 웹 문서 루트 디렉토리 경로
        root /data/wwwroot;
        # 기본 인덱스 파일 설정
        index index.html index.htm;
    }
}

 

2.  Reverse Proxy(리버스 프록시) 서버

Reverse Proxy(리버스 프록시)는 클라이언트의 요청을 받아서 내부 서버로 전달한 뒤, 내부 서버의 응답을 다시 클라이언트로 전달하는 역할을 합니다. Nginx는 가장 널리 사용되는 리버스 프록시 서버 중 하나로, 간단한 설정으로 고성능 리버스 프록시를 구성할 수 있습니다.

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:8080; # 백엔드 서버 주소
        proxy_set_header Host $host;     # 원래 호스트 헤더 전달
        proxy_set_header X-Real-IP $remote_addr; # 클라이언트 IP 전달
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 프록시 체인 추가
    }
}

 

proxy_pass: 클라이언트 요청을 전달할 백엔드 서버의 주소.

proxy_set_header: 백엔드 서버로 전달되는 HTTP 헤더를 설정.

  • Host: 원래 요청된 호스트 정보 전달.
  • X-Real-IP: 실제 클라이언트의 IP를 전달.
  • X-Forwarded-For: 프록시 체인을 따라 클라이언트의 IP 기록.

 

3.  로드 밸런싱 리버스 프록시

 

  • 동작 원리:
    • Nginx는 리버스 프록시 역할을 하며, 클라이언트의 요청을 백엔드 서버로 전달.
    • 설정 파일에 명시된 서버 그룹(upstream)을 기반으로 로드 밸런싱을 수행.
  • 알고리즘:
    • 기본적으로 Round Robin 방식 사용.
    • Least Connections, IP Hash, Weight 등 다양한 로드 밸런싱 방식 지원.
  • 확장성:
    • 서버를 추가하거나 제거하려면 Nginx 설정 파일을 수정한 뒤 재시작 필요.

 

upstream backend_servers {
	ip_hash; # ip_hash 제거하고 round-robin 사용 (아무것도 명시하지 않으면 기본값)
    server 192.168.1.10;
    server 192.168.1.11;
    server 192.168.1.12;
}

server {
    listen 80;
    server_name: server_name;
    location / {
        proxy_pass http://backend_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

 

4.  URL 리다이렉트 

웹사이트를 리뉴얼하거나 URL 구조를 변경했을 때, 기존 URL로 접속하는 사용자나 검색 엔진이 새로운 URL로 접근할 수 있도록 리다이렉트를 설정합니다.

 

리다이렉트 방법 

1. return 지시어를 이용한 리다이렉트

return은 단순하고 명확하게 URL을 리다이렉트할 때 사용됩니다. HTTP 상태 코드와 함께 리다이렉트할 URL을 설정하면 됩니다.

예제 1: 특정 URL을 다른 URL로 리다이렉트하기

server {
    listen 80; 
    server_name example.com; 

    ## /old-page 요청이 들어오면 301 Moved Permanently 상태 코드와 함께 https://example.com/new-page로 리다이렉트됩니다.

    location /old-page { 
        return 301 https://example.com/new-page;
    }
}

예제 2: 전체 도메인을 다른 도메인으로 리다이렉트하기

server {
    listen 80;
    server_name old-domain.com;

    return 301 https://new-domain.com$request_uri;
}

request_uri는 요청된 경로와 쿼리 문자열을 그대로 유지해 리다이렉트합니다.

예: http://old-domain.com/page1?param=value → https://new-domain.com/page1?param=value

 

2.rewrite 지시어를 이용한 리다이렉트
rewrite는 보다 복잡한 조건에 맞게 URL을 변경하거나 패턴에 따라 리다이렉트할 때 사용됩니다.

## 새로운 도메인으로 리다이렉트
server {
    listen 80;
    server_name old.example.com;
    location / {
       rewrite ^/(.*)$ http://new.example.com/$1 permanent;
    }
}

## 특정 경로로 리다이렉트
server {
    listen 80;
    server_name old.example.com;
    location /old-path {
        rewrite ^/old-path/(.*)$ http://new.example.com/new-path/$1 permanent;
    }
}

 

 

5.  핫링크 방지

웹사이트의 이미지, 동영상, 파일 등의 리소스를 다른 웹사이트에서 직접 가져다 사용하는 것을 막는 기술입니다.
예를 들어, 웹사이트 A에 있는 이미지의 URL을 웹사이트 B에서 그대로 사용하면, B사이트 방문자들이 A의 서버에 직접 요청을 보내 이미지를 불러옵니다.


문제점:

1. 서버 트래픽 낭비: 리소스를 제공하는 웹사이트의 트래픽이 증가해 비용이 발생합니다.

2. 리소스 소모: 서버 성능이 저하될 수 있습니다.

3. 불공정 사용: 다른 사이트에서 리소스를 이용하면서 제공자는 정작 이득을 보지 못합니다.

server {
    listen 80;                                    
    server_name hotlink.example.com;             
    location ~* \.(gif|jpg|jpeg|png|css|js)$ {   
        # 허용할 레퍼러 설정
        # none: 레퍼러 헤더가 없는 요청 허용
        # blocked: 레퍼러가 차단된 요청 허용
        # example.com, www.example.com: 해당 도메인에서의 요청 허용
        valid_referers none blocked example.com www.example.com;
        
        # 유효하지 않은 레퍼러인 경우 403 Forbidden 응답 반환
        if ($invalid_referer) {
            return 403;
        }

 

6. 모바일 디바이스 리디렉션

모바일 디바이스 리다이렉션은 사용자 경험 최적화, 성능 개선, SEO 강화 등을 위해 필요합니다. 모바일 사용자가 웹사이트를 방문했을 때, PC 버전이 아닌 모바일에 최적화된 페이지를 제공하면 사용자 만족도를 높일 수 있습니다.
모바일로 네이버 www.naver.com 접속했을 때 m.naver.com 으로 접속되는 상황을 볼 수 있습니다. 

server {
    listen 80;
    server_name example.com;
    location / {
        if ($http_user_agent ~* '(android|iphone|ipad)') {
            rewrite ^/(.*)$ http://m.example.com/$1 permanent;
        }
    }
}

 

7. 경로 기반 라우팅

현대적인 웹 애플리케이션은 여러 개의 마이크로서비스로 구성되어 있습니다. 각 서비스가 서로 다른 경로에서 동작하도록 설정하면 효율적인 트래픽 분산이 가능합니다.

server {
    listen 80;
    server_name example.com;

    location /api/ {
        proxy_pass http://backend-api-server;
    }

    location /static/ {
        root /var/www/html/static;
    }

    location /shop/ {
        proxy_pass http://shop-service;
    }

    location /admin/ {
        proxy_pass http://admin-service;
        allow 192.168.0.0/24;
        deny all;
    }
}
반응형

댓글