이 영역을 누르면 첫 페이지로 이동
천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

페이지 맨 위로 올라가기

천천히 꾸준히 조용히

천천히 꾸준히 조용히.. i3months 블로그

[Nginx] 리버스 프록시 서버 구축

  • 2024.11.13 21:19
  • 💡 솔루션
반응형

 

 

 

Nginx는 프론트엔드의 정적 리소스를 서빙하는 웹서버 역할도 수행할 수 있지만, 클라이언트의 요청을 받아서 Tomcat 같은 WAS로 요청을 넘겨주는 리버스 프록시 서버 역할도 수행할 수 있다.

 

리버스 프록시로 동작하는 Nginx 서버를 구축해보자. 

 

# 사용하는 CPU 수
worker_processes  1;

# 로그 기록 위치와 로그 수준
error_log  logs/error.log  info;

# 재시작시 사용되는 pid 저장 경로
pid        pid/nginx.pid;


# worker 프로세스당 4096개 연결 처리
events {
    worker_connections  4096;
}


http {
    # nginx 버전 숨기기 
    server_tokens off;
    # MIME 정의 파일
    include       mime.types;
    # 기본 파일 타입 설정 
    default_type  application/octet-stream;

    # 파일 크기 설정 
    client_max_body_size 2G;

    # 연결 시간
    proxy_read_timeout 7200s;
    proxy_connect_timeout 7200s;
    proxy_send_timeout 7200s;


    # 해시로 server_name 빠르게 매칭
    server_names_hash_bucket_size  64;
    
    # 로그 형식 정의
    log_format  main  '[$time_local] $remote_addr - $status - '
                    '"$request" => "$request_filename" ~ from "$http_referer" '
                    '"$http_x_forwarded_for"';    

    # 파일 전송 최적화
    sendfile        on;        
    # 접속 유지 시간
    keepalive_timeout  65;
    
    # 압축 최적화
    gzip  on;

    server {
        listen      *:80;
        server_name my.domain.co.kr
                    my2.domain.co.kr
                    127.0.0.1;

        return 301 https://$host$request_uri;
    }

    server {        
        listen      *:443 ssl;
        server_name my.domain.co.kr
                    127.0.0.1;
        
        access_log  D:/Service.Log/Nginx/WEB-PATH/access.log  main;
        error_log  D:/Service.Log/Nginx/WEB-PATH/error.log info;

        include nginx-ssl.conf;

        location / {
            proxy_pass http://127.0.0.1:3600;
			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;
        }
    }

    server {        
        listen      *:443 ssl;
        server_name my2.domain.co.kr
                    127.0.0.1;
        
        access_log  D:/Service.Log/Nginx/WEB-DCM/DCM-access.log  main;
        error_log  D:/Service.Log/Nginx/WEB-DCM/DCM-error.log info;

        include nginx-ssl.conf;

        location / {
            proxy_pass http://127.0.0.1:3100;
			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;
        }
    }

}


# nginx-ssl.conf
ssl_certificate      cert/STAR.domain.co.kr_crt.pem;
ssl_certificate_key  cert/STAR.domain.co.kr_key.pem;
ssl_protocols        TLSv1 TLSv1.2 TLSv1.3;

 

 

HTTP 요청을 받을 때 클라이언트의 요청 IP와 함께 도메인 이름을 기반으로 적절한 server 블록을 찾는다. 

 

클라이언트의 요청에는 Host 헤더에 요청된 도메인 이름이 포함되고, Nginx는 이 Host 헤더의 정보를 바탕으로 server 블록을 탐색해 매칭한다. (virtual host 기능 제공)

 

Nginx 쪽에서 인증서 처리를 해 줬으니 Tomcat에서는 따로 해주지 않아도 된다. 

 

 

server 블록은 Host 헤더를 파싱해서 요청을 처리할 Virtual Host를 결정함.

설정 파일에 server가 2개인데, Host 헤더를 파싱해 단일 진입점으로 사용하더라도 서브도메인이 다르면 다른 서버로 라우팅해준다.

 

 

 


 

 

 

 

AWS나 GCP 쓰면 돈 좀 내고 편하게 쓸 수 있는데, 온프레미스 서버에 직접 구축하려면 하나하나 수작업 해줘야함.

 

Apache는 요청 하나당 프로세스나 쓰레드 하나를 할당하는 Blocking I/O 방식을 사용해 동접이 늘어날수록 성능이 떨어진다.

Nginx는 Master - Worker 를 구분하는 Event-Driven 모델을 사용해 문제를 해결함.

 

Master Process는 설정 파일을 읽고 Worker Process를 관리한다.

Worker Process는 실제 네트워크 트래픽을  처리한다. Non-Blocking I/O 방식을 사용해 프로세스 하나가 여러 연결을 처리함.

 

Worker Process 내부는 Event Loop 방식으로 동작해 이벤트를 감지한다.

 

Window Server에서 Nginx 돌릴 때는 간혹 Nginx 프로세스가 2개 이상 실행되는 경우 제대로 작동하지 않던데; 

제대로 작동하지 않는 것 같으면 이 부분을 먼저 확인하기..

 

재부팅 할 때 마다 다시 켜지도록 설정해야되는데 이 때는 NSSM을 사용함.

작업 스케쥴러를 써보려고 했는데. 그거보다는 NSSM이 더 낫더라. 

 

사용자 로그인 없어도 실행시켜주고 프로세스가 죽어도 알아서 살려준다는게 참;; 이거덕분에 주말에 원격 안붙어도 됐음

반응형
저작자표시 (새창열림)

'💡 솔루션' 카테고리의 다른 글

[SQL Server] 암호화 된 View 다루기  (1) 2025.01.03
[MySQL] WITH RECURSIVE 계층 쿼리  (0) 2024.12.13
[Tomcat] 네트워크 드라이브 권한 관련 오류  (0) 2024.11.09
[PDF.js] PDF.js 완벽 가이드  (3) 2024.11.07
[Spring Batch] 메타데이터 테이블과 시퀀스  (0) 2024.11.05

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [SQL Server] 암호화 된 View 다루기

    [SQL Server] 암호화 된 View 다루기

    2025.01.03
  • [MySQL] WITH RECURSIVE 계층 쿼리

    [MySQL] WITH RECURSIVE 계층 쿼리

    2024.12.13
  • [Tomcat] 네트워크 드라이브 권한 관련 오류

    [Tomcat] 네트워크 드라이브 권한 관련 오류

    2024.11.09
  • [PDF.js] PDF.js 완벽 가이드

    [PDF.js] PDF.js 완벽 가이드

    2024.11.07
다른 글 더 둘러보기

정보

천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

  • 천천히 꾸준히 조용히의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (675) N
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • C (25)
      • C++ (12)
      • Java (19)
      • JavaScript (15)
      • Python (1)
      • PHP (2)
    • Computer Science (142)
      • Machine Learning (38)
      • Operating System (18)
      • Computer Network (28)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
      • Compiler Design (11)
      • Computer Security (13)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Amazon Web Service (8)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • 💡 솔루션 (17)
    • 👥 모각코 (8)
    • 💬 기록 (7) N
    • 📚 공부 (5)
    • -------------- (25)

최근 글

나의 외부 링크

메뉴

  • 홈
반응형

정보

i3months의 천천히 꾸준히 조용히

천천히 꾸준히 조용히

i3months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © i3months.

티스토리툴바