

/etc/nginx/sites-available. /etc/nginx/sites-enabled:
- 가상 호스트(Virtual Host) 설정 파일들이 위치한 디렉토리
/var/log/nginx:
- 로그파일들이 위치한 디렉토리
/usr/share/nginx/html:
- 기본적으로 Nginx가 서빙하는 정적 파일들이 위치한 디렉토리다.
conf.d/*.conf
- 추가적인 설정 파일들이 위치한 디렉토리로, 모듈별로 설정을 정의할때 사용한다.
user www-data; # Nginx를 실행할 사용자 권한
worker_processes auto; # Nginx가 동시에 실행할 프로세스 수 (CPU 코어 수에 맞게 설정)
error_log /var/log/nginx/error.log; # 에러 로그 파일 위치
include /etc/nginx/modules-enabled/*.conf; # 추가 모듈 포함
pid /run/nginx.pid; # Nginx의 프로세스 ID 파일 위치
http {
include /etc/nginx/mime.types; # MIME 타입 설정 포함
default_type application/octet-stream;
sendfile on; # 파일 전송 효율을 높이기 위한 sendfile 기능 활성화
gzip on; # gzip 압축 설정
}
server {
listen 80; # HTTP 포트로 요청 수신
server_name example.com; # 요청 도메인 이름 설정
location / {
proxy_pass http://localhost:8080; # 요청을 로컬 서버의 8080 포트로 전달
}
}
location /static {
root /var/www/html; # 정적 파일 경로
try_files $uri $uri/ =404; # 파일이 없으면 404 반환
}
events {
worker_connections 1024; # 워커 프로세스가 동시에 처리할 수 있는 연결 수
# multi_accept on; # 워커가 동시에 여러 연결을 수락할 수 있도록 설정
}
user www-data; # Nginx가 어떤 사용자와 그룹 권한으로 실행될지를 지정합니다.
worker_processes auto; # Nginx가 동시에 몇 개의 워커 프로세스를 사용할지 설정합니다. auto면 CPU코어 수에 따라 자동으로 설정합니다.
pid /run/nginx.pid; # Nginx 프로세스 ID(PID) 파일의 위치를 설정하여, 서버가 시작되면 이 파일에 프로세스 ID가 기록됩니다.
error_log /var/log/nginx/error.log; # 에러 로그 파일의 위치와 로그 레벨을 설정하여, 서버 에러, 경고 등을 추적할 수 있습니다.
include /etc/nginx/modules-enabled/*.conf; # Nginx의 모듈 설정 파일들을 포함합니다.
events {
worker_connections 768; # 동시에 처리할 수 있는 최대 연결 수를 설정합니다.
# multi_accept on; # 워커가 동시에 여러 연결을 수락할 수 있도록 설정합니다.
}
http {
##
# Basic Settings
##
sendfile on; # 파일을 전송할 때 시스템의 sendfile 기능을 활성화하여 전송 효율을 높입니다.
tcp_nopush on; # 작은 패킷 대신 큰 패킷으로 데이터를 전송하여 네트워크 효율을 높입니다.
types_hash_max_size 2048;
include /etc/nginx/mime.types; # MIME 타입 파일을 포함하여, 파일의 기본 타입을 설정합니다.
default_type application/octet-stream; # 기본 MIME 타입을 설정합니다.
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # 보안 프로토콜 버전을 설정하여 보안 수준을 강화합니다.
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log; # 접근 로그 파일의 위치를 설정합니다.
##
# Gzip Settings
##
gzip on; # gzip 압축을 활성화하여 텍스트 콘텐츠의 크기를 줄이고 전송 시간을 단축합니다.
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf; # conf.d 디렉토리의 모든 설정 파일을 포함합니다.
include /etc/nginx/sites-enabled/*; # sites-enabled 디렉토리의 모든 설정 파일을 포함합니다.
##
# Load Balancing & Routing 설정 예시
##
# 1. upstream 블록을 이용해 로드 밸런싱 그룹 설정
# 여러 백엔드 서버로 요청을 분산시키기 위해 "upstream"을 사용합니다.
upstream backend_servers {
server 192.168.1.101:8080; # 백엔드 서버 1의 IP 주소 및 포트
server 192.168.1.102:8080; # 백엔드 서버 2의 IP 주소 및 포트
server 192.168.1.103:8080; # 백엔드 서버 3의 IP 주소 및 포트
# 로드 밸런싱 방식 지정 (기본값: 라운드 로빈)
# 'least_conn'을 사용하면 가장 적은 연결을 가진 서버에 우선 요청을 보냅니다.
# 'ip_hash'를 사용하면 클라이언트의 IP에 따라 고정된 서버에 요청을 보냅니다.
# 예) least_conn;
}
# 2. 서버 블록을 설정하여 외부에서 들어오는 요청을 관리
server {
listen 80; # HTTP 요청을 수신할 포트를 설정합니다.
server_name example.com; # 도메인 이름 설정. 해당 도메인으로 오는 요청을 처리합니다.
# HTTP 요청을 HTTPS로 리다이렉트
# HTTP 포트로 들어온 요청을 HTTPS로 리다이렉트하여 보안을 강화합니다.
return 301 https://$host$request_uri;
}
# HTTPS 설정 블록
server {
listen 443 ssl http2; # HTTPS 요청을 수신할 포트와 프로토콜을 설정합니다.
server_name example.com;
# SSL 인증서 적용
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # SSL 인증서 경로
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # SSL 인증서 키 경로
# location 블록을 설정하여 특정 URL에 대한 처리를 정의합니다.
location / {
proxy_pass http://backend_servers; # 요청을 "backend_servers"에 정의된 로드 밸런싱 그룹으로 전달합니다.
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; # 클라이언트의 원래 IP와 프록시 체인을 전달합니다.
proxy_set_header X-Forwarded-Proto $scheme; # 요청의 원래 프로토콜 (HTTP 또는 HTTPS)을 전달합니다.
}
# /static 경로에 대한 예외 처리
# 정적 파일은 백엔드 대신 Nginx에서 바로 제공합니다.
location /static {
root /var/www/html; # 정적 파일이 있는 로컬 경로 설정
try_files $uri $uri/ =404; # 파일이 없으면 404 에러 반환
}
}
}
자세한 단계는
[Nginx] SSL 적용하기 - Coastby
여기에 나와있습니다.
간단하게 단계를 적자면
1. certbot 설치
apt-get install python3-certbot-nginx
certbot certonly --nginx -d example.com
sudo ls -al /etc/letsencrypt/live/{domain}
왜냐하면

nginx.conf를 보면 sites-enabled/*를 다 include하기때문이다
고로 sites_enabled에 먼저
sudo nginx -t
sudo ln -s /etc/nginx/sites-available/test.conf /etc/nginx/sites-enabled
이렇게 심볼릭 링크를 만들어두고
# 1)
server {
listen 80; # 80포트로 받을 때
server_name example.com; # 도메인주소
return 301 https://example.com$request_uri;
}
# 2)
server {
listen 443 ssl http2;
server_name example.com;
# ssl 인증서 적용하기
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / { # location 이후 특정 url을 처리하는 방법을 정의(여기서는 / -> 즉, 모든 request)
proxy_pass https//localhost:9001; # Request에 대해 어디로 리다이렉트하는지 작성. 8443 -> 자신의 springboot app 이사용하는 포트
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;
}
}
# 3)
server {
if ($host = example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name example.com;
return 404; # managed by Certbot
}
sudo service nginx restart
이러고 한 20분쯤 지나면 알아서 잘졌습니다