Nginx 설치 및 리버스 프록시 설정

minpractice_jhj·2025년 3월 24일

AWS

목록 보기
8/10

Nginx 설치

🔹 Nginx 설치

sudo apt update
sudo apt install nginx

설치 후, Nginx가 제대로 실행되고 있는지 확인
sudo systemctl status nginx
  • Nginx 로그 확인하는 방법

    🔹Nginx 로그 확인 및 분석 명령어

    1. 로그 파일 위치 확인

    ls /var/log/nginx/
    • 기본적으로 Nginx 로그는 /var/log/nginx/ 디렉터리에 저장됩니다.

    • 일반적으로 access.log(접속 로그)와 error.log(오류 로그)가 있습니다.


      2. 실시간 로그 확인

      tail -f /var/log/nginx/access.log
      tail -f /var/log/nginx/error.log
    • 새로운 로그가 추가될 때마다 실시간으로 확인할 수 있습니다.

    • Ctrl + C로 종료 가능합니다.

      접속 : 주소가 EC2의 퍼블릭 IPv4 로 http://43.201.64.159:8080 테스트


Nginx 파일 관리

  • Nginx 설정 파일 기본 구조
    1. Core 모듈 (Global 설정)
      • Nginx의 기본적인 동작 방식을 정의하는 부분으로, 대부분 설정 파일의 최상단에 위치합니다.
      • 예시:
        user nginx;                      # Nginx 프로세스의 실행 권한 설정
        worker_processes 2;               # CPU 코어당 최소한 하나의 프로세스 배정
        pid /var/run/nginx.pid;           # Nginx의 PID 파일 경로
    2. Events 블록
      • 네트워크 관련 설정을 정의하는 부분입니다. 이벤트 모듈을 사용하여 연결 수, 멀티접속 여부 등을 설정합니다.
      • 예시:
        events {
            worker_connections 1024;     # 최대 1024개의 연결 처리
            multi_accept off;            # 기본값: off, 여러 연결을 한번에 수용할지 여부
        }
    3. HTTP 블록
      • 웹서버에 대한 설정을 정의하는 부분입니다. server 블록과 location 블록을 포함하며, 웹 서버의 동작을 설정하는 중요한 역할을 합니다.
      • 예시:
        http {
            include /etc/nginx/mime.types;        # 파일 타입 설정
            default_type application/octet-stream; # 기본 MIME 타입
            log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                             '$status $body_bytes_sent "$http_referer" '
                             '"$http_user_agent" "$http_x_forwarded_for"';
            access_log /var/log/nginx/access.log main;  # 접근 로그 설정
            sendfile on;                                # 파일 전송을 효율적으로 처리
            keepalive_timeout 65;                       # 커넥션 유지 시간
            server_tokens off;                         # NGINX 버전 숨기기
        }
    4. Server 블록
      • 하나의 웹사이트 또는 가상 호스트를 정의하는 부분입니다. 여러 server 블록을 사용하여 여러 사이트를 관리할 수 있습니다.
      • 예시:
        server {
            listen 80;                             # 80번 포트에서 HTTP 요청 수신
            server_name pin-up.co.kr;               # 도메인 설정
            location / {                            # 모든 요청을 / 경로로 처리
                root /var/www/html;                 # 서버의 루트 디렉터리 설정
                index index.html index.htm;        # 기본 인덱스 파일 설정
            }
        }
    5. Location 블록
      • server 블록 내에서 특정 URL 패턴을 처리하는 방법을 정의합니다.
      • 예시:
        location /images/ {
            root /var/www/static;                   # /images/ 요청을 /var/www/static 디렉터리에서 처리
        }

