본문 바로가기
Infra/nginx

Nginx 101 (부제: Nginx 기본)

by Ramos 2025. 2. 2.

nginx 주요 설정 파일 및 디렉토리

  • /etc/nginx/ : nginx 서버가 사용하는 기본 설정이 저장된 루트 디렉토리에 해당.
  • /etc/nginx/nginx.conf : nginx의 기본 설정파일로, 모든 설정에 대한 진입점에 해당. 또한 디렉토리에 위치한 모든 설정 파일을 포함하는 최상위 http 블록을 갖고 있음.
  • /etc/nginx/conf.d/ : 기본 HTTP 서버 설정 파일을 포함. nginx 설정은 include 구문을 활용해 구조화함으로써 각 설정 파일을 간결하게 유지할 수 있다. 참고로, 몇몇 패키지 저장소에서 배포되는 nginx는 설치 시 conf.d 디렉토리 대신 site-enabled 디렉토리가 있고, symlink를 통해 site-available 디렉토리에 저장된 설정 파일들이 연결돼 있을 수 있다.
  • /var/log/nginx/ : nginx의 로그가 저장되는 디렉토리에 해당. access.log, error.log 파일에 nginx 서버가 수신한 개별 요청에 대한 로그와 오류 발생 시 이벤트 내용을 저장한다.

기본 명령어 모음

  • nginx -v : nginx 버전 정보 확인.
  • nginx -V : nginx 버전 정보 및 빌드 정보와 nginx 바이너리에 포함된 모듈을 보여주는 설정 인숫값을 확인.
  • nginx -t : nginx 설정 테스트
  • nginx -T : nginx 설정 테스트 후 결과를 화면에 보여줌.
  • nginx -s reload : nginx 서버를 중지하지 않고 설정 리로드. 패킷 손실 없이 설정을 리로드한다.
  • sudo systemctl status nginx : Ubuntu Linux 환경에서 nginx 서버의 현재 상태 확인.
  • sudo systemctl start nginx : nginx 서버 실행
  • sudo systemctl restart nginx : nginx 서버 재실행

Serving static contents

React/Vue와 같은 SPA, CSR FE App을 기준으로 정적 파일을 서빙한다면 기본 설정은 아래와 같다.

  • FE App의 빌드 결과 산출물을 nginx 정적 파일 경로에 매칭시켜 서빙한다. → root 경로를 적절하게 변경해도 좋다.
  • try_file 구문 상 $url, $url/은 FE App 빌드 결과 번들링된 파일을 script 형태로 요청하는 것에 대해 동적으로 경로를 찾아 갈 수 있도록 설정한다 보면 된다.
server {
    listen 80 default.server;
    server_name www.example.com;

    location / {
        root /usr/share/nginx/html;
        index index.html index.htm
        try_file $url $url/ index.html
    }
}

proxy pass

server {
  listen 80;
  server_name localhost;

  # BE Server
  location ~ ^/(api|actuator) {
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection 'upgrade';
      proxy_set_header Host $host;
      proxy_cache_bypass $http_upgrade;

      proxy_pass http://localhost:8080;
  }

  location / {
      root /usr/share/nginx/html;
      index index.html;

      try_files $uri /index.html;
  }

  root /var/www/html;

  # Add index.php to the list if you are using PHP
  # index index.html index.htm index.nginx-debian.html;
  location /favicon.ico {
      return 204;
      access_log off;
      log_not_found off;
  }
}

 

FE와 BE를 별도로 띄운다면 위와 같은 location 처리 및 proxy_pass를 사용한다. CORS나 기타 인증서 처리는 이 글에선 논외로 한다.

HTTPS Redirect

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 301 https://$host$request_uri;
}

 

SSL/TLS offloading을 적용하는 경우 다른 문제겠지만, 보통은 IPv4, IPv6를 가리지 않고 80 port로 요청을 받은 뒤 301 응답으로 동일한 호스트명과 URI에 대해 HTTPS로 요청하도록 리다이렉트 시킨다.

nginx 설정 파일이 적용되지 않았을 때?

보통 설정 파일에 대한 symlink가 올바르게 적용됐는지를 확인해봐야 한다.

 

site-available, site-enabled 같은 경로들이 간혹 기본 경로와 매칭이 안돼서 발생하는 경우가 있다.

이 경우, 아래와 같이 순서대로 지정해보자.

기타 check list

  • 해당 서버 내 방화벽 설정은 어떻게 되어 있는지 확인할 것.
  • 해당 서버가 IPv4, IPv6 모두 허용하는지 확인할 것.
  • Redirect 처리나 CORS 적용 시 HTTP Request Header가 proxy_pass 전후로 유실되어 요청이 들어오는건 아닌지 확인할 것.
  • 백엔드 API의 네트워크 비용 최적화를 고려한다면 gzip 응답 처리도 고려해볼 것.