Back-End/Back-End 자료실

NginX 설정 : 리버스 프록시 + Https(SSL) 적용하기

Chipmunks 2023. 6. 20.
728x90

AWS EC2 우분투 서버에서 스프링 부트 서버를 가동하고 있습니다.

$ nohup java -jar -Djasypt.encryptor.password=암호화키 ./서버애플리케이션.jar &

NginX 설정에선 이미 Https (SSL) 설정을 마친 상태인데요.

Https 설정을 적용한 채로 스프링 부트 서버에 접속하기 위해선, 리버스 프록시 설정을 추가해야 합니다.

 

리버스 프록시는 NginX 에 요청이 들어오면, 다른 서버에 연결을 토스해주는 기능을 해줍니다.

사용자는 실제 서버의 정체를 모르고도 통신을 할 수 있게 되는데요.

NginX 에선 다음과 같이 설정했습니다.

 

$ vi /etc/nginx/sites-available/default

NginX 설정 편집기에 들어가 아래와 같이 작성합니다.

...

server {
        listen 443 ssl http2;

        server_name 도메인명;

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

        ssl_certificate "/etc/letsencrypt/live/도메인명/fullchain.pem";
        ssl_certificate_key "/etc/letsencrypt/live/도메인명/privkey.pem";
        ssl_dhparam "/etc/ssl/certs/dhparam.pem";

        add_header Strict-Transport-Security "max-age-31536000";

        location / {
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwared-Proto $scheme;
                proxy_pass http://localhost:8080/;
                proxy_redirect off;
        }
}

...

 

ssl_~~~~ 속성은 이전에 마친 Https SSL 설정입니다.

LetsEncrypt ( 또는 Certbot ) 에서 만들어준 키를 입력하고, openssl 도구로 생성한 디피-헬만 파라미터 파일을 넣었습니다.

$ openssl dhparam 2048 -out /etc/ssl/certs/dhparam.pem

 

location / { ... } 부분이 리버스 프록시 설정입니다.

proxy_set_header field value 은 다른 서버로 요청을 전달할 때 추가로 헤더에 field : value 형태로 붙여줍니다.

 

Module ngx_http_proxy_module

Module ngx_http_proxy_module The ngx_http_proxy_module module allows passing requests to another server. Example Configuration location / { proxy_pass http://localhost:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } Directives

nginx.org

일반적으로 HTTP 리버스 프록시 헤더로 아래와 같이 헤더를 추가하여 백엔드 서버로 보내줍니다.

표준으로 정해져 있진 않지만 관습적으로 사용하고 있습니다.

X-Forwarded-For: 12.34.56.78, 23.45.67.89
X-Real-IP: 12.34.56.78
X-Forwarded-Host: example.com
X-Forwarded-Proto: https

proxy_set_header 으로 직접 헤더에 NginX 가 제공하는 변수를 활용해 요청 헤더에 추가해주고 있습니다.

 

$http_host 는 요청으로 넘어온 Host 헤더를 변경하지 않은 채로 그대로 전달합니다.

만약 요청 헤더에서 Host 가 없다면 전달되지 않습니다.

이를 방지하기 위해선, $host 를 사용하는 걸 추천드립니다.

$host 는 요청 헤더에서 넘어온 Host 를 넘겨주고, 만약 그 값이 없다면 프라이머리 서버 이름(내 도메인)이 들어갑니다.

 

두 번째로 X-Real-IP 헤더에 $remote_addr 값을 담아 보내줍니다.

스프링 부트(백엔드) 서버에서 실제로 요청한 사용자의 IP 주소를 알 수 있도록 헤더에 담아서 보내줍니다.

 

세 번째로 X-Forwarded-For $proxy_add_x_forwared_for 은 IP 주소($remote_addr)를 콤마(,)로 구분해서 계속 추가해줍니다.

마지막으로 X-Forwarded-Proto 헤더에 $scheme 값을 넣어줍니다. $scheme 변수는 요청 프로토콜 http 또는 https 을 넣어줍니다.

현재 프라이머리 서버는 https 만 받으므로 https 만 들어오게 됩니다.

 

proxy_pass 는 요청을 보낼 서버 주소를 입력합니다.

같은 서버에서 스프링 부트 서버를 가동시키고 있으므로, localhost:8080, 포트번호까지 포함합니다.

내부 백엔드 서버에선 http 프로토콜로 가동되는데요.

NginX 요청으로 Https 설정이 되어있기에, 사용자 입장에선 백엔드 서버와 Https 으로 통신이 되는 것처럼 느껴집니다.

 

proxy_redirect off; 는 이전 레벨에서 상속된 설정을 사용하지 않고 proxy_redirect 기능을 끕니다.

proxy_redirect redirect replacement; 으로 설정하면, 서버 응답 헤더에서 Location, Refresh 헤더 필드의 값이 대체(Replace)됩니다.

proxy_redirect http://localhost:8000/two/ http://frontend/one/; 으로 설정하면, 첫 번째 값의 문구가 두 번째 값의 문구로 대체됩니다.

 

위 설정으로 저장하고 재시작 또는 설정 새로고침을 하면 적용이 완료됩니다.

$ sudo service nginx reload
$ sudo service nginx restart

댓글