- Published on
Nginx 이미지 서버 설정
- Authors
- Name
- 황도연
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";
...
}
이미지 파일은 변경되지 않는 정적 컨텐츠이므로, 캐시를 통해 성능을 향상시킬 수 있습니다. expires
와 Cache-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
}