Published on

Nginx 이미지 서버 설정

Authors
  • avatar
    Name
    황도연
    Twitter

Nginx

Nginx는 웹 서버, 리버스 프록시, 로드 밸런서 등 다양한 역할을 수행할 수 있는 강력한 소프트웨어입니다. 오늘은 특히 이미지 호스팅 서비스에 초점을 맞춰 Nginx의 설정 예시를 분석하고, 각 설정이 서비스에 어떤 영향을 미치는지 살펴보겠습니다.

1. 기본 설정 및 보안 헤더

먼저, server 블록에서 기본 설정을 확인할 수 있습니다. server_name 지시어를 통해 서버의 도메인을 설정합니다.

server {
    server_name domain_name;

    # 보안 관련 헤더
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    server_tokens off;
    ...
}

여기서 주목할 점은 보안 관련 헤더들입니다. X-Frame-Options는 클릭재킹 공격을 방지하기 위해 사용되며, X-Content-Type-Options는 MIME 타입 스니핑을 방지합니다. X-XSS-Protection은 크로스 사이트 스크립팅(XSS) 공격에 대한 보호를 제공합니다.

2. Gzip 압축 설정

이미지는 웹 트래픽의 큰 부분을 차지하므로, 압축을 통해 데이터 전송량을 줄이는 것이 중요합니다.

# compress
gzip on;
gzip_types image/jpeg image/png image/gif;
    ...

gzip 지시어를 통해 압축을 활성화하고, gzip_types로 압축할 파일 유형을 지정합니다. 여기서는 JPEG, PNG, GIF 이미지 형식을 압축 대상으로 설정했습니다.

3. 이미지 업로드 API

이미지를 업로드하는 API 경로를 설정하는 부분입니다.

# 이미지 업로드 API
location /upload_image {
    proxy_pass http://localhost:5003/api/upload_image;
    ...
}

location 블록을 사용하여 특정 경로로 들어오는 요청을 내부 서비스로 전달하는 리버스 프록시 설정을 합니다. proxy_pass는 실제 요청을 처리할 서버의 주소를 지정합니다.

4. 정적 이미지 파일 제공

서버에서 직접 정적 이미지를 제공하는 설정입니다.

# 정적 이미지 파일 제공
location /images {
    proxy_pass http://localhost:5003/images;

    expires 30d;
    add_header Cache-Control "public";
    ...
}

이미지 파일은 변경되지 않는 정적 컨텐츠이므로, 캐시를 통해 성능을 향상시킬 수 있습니다. expiresCache-Control 헤더를 통해 이를 구현합니다.

5. SSL 및 HTTP 리다이렉션

마지막으로, SSL을 설정하여 HTTPS를 통한 안전한 데이터 전송을 보장합니다. certbot -d domain-name 명령어를 통하여 ssl 인증을 합니다.

listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/domain_name/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/domain_name/privkey.pem; # managed by Certbot
    ...

또한, 80 포트(HTTP)로 들어오는 요청을 443 포트(HTTPS)로 리다이렉트하는 설정도 중요합니다.

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

전체 설정 파일


server {
    server_name domain_name;

    # 보안 관련 헤더
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    server_tokens off;


    # compress
    gzip on;
    gzip_types image/jpeg image/png image/gif;


    # 이미지 업로드 API
    location /upload_image {
        proxy_pass http://localhost:5003/api/upload_image;
        proxy_set_header Host $http_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 /images {
        proxy_pass http://localhost:5003/images;
        proxy_set_header Host $http_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;

        expires 30d;
        add_header Cache-Control "public";
    }

    location /api-docs {
        proxy_pass http://localhost:5003/api-docs;
        proxy_set_header Host $http_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;
        add_header Cache-Control "public";
    }


    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/domain_name/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/domain_name/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 = domain_name) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    server_name domain_name;
    listen 80;
    return 404; # managed by Certbot


}