Nginx 삽질기: 도메인과 IP 접근 분리 설정, Swagger 문서만 열어두기 (feat. 사용자 정의 403 페이지 설정)

tree·2024년 12월 16일
0

프로젝트

목록 보기
2/3
post-thumbnail

문제 상황


현재 Nginx 설정으로 인해서 ip로 접근하면 Nginx 404 에러로 나온다.
나는 이 view가 마음에 들지 않아서 내 개인적인 커스텀 html으로 반환하면서 다시 한번 Nginx 설정을 확인해보려고 한다.

현재 Nginx 설정

server {
    server_name {도메인};

    location / {
        proxy_pass http://127.0.0.1:8080;
        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;
    }

    location /.well-known/acme-challenge/ {
        root /var/www/html;  # 인증 파일이 저장될 경로
        try_files $uri =404;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/{도메인}/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/{도메인}/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = {도메인}) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name {도메인};
    return 404; # managed by Certbot
}

1. 도메인으로 접근 가능

2. ip로 접근시 404 에러

내가 설정을 위와 같이해서 어느 경로든 IP 접근은 404 Not Found만을 반환한다.

보안적으로 어떤 방법이 좋을지 실제 현업에서는 어떻게 하는지 모르겠으나 현재 IP 접근은 http로만 가능하기 때문에 IP 접근은 swagger 문서 빼고 막으려고 한다.

커스텀 html 생성

sudo mkdir -p /usr/share/nginx/html
sudo nano /usr/share/nginx/html/403.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>403 Forbidden</title>
    <style>
        body { text-align: center; margin-top: 50px; font-family: Arial, sans-serif; }
        h1 { color: #ff6347; }
        p { color: #333; }
    </style>
</head>
<body>
    <h1>403 Forbidden</h1>
    <p>죄송합니다. 이 페이지에 대한 접근이 제한되었습니다.</p>
</body>
</html>

Ngnix 설정 변경: IP 접근은 Swagger 문서만 허용, 도메인은 https로 강제 리다이렉트

# HTTP 접근 (IP 및 도메인)
server {
    listen 80;
    server_name {도메인} {IP};

    # 도메인 접근 시 HTTPS로 리다이렉트
    if ($host = {도메인}) {
        return 301 https://$host$request_uri;
    }

    # IP 접근에서 Swagger 문서만 허용
    location /swagger-ui/index.html {
        proxy_pass http://127.0.0.1:8080/swagger-ui/index.html;
        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;
    }

    # 나머지 경로 차단 (IP 접근 시)
    location / {
        if ($host = {IP}) {
            return 403;  # Forbidden
        }
        proxy_pass http://127.0.0.1:8080;
        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;
    }
    
    # 사용자 정의 403 페이지
    error_page 403 /403.html;
    location = /403.html {
        root /usr/share/nginx/html;
        internal;
    }
}

# HTTPS 설정 (도메인 접근만 허용)
server {
    listen 443 ssl;
    server_name {도메인};

    # SSL 설정
    ssl_certificate /etc/letsencrypt/live/{도메인}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/{도메인}/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    # 모든 요청을 Spring Boot로 전달
    location / {
        proxy_pass http://127.0.0.1:8080;
        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;
    }

    # Certbot 인증 파일 경로
    location /.well-known/acme-challenge/ {
        root /var/www/html;
        try_files $uri =404;
    }
}

설정 변경 후

참고로 conf파일 수정 후 Ctrl + X 누른 뒤 Y을 누르고 Enter를 누르면 수정 반영 된다.

설정 변경 뒤 다음과 같이 입력해서 재시작시킨다.

sudo nginx -t
sudo systemctl restart nginx

해결

0개의 댓글