[Nginx] Nginx 파일 딥다이브

Sunwu Park·2024년 11월 6일

싱송생송

목록 보기
4/6

Nginx 디렉토리 구조

Nginx 구조와 파일 소개: 웹 서버 관리의 핵심

  • /etc/nginx
    - Nginx 설정 파일들이 위치한 디렉토리

  • /etc/nginx/nginx.conf
    - nginx의 주요 설정 파일
    • 전체적인 서버 동작 방식 및 설정 포함

  • /etc/nginx/sites-available. /etc/nginx/sites-enabled:
    - 가상 호스트(Virtual Host) 설정 파일들이 위치한 디렉토리

  • /var/log/nginx:
    - 로그파일들이 위치한 디렉토리

    • 주요 로그 파일: access.log, error.log
  • /usr/share/nginx/html:
    - 기본적으로 Nginx가 서빙하는 정적 파일들이 위치한 디렉토리다.

  • conf.d/*.conf
    - 추가적인 설정 파일들이 위치한 디렉토리로, 모듈별로 설정을 정의할때 사용한다.

nginx.conf 파일 구조 및 설정 블록

  1. main 블록
  • 역할: Nginx 설정의 최상단에 위치하며, 전반적인 서버 설정을 관리
  • 설정 예시: 주로 서버의 성능 및 프로세스 관련 설정을 포함
  • 예를 들어, worker_processes, user, error_log 등이 포함됩니다.
  • 설명: 서버가 어떻게 구동되고 운영될지 기본적인 설정을 다루며, 이 블록에 정의된 설정은 서버 전반에 걸쳐 영향을 미칩니다.
  • 예시:
user www-data;            # Nginx를 실행할 사용자 권한
worker_processes auto;     # Nginx가 동시에 실행할 프로세스 수 (CPU 코어 수에 맞게 설정)
error_log /var/log/nginx/error.log;  # 에러 로그 파일 위치
  1. Core 모듈
  • 역할: Nginx의 기본 동작을 정의하며, 주로 환경 설정 최상단에서 한 번 사용됩니다.
  • 설정 예시: Core 모듈 설정은 HTTP와 이벤트 블록 등의 상위 수준 설정을 포함하여 기본 동작 방식을 정의합니다.
  • 설명: 주로 HTTP 서버나 이벤트 관련 동작을 설정하며, 설정 파일의 최상단에 위치해 Nginx의 주요 기능을 설정하는 데 사용됩니다.
  • 예시:
include /etc/nginx/modules-enabled/*.conf;  # 추가 모듈 포함
pid /run/nginx.pid;                         # Nginx의 프로세스 ID 파일 위치
  1. http 블록
  • 역할: 웹 서버가 HTTP 요청을 처리하는 방식을 설정합니다.
  • 설정 예시: HTTP 블록 안에 server 및 location 블록을 포함할 수 있습니다.
  • 설명: HTTP 블록에서는 웹 서버 관련 설정(포트, SSL, gzip, MIME 타입 등)을 정의하여 Nginx가 요청을 어떻게 처리할지 결정합니다. 여기서 설정된 내용은 하위 server 블록 및 location 블록에도 영향을 미칩니다.
  • 예시:
http {
    include /etc/nginx/mime.types;    # MIME 타입 설정 포함
    default_type application/octet-stream;
    sendfile on;         # 파일 전송 효율을 높이기 위한 sendfile 기능 활성화
    gzip on;                          # gzip 압축 설정
}
  1. server 블록
  • 역할: 하나의 웹사이트 또는 애플리케이션을 정의하며, 가상 호스팅 개념을 도입할 때 사용됩니다.
  • 설정 예시: 각 서버 블록은 특정 도메인이나 IP 주소로 들어온 요청을 처리하도록 설정할 수 있습니다.
  • 설명: 하나의 Nginx 인스턴스에서 여러 웹사이트를 운영할 때 사용합니다. 서버 블록은 특정 도메인에 대한 설정을 포함하며, 여기서 포트, SSL 설정, 기본 응답, 리다이렉트 등이 가능합니다.
  • 예시:
server {
    listen 80;                           # HTTP 포트로 요청 수신
    server_name example.com;             # 요청 도메인 이름 설정
    location / {
        proxy_pass http://localhost:8080;  # 요청을 로컬 서버의 8080 포트로 전달
    }
}
  1. location 블록
  • 역할: server 블록 내에서 특정 URL 경로를 처리하는 방법을 정의합니다.
  • 설정 예시: location 블록은 특정 URL 패턴에 따라 다양한 처리 방법을 지정할 수 있습니다.
  • 설명: 클라이언트가 요청하는 URL 경로별로 다른 설정을 적용할 수 있어, 정적 파일 제공, 리버스 프록시, 리디렉션 등을 세부적으로 설정할 수 있습니다.
  • 예시:
location /static {
    root /var/www/html;        # 정적 파일 경로
    try_files $uri $uri/ =404; # 파일이 없으면 404 반환
}
  1. events 블록
  • 역할: Nginx가 연결을 처리하는 방식을 정의하며, 성능 최적화와 관련된 설정을 포함합니다.
  • 설정 예시: worker_connections와 같이 Nginx가 동시에 처리할 수 있는 최대 연결 수를 설정하는 데 사용됩니다.
  • 설명: 이 블록에서 주로 동시 연결, 네트워크 성능, 요청 수락 방식 등을 설정합니다. Nginx는 이벤트 기반 서버이므로 이 블록의 설정은 서버의 성능에 중요한 영향을 미칩니다.
  • 예시:
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 에러 반환
        }
    }
}

그럼 이제 이 정보를 가지고 나의 서버에 SSL을 적용을 해보자

자세한 단계는
[Nginx] SSL 적용하기 - Coastby

여기에 나와있습니다.

간단하게 단계를 적자면
1. certbot 설치

apt-get install python3-certbot-nginx
  1. certbot을 이용하여 도메인에 대한 SSL 인증서를 발급
certbot certonly --nginx -d example.com
  • certonly 옵션으로 인증서 다운만 받고 설정은 추후에 진행할 수 있다.
  • nginx : 해당 도메인에 대한 소유주가 자신임을 인증하기 위해 이용할 플러그인이다. nginx에 대한 인증서 취득 및 설치가 자동으로 이루어진다.
  1. 인증서 생성 확인
sudo ls -al /etc/letsencrypt/live/{domain}
  1. 그냥 nginx.conf에 모든 설정을 작성을 해도 되지만 각 서버 별로 설정을 나누고 싶다면 sites-available에 ~.conf를 만들면 적용이 된다

왜냐하면

nginx.conf를 보면 sites-enabled/*를 다 include하기때문이다

고로 sites_enabled에 먼저

sudo nginx -t
sudo ln -s /etc/nginx/sites-available/test.conf /etc/nginx/sites-enabled

이렇게 심볼릭 링크를 만들어두고

  1. {domain}.conf 를 만들어준다
# 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
}
  1. Nginx 재시작
sudo service nginx restart

이러고 한 20분쯤 지나면 알아서 잘졌습니다

0개의 댓글