Dev/etc.

8. NginX 세팅

takeU 2024. 12. 21. 11:46
반응형

NginX 설치

sudo apt update
sudo apt install nginx

NginX 커맨드

sudo systemctl start nginx  # 시작
sudo systemctl restart nginx  # 재시작
sudo systemctl status nginx # 중지
sudo systemctl enable nginx # 부팅 시 자동시작 설정

NginX 설정 파일의 목적

nginx.conf

Nginx의 주요 설정 파일로, Nginx의 동작 방식을 정의
/etc/nginx/nginx.conf 경로에 위치

sites-available, sites-enabled

이 두 디렉토리는 Nginx의 가상 호스트 설정을 관리하는데 사용

  • sites-available
    • 활성화되지 않은 사이트의 설정 파일을 보관하는 디렉토리
    • 호스트별 설정 파일이 들어있으며, 각 파일은 하나의 서버 블록을 정의
  • sites-enabled
    • sites-available 디렉토리에 있는 설정 파일 중에서 실제로 활성화된 사이트의 설정 파일로 심볼릭 링크를 걸어두는
      디렉토리
    • Nginx는 이 디렉토리 안에 있는 설정 파일들을 실제로 로드하여 사용

따라서 available에 설정을 하고 enabled에 링크를 걸어주면 됨

설정

/etc/nginx/nginx.conf

# Nginx 전역 설정
user www-data;
worker_processes auto;
pid /run/nginx.pid;

# 이벤트 설정
events {
    worker_connections 1024;
}

# HTTP 블록 (모든 HTTP 관련 설정)
http {
    include /etc/nginx/mime.types;   # MIME 타입 정의
    default_type application/octet-stream;   # 기본 파일 타입
    sendfile on;
    keepalive_timeout 65;

    # 사이트별 설정 파일 포함
    include /etc/nginx/sites-enabled/*;
}
  • user www-data - Nginx 프로세스가 사용할 사용자와 그룹을 지정하는 역할. 보통 www-data 사용자를 사용
  • worker_processes auto - 시스템의 CPU 수에 따라 워커 프로세스 수를 자동으로 설정
  • pid /run/nginx.pid - Nginx의 프로세스 ID(PID) 파일의 위치를 지정
  • worker_connections 1024 - 각 워커 프로세스가 동시에 처리할 수 있는 최대 연결 수를 지정
  • include /etc/nginx/mime.types - Nginx가 MIME 타입을 정의한 파일을 포함하여, 파일 확장자에 따라 적절한 Content-Type
    헤더를 설정
  • default\_type application/octet-stream - MIME 타입을 찾을 수 없는 경우 기본으로 적용할 타입을 설정
  • sendfile on - 파일을 효율적으로 전송하기 위해 sendfile을 사용하도록 설정
  • keepalive\_timeout 65 - 클라이언트 연결을 유지하는 최대 시간을 초 단위로 설정
  • include /etc/nginx/sites-enabled/* - sites-enabled 디렉토리에 있는 모든 설정 파일을 포함

/etc/nginx/sited-available/maplem.conf

server {
    listen 443 ssl;
    server_name maplemworlds.kr www.maplemworlds.kr localhost 127.0.0.1 공인IP;

    root /var/www/maplem;
    index index.html;

    location / {
        try_files $uri /index.html;
    }

    location /api/ {
        proxy_pass http://localhost:8080;
        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;
    }

    # https certbot 설정
    ssl_certificate /etc/letsencrypt/live/maplemworlds.kr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/maplemworlds.kr/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
    listen 80;
    server_name maplemworlds.kr www.maplemworlds.kr localhost 127.0.0.1 공인IP;

    if ($host = www.maplemworlds.kr) {
        return 301 https://$host$request_uri;
    }

    if ($host = maplemworlds.kr) {
        return 301 https://$host$request_uri;
    }

    return 404;
}
  • https 블럭
    • server_name - 해당 서버 블록이 처리할 도메인 이름과 IP 주소를 지정(주 도메인, 서브 도메인, 로컬 호스트)
    • root - 웹 사이트의 루트 디렉토리 / react 프로젝트가 빌드된 디렉토리 파일이 들어오도록 하면 됨
    • index - 기본 인덱스 파일을 지정
    • location / - 기본 위치 블록 / SPA기 때문에 별도의 처리가 필요하지 않고 index.html로 보냄
    • location /api/ - 백엔드 서버로 프록시 요청을 전달 / 로컬에서 pm2로 구성했기 때문에, 해당 주소로 요청
    • listen 443 ssl - 이 서버 블록이 SSL을 사용하여 443 포트에서 요청을 수신하도록 설정 (https)
    • ssl_certificate - SSL 인증서 파일의 경로
    • ssl_certificate_key - SSL 인증서 키 파일의 경로
    • include /etc/letsencrypt/options-ssl-nginx.conf - Certbot에서 제공하는 SSL 설정 옵션을 포함
    • ssl_dhparam - SSL DH 파라미터 파일의 경로를 지정합니다.
  • http 블럭
    • http로 접근 시 https로 영구 리디렉션
  • 공인 IP는 우분투 기준 curl ifconfig.me 요청을 통해 확인이 가능

NginX 설정 변경 시 링크 과정

sudo rm /etc/nginx/sites-enabled/maplem.conf
sudo ln -s /etc/nginx/sites-available/maplem.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Certbot https 인증서 발급 과정

sudo apt update
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx

이후 도메인 입력하면 발급 완료

echo "0 0 * * 0 /usr/bin/certbot renew --quiet" | sudo tee -a /etc/crontab > /dev/null

크론잡 등록 시 일주일에 한번씩 자동 인증서 갱신