Linux/Nginx

서버 Nginx 설정 location 블럭 proxy 설정하기

laughcryrepeat 2023. 1. 31. 17:44

 

 복합적인 구조를 가지는 애플리케이션의 서버를 구성할때, nginx의 설정파일인 /etc/nginx/nginx.conf 파일 내부에서 location 블록의 url 패턴 구성을 통해 로드밸런싱을 할 수 있습니다. 

 

location 문법의 위치조정 부호와 패턴 우선순위

nginx는 클라이언트가 접근한 path에서 가장 적합한 location 블럭 매칭을 찾아 처리합니다.

여러개가 일치해도 처리하는 우선순위가 있습니다.

 

1순위. = exactly 완전한 일치

URI가 정확히 일치해야 되고, get방식 문자열 전달 가능. ex) domain.com/admin?param

정규식을 사용할 수 없음.

location = /admin {
    proxy_pass http://127.0.0.1:8080;
}

 

2순위. ^~ priority prefix match 우선 순위 부여 정규식 앞부분 일치

문법: location ^~ /[패턴] { . . . }

location ^~ /user/ {
    proxy_pass http://localhost:3000;
}

 

3순위. ~ regex match wirh sensitive case 대소문자를 구분하는 정규식 일치

문법 : location ~ ^/[패턴]$ { . . . }

location ~ ^/admin {
    rewrite ^ domain.com redirect;
}

 

4순위. ~* regex match with insensitive case 대소문자를 무시하는 정규식 일치

문법 : location ~* ^/[패턴]$ { . . . }

location ~* ^/admin {
    rewrite ^ domain.com redirect;
}

 

5순위. / prefix match 하위 일치

문법 : location /[패턴] { . . . }

 

지정된 URI 패턴으로 시작하며 일치함.

정규식을 사용할 수 없음.

location /admin {
    proxy_pass http://127.0.0.1:8080;
}
#ex) domain.com/admin?param, domain.com/admin/, domain.com/adminaa

 

 

 최근에 배포한 앱의 구성이 MVC 패턴 앱에 어떤 기능 모듈만 리액트 프론트로 구성된 프로젝트가 있었습니다.

서버는 하나의 도메인만 연결해, 프론트와 mvc 백엔드는 같은 도메인을 사용했습니다.

프론트의 빌드 결과물은 static 폴더내에 위치하므로, 서버로 가는 특정 url을 제외한 모든 url은 프론트의 static 폴더를 root로 지정 해야했습니다. 또한 기본 도메인은 백엔드 mvc 메인페이지로 연결되어야 합니다.

다음은 정규식 패턴을 사용해 구성한 location 블럭의 예시 입니다.

 

server {
        server_name  domain.server.io;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        # 백엔드로 향하는 path
        location ~ ^(/aa/|/bb/|/css/|/js/|/images/|/auth/|/api/|/oauth2/) {
           proxy_pass http://localhost:8080;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header Host $http_host;
        }
        # 기본 도메인을 백엔드 메인 페이지에 연결
        location = / {
          proxy_pass http://localhost:8080;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
        }
        # 기본 도메인 이후 한개이상의 문자열이 붙는 경우 리액트 프론트로 연결.
        location ~ ^/([\S+]) {
          root /home/ec2-user/static/;

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

        location /assets {
          root /home/ec2-user/static/;
        }
}