🔹 /etc/nginx/conf.d/ 디렉터리로 설정을 하는가?

  • /etc/nginx/conf.d/ 설정한 이유
    1. 설정 관리의 용이성:
      • 여러 설정 파일을 /etc/nginx/conf.d/에 분리하여 관리하면 각 설정이 명확하게 나누어져 있어 관리가 수월합니다.
      • 예를 들어, 리버스 프록시 설정, 로깅 설정, 보안 설정 등을 각기 다른 파일로 분리해놓으면, 한 파일을 수정할 때 다른 설정 파일에 영향을 미치지 않게 됩니다.
    2. 자동화된 파일 로딩:
      • /etc/nginx/conf.d/에 추가된 모든 .conf 파일은 Nginx가 자동으로 로드합니다. 별도로 심볼릭 링크를 만들거나 nginx.conf에서 수동으로 설정을 포함시킬 필요가 없기 때문에, 설정 추가나 삭제가 매우 직관적이고 빠릅니다.
    3. 확장성과 유연성:
      • /etc/nginx/conf.d/ 방식은 여러 개의 파일을 개별적으로 관리할 수 있기 때문에 확장성과 유연성이 높습니다. 여러 서버를 한 서버에서 관리할 때, 각 서버에 대한 설정을 server 블록으로 관리하는 대신, 파일을 분리하여 각 설정을 보다 명확하게 나누어 관리할 수 있습니다.
    4. 공식 권장사항:
      • Nginx의 공식 문서에서도 /etc/nginx/conf.d/ 디렉터리를 사용하여 설정 파일을 관리하는 방법을 권장하고 있습니다. 이를 통해 더 간편하고 체계적인 서버 설정 관리를 할 수 있습니다.
    5. 불필요한 파일 삭제
      • sites-enabled/ 방식에서는 사용하지 않는 설정 파일을 삭제하려면 심볼릭 링크를 삭제해야 하지만, /etc/nginx/conf.d/에서는 설정 파일을 직접 삭제하여 관리할 수 있습니다.
    6. 매번 symlink 작업이 필요하지 않음
      • sites-enabled/에서는 사이트 설정을 추가할 때마다 심볼릭 링크를 생성해야 하지만, /etc/nginx/conf.d/.conf 파일을 추가하면 Nginx가 자동으로 로드하여 추가적인 작업 없이 설정이 적용됩니다.

🔹 기본 설정 파일의 차이: /etc/nginx/sites-available/,/etc/nginx/sites-enabled/ ,/etc/nginx/conf.d/

  • /etc/nginx/sites-available/,/etc/nginx/sites-enabled/ ,/etc/nginx/conf.d/ 설명 및 차이점 정리

    1. /etc/nginx/sites-available//etc/nginx/sites-enabled/ 사용 방법

    • /etc/nginx/sites-available/

      • 목적: 여러 사이트를 호스팅할 때 각 사이트의 설정 파일을 저장하는 디렉터리입니다.
      • 파일 생성: 새로운 사이트 설정을 sites-available/에 추가합니다. 이 파일은 별도의 확장자를 가지지 않고, 보통 도메인명이나 default라는 이름으로 생성됩니다.
      • 예시: /etc/nginx/sites-available/sangdol 파일을 생성할 수 있습니다.
    • /etc/nginx/sites-enabled/
      - 목적: 실제로 활성화된 설정을 관리하는 디렉터리입니다. sites-available/에서 생성한 설정 파일을 이곳에 심볼릭 링크로 연결하여 활성화합니다.
      - 심볼릭 링크 생성: 설정 파일을 활성화하려면 sites-available/의 파일을 sites-enabled/로 심볼릭 링크로 연결합니다.
      - 예시:이 명령은 sangdol 설정을 활성화합니다.

          ```bash
          bash
          복사편집
          sudo ln -s /etc/nginx/sites-available/sangdol /etc/nginx/sites-enabled/sangdol
          
          ```
          

      2. /etc/nginx/conf.d/ 사용 방법

    • /etc/nginx/conf.d/

      • 목적: 다양한 설정 파일을 관리하는 디렉터리입니다. Nginx는 이 디렉터리 내의 모든 .conf 파일을 자동으로 로드합니다.
      • 파일 생성: 리버스 프록시나 다른 설정을 추가할 때 .conf 확장자를 사용하여 설정 파일을 생성합니다.
      • 예시: /etc/nginx/conf.d/pin-up.conf와 같은 설정 파일을 추가할 수 있습니다.
    • 기존 파일에서 불러오는 경우: /etc/nginx/conf.d/에서 불러오는 파일은 .conf 확장자가 필요하지만, 불필요한 파일은 삭제하거나 관리해야 합니다. 이 디렉터리 내 모든 .conf 파일은 자동으로 로드되므로, 사용하지 않는 파일은 삭제하여 관리해야 합니다.


      3. /etc/nginx/sites-enabled//etc/nginx/conf.d/ 사용 비교

      항목/etc/nginx/sites-available/ + /etc/nginx/sites-enabled//etc/nginx/conf.d/
      목적사이트별 설정 관리개별 설정을 모듈화하여 관리
      활용 방식sites-available/에 설정 파일 생성 후 sites-enabled/로 심볼릭 링크 생성.conf 확장자 파일을 생성하여 Nginx가 자동으로 로드
      설정 활성화 방법심볼릭 링크 생성 (ln -s)파일 추가만으로 자동 로드
      확장성여러 사이트 설정 시 유용리버스 프록시, SSL 설정 등 여러 설정을 모듈화하여 관리
      유지관리불필요한 사이트 설정을 sites-enabled/에서 삭제 가능설정 파일 삭제 또는 수정 시 Nginx 재시작 필요
      Nginx 공식 문서 권장권장되지 않음권장됨

      4. 왜 /etc/nginx/conf.d/를 사용하는가?

    1. 공식 문서 권장: Nginx 공식 문서에서는 /etc/nginx/conf.d/를 통한 설정 관리 방식을 추천합니다. 이 방법은 설정 파일을 모듈화하여 효율적으로 관리할 수 있게 해줍니다.
    2. 매번 symlink 작업이 필요하지 않음: sites-enabled/를 사용할 경우, 사이트 설정을 추가할 때마다 심볼릭 링크를 생성해야 합니다. 반면, /etc/nginx/conf.d/.conf 파일을 추가하면 Nginx가 자동으로 로드하여 추가적인 작업 없이 설정을 적용할 수 있습니다.
    3. 불필요한 파일 삭제: sites-enabled/ 방식에서는 사용하지 않는 설정 파일을 삭제하려면 심볼릭 링크를 삭제해야 하지만, /etc/nginx/conf.d/에서는 불필요한 설정 파일을 직접 삭제하여 관리할 수 있습니다.

