Nginx Proxy 설정 관련 메모 복제하여 정리 (원본 출처)


nginx 설정 파일을 보면 URL 경로가 /로 시작하여 들어오는 경우, root에 지정된 경로에 따라 일치하는 파일로 이동하여 웹에서 보여준다. 하지만 reverse proxy를 서버 블록에 적용하면 URL 경로와 적합한 서버블록을 찾은 후 해당 서버블록의 정보의 proxy_pass에 따른 내용을 보여준다. reverse_proxy를 통해 9000번 포트를 통해 접속해야 볼 수 있는 화면도 80번 포트에 접속했을 때 확인할 수 있도록 설정을 변경할 수 있다.


reverse_proxy의 장점

  • 보안 nginx에 reverse_proxy를 통해 접근하도록 설정하면 해당 서버에 접속하는 클라이언트와 서버 IP 모두들 숨길 수 있게 된다. 제공하는 프록시 서버의 IP만 공개함으로써 해킹에 대한 대비를 할 수 있다. 또한 만얀, 해킹을 당하더라고 중요한 정보가 담겨져 있는 DB서버와 캐시 서버 등의 기존 서버에 대한 해킹을 방지할 수 있다.

  • 서버 성능 성능면에서도 우위를 점할 수 있다. 프록시 서버를 사용하여 캐싱 기능과 트래픽 분산 기능을 결합시켜 전반적인 서버 성능의 향상을 도모할 수 있다.

  • 트래픽 분산 - 로드 밸런싱 몇몇 프록시 서버는 트래픽 분산 기능을 제공한다. 이 중에서 nginx도 포함된다. 한 서버에 트래픽이 과도하게 몰릴 경우 해당 서버가 버티지 못하는 경우도 종종 발생한다. 이러한 경우를 방지하고자 nginx는 지정된 프록시 서버에 트래픽을 분산시켜 트래픽이 과중하게 몰리는 경우를 미연하게 방지한다.

nginx를 기본으로 설치하면 해당 내용의 기본 설정이 적용되어 서버가 동작하게 된다.

# nginx의 기본 server 블록 설정
# /etc/nginx/conf.d/default.conf

server {
    listen       80;
    server_name  localhost;

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

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

간단한 reverse proxy 설정

reverse proxy 기능을 활용하기 위해 서버 블록안에 proxy_pass 등의 옵션을 추가하여 reverse proxy 설정을 진행할 수 있다.

# Example1
# /etc/nginx/conf.d/default.conf

server {
     listen 80;

	 ...
    
     location ^~ /api {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
     }
    
     ...
    
}
# Example2
upstream server {
    server 127.0.0.1:8080;
    keepalive 32;
}


server {
    listen 80;
    server_name 127.0.0.1;

    location /api {
        proxy_http_version 1.1;          # <-
        proxy_set_header Connection "";  # <-

        proxy_pass http://server;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
    }
}

# 이중화 구성 시 예시
upstream nuxt_servers {
    server localhost:3000;  # 첫 번째 Nuxt 서버의 주소 및 포트
    server localhost:3001;  # 두 번째 Nuxt 서버의 주소 및 포트
    # 추가적으로 필요한 Nuxt 서버들을 필요한 만큼 추가할 수 있습니다.
}

upstream api_server {
    server localhost:8080;  # API 서버의 주소 및 포트
}

server {
    listen 80;

    server_name your_domain.com;

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

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

Nginx에서 API 서버로 HTTP/1.1 요청이 가는 것을 확인할 수 있다.

nginx reverse_proxy의 핵심요소

location ^~ /api {
    proxy_pass http://localhost:9000;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

proxy_pass : URL이 api로 시작하는 주소로 접근하면 localhost:9000으로 포워드한다. 사용자가 9000번 포트로 접근하지 않고 80번 포트로 접근하여도 api를 맨 앞에 포함한 경로로 접근하면 80번 포트로 접근한 것과 같은 상황이 발생하도록 한다. proxy_http_version : 프록시를 위한 HTTP 프로토콜 버전을 입력한다. 기본은 1.0이다. nginx 공식 홈페이지에 의하면 프로토콜 버전을 1.1로 입력하는 것을 추천한다. proxy_set_header : 프록시 서버의 헤더값을 지정해준다.

location 설정 요소

location을 설정할 때, 잘못 설정하면 프록시 연결이 되지 않고 헤메기 쉽상이다.

이에 따라 location 설정에 대한 옵션을 따로 정리하고자 한다.

location = /api {
    ...
}
  • 정확하게 일치하는 경우 해당 블록 설정을 실행 -> ( localhost/api 로 접속한 경우 )
  • 패턴이 일치하는 경우 -> ( localhost/api/host, localhost/api/good )
location ~ \.(gif|jpg|jpeg|png)$ {
    ...
}
  • 정규식 표현이 일치하는 경우 해당 블록 설정을 실행(대, 소문자도 구분하여 실행한다.)
location ~* \.(gif|jpg|jpeg|png)$ {
    ...
}
  • 정규식 표현이 일치하는 경우 해당 블록 설정을 실행(대, 소문자도 구분을 하지 않는다.)

예시

docker-componse메모 작성 할 때 사용한 간단한 예시

server {
    listen 8081;
    server_name frontend

    resolver 127.0.0.11;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }

    location ^~ /api {
        proxy_pass http://backend:8080/api;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/