Nginx 리버스 프록시 설정

🔹 Nginx 리버스 프록시 파일 설정

  • Nginx 리버스 프록시 파일 명령어

    1. 새로운 설정 파일 생성

    /etc/nginx/conf.d/ 디렉터리에 새로운 설정 파일을 생성합니다. 예를 들어, reverse-proxy.conf라는 파일을 생성합니다.
    sudo nano /etc/nginx/conf.d/pin-up.proxy-server.conf

    2. 리버스 프록시 설정 내용 추가

    reverse-proxy.conf 파일에 아래와 같은 리버스 프록시 설정을 추가합니다. (도메인 이름과 EC2 퍼블릭 IP를 본인 환경에 맞게 수정)
    server {
        listen 80;
    
        server_name pin-up.co.kr;
    
        location / {
            #proxy_pass http://43.201.64.159:8080;  # 실제 백엔드 서버 포트(EIP 설정후 변경) 
            proxy_pass http://localhost:8080;  # 실제 백엔드 서버 포트
            proxy_set_header Host $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;
            proxy_read_timeout 90;
            proxy_connect_timeout 90;
        }
    }
    • listen 80;: Nginx가 80번 포트에서 HTTP 요청을 수신하도록 설정.

    • listen 8080;: Nginx가 8080번 포트에서 HTTP 요청을 수신하도록 설정.

    • server_name pin-up.co.kr;: 요청을 처리할 도메인 이름 (예시: pin-up.co.kr).

    • proxy_pass http://43.201.64.159:8080;: HTTP 요청을 EC2 인스턴스의 퍼블릭 IP 주소로 전달하는 리버스 프록시 설정.

    • proxy_set_header: 원래 요청에 포함된 HTTP 헤더를 백엔드 서버로 전달.

      3. 설정 저장 및 종료

    • 파일에 설정을 추가한 후, Ctrl + O로 저장하고, Ctrl + X로 편집기를 종료합니다.

      4. Nginx 설정 테스트

      설정에 문제가 없는지 확인하려면 다음 명령어로 Nginx 설정을 테스트합니다:

      sudo nginx -t
    • 테스트가 성공적으로 완료되면 "syntax is ok"와 "test is successful" 메시지가 출력됩니다.

      5. Nginx 재시작

      설정이 문제없다면, Nginx를 다시 로드하여 변경 사항을 적용합니다:

      sudo systemctl reload nginx

Nginx SSL 설정 미리 작성

  • 기존 default 파일을 SSL 설정 파일로 사용

    🔹기존 default 파일을 SSL 설정 파일로 사용

    기존 default 파일을 그대로 사용하여 SSL 설정을 추가할 수 있습니다. default 파일에 SSL을 위한 설정을 추가하고, 인증서 경로를 설정하면 됩니다. 예를 들어, 다음과 같은 방식으로 SSL을 설정할 수 있습니다.

    SSL 설정 추가 (기존 default 파일 수정)

    nginx
    복사편집
    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name _;  # Elastic IP 할당 후 변경 필요
    
        # HTTP -> HTTPS 리디렉션 (배포 후 적용)
        location / {
            return 301 https://$host$request_uri;
        }
    }
    
    server {
        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;
    
        # SSL 인증서 경로 (Certbot 발급 후 자동 적용됨)
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
        # SSL 보안 설정 (인증서 적용 후 활성화 가능)
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:...'; # 더 강력한 암호화 설정을 위해 추가할 수 있음
        ssl_prefer_server_ciphers on;
        
        # HSTS 적용 (보안 강화 옵션)
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    
        # 서버 이름과 루트 디렉토리 설정
        server_name example.com; # Elastic IP 적용 후 변경 필요
        root /var/www/html;
    
        # 기본 인덱스 설정
        index index.html index.htm index.nginx-debian.html;
    
        location / {
            try_files $uri $uri/ =404;
        }
    }
    
    이 방식으로 기존 default 파일에 SSL 설정을 추가하여, 배포 당일 Certbot을 사용해 SSL 인증서를 적용할 수 있습니다.
  • 새로운 SSL 설정 파일 생성

    🔹 새로운 SSL 설정 파일 생성

    default 파일을 사용하지 않고 새로운 파일을 생성하여 SSL 설정을 할 수도 있습니다. 예를 들어, ssl-example.com.conf라는 파일을 /etc/nginx/conf.d/에 새로 만들어서 SSL 설정을 추가할 수 있습니다.

    새로운 SSL 설정 파일 예시

    nginx
    복사편집
    server {
        listen 80;
        server_name example.com www.example.com;
    
        # HTTP -> HTTPS 리디렉션
        location / {
            return 301 https://$host$request_uri;
        }
    }
    
    server {
        listen 443 ssl;
        server_name example.com www.example.com;
    
        # SSL 인증서 경로
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
        # SSL 설정
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:...'; # 더 강력한 암호화 설정을 위해 추가할 수 있음
        ssl_prefer_server_ciphers on;
    
        # 루트 디렉토리와 기본 인덱스 설정
        root /var/www/html;
        index index.html index.htm;
    
        location / {
            try_files $uri $uri/ =404;
        }
    }
    
    이 파일을 /etc/nginx/conf.d/에 저장하면 Nginx가 이를 자동으로 인식하게 됩니다.

이유:

  • 기존 default 파일을 그대로 사용하면 불필요한 설정 변경 없이 간단히 SSL을 추가할 수 있음
  • Nginx 설정을 하나의 파일에서 관리하여 유지보수가 용이함
  • Certbot 실행 후 별도로 설정을 변경할 필요 없이 자동 적용 가능

🔹 Elastic IP 배포 후 작업 절차

  • 정리 1️⃣ Elastic IP 할당 후 퍼블릭 IP 확인
    aws ec2 describe-addresses
    2️⃣ 할당된 Elastic IP를 server_name에 반영
    server_name your-elastic-ip;
    3️⃣ Certbot으로 SSL 인증서 발급 및 자동 설정

    🔹 Certbot을 통한 SSL 인증서 발급

    배포 당일에 Certbot을 사용하여 SSL 인증서를 발급하고, 인증서 경로를 자동으로 설정할 수 있습니다. Certbot이 /etc/letsencrypt/live/ 디렉토리에 SSL 인증서를 저장하고, Nginx 설정 파일을 자동으로 수정하여 인증서를 적용합니다.
    sudo certbot --nginx -d your-elastic-ip
    4️⃣ 설정 확인 및 적용
    sudo nginx -t
    sudo systemctl restart nginx
profile
운동처럼 개발도 작은 실천이 성장의 힘이 된다고 믿는 개발자 minpractice_jhj 기록

0개의 댓글