Jenkins 리버스 프록시 설정 방법 (with EC2, https)

김세환·2021년 5월 19일
1

EC2 서버에 올린 젠킨스 리버스 프록시 설정하기

이 글은 Jenkins 서버 구축 이후 리버스프록시 설정을 하는 방법에 대해서 다룹니다.
AWS EC2, Route53을 통한 도메인 연결, Cloud front를 이용한 https 적용까지 다룹니다.

리버스 프록시?

우선 리버스 프록시에 대해 알아보고 시작하자.

리버스 프록시란 사용자가 특정 URL로 서비스를 요청하면, 이 요청을 리버스 프록시 서버가 요청에 맞는 알맞은 서비스로 포워딩 해주는 기능이라고 생각하면 좋다.

예를들어 내 서버에 돌아가고있는 서비스가 포트별로 상이하다고 해보자.

3000번 포트는 정적 웹 제공용으로, 5000번은 API 서버용으로, 8086은 DB용으로 사용중이라고 생각해보자.

또한 내 서버의 도메인 주소는 www.example.com 이라고 할 때.

사용자가 정적 웹 서비스를 사용하기 위해 www.example.com:3000 이라든지, 혹은 API 서버를 직접 호출하기 위해 www.example.com:5000 으로 접근하는 방법은 불편할 것이다.

당연히 보안에도 문제가 있다.

따라서 www.example.com 으로 (브라우저에서 이렇게 요청하면 80번 혹은 443번 포트로 요청한다.) 요청하면 서버가 알아서 3000번으로 해당 요청을 넘겨주거나

www.example.com/api/v1/ 등으로 요청하면 알아서 5000번 으로 해당 요청을 넘겨준다던지 하는것이 리버스 프록시가 되겠다.

젠킨스는 기본적으로 8080번 포트에서 돌고있다. 따라서 보통 ec2에 젠킨스를 설치하였다면.

public_ip:8080 으로 접속해서 사용하게 된다.

하지만 이를 ci.example.com 과 같이 80번 포트로, 자신이 사용할 도메인 주소로 접근했을때 젠킨스를 사용할 수 있도록 만들어줄 필요가 있다.

설정 방법

우선 젠킨스에 리버스 프록시를 적용하는 방법은 매우 다양하다.

각종 웹서버(아파치, Nginx 등등)별로, 그리고 리눅스 iptables를 통해 셋업하는 방법이 나와있는데 우리는 여기서 Nginx를 사용해 리버스 프록시를 적용해보고자 한다.

그래서 최종적으로 연결된 상태의 아키텍쳐는 다음과 같을 것이다.

1. EC2 설정

EC2에서 80번포트를 개방한다. 웹 브라우저를 통해(80 번포트) 특정 도메인으로 요청을 했을 경우 젠킨스를 서비스하기 위함이다.

인바운드 포트로 80번을 열어놓는다.

2. Route53 도메인 연결 + Cloud Front

Cloud Front를 통해 EC2 <-> Cloud Front 간 연결을 정의하고. http 요청을 https로 리다이렉트 함으로서 https 적용까지 한다.

우선 Cloud Front에 접속한다.

Create Distribution 을 클릭한다.

Origin Domain Name에 EC2의 퍼블릭 도메인을 입력하면된다. 이는 EC2 대시보드에서 다음과 같이 확인 할 수 있다.

퍼블릭 IPv4 DNS에 있는 정보를 복사한다.

Origin Domain Name에 해당 내용을 붙여넣기하면 자동으로 Origin ID까지 입력된다.

밑으로 내리다보면 빨간 네모친 부분들이 보일것이다.

Viewer Protocol Policy 설정을 Redirect HTTP to HTTPS로 변경해준다.

이는 http로 들어온 요청을 Cloud Front 프록시를 거친 이후에 HTTPS로 리다이렉트 해준다는 내용이다.

기타 나머지 내용들도 사진과 동일하게 셋업하자.

밑으로 내리다보면 Distribution Settings가 있다.

여기는 Https 적용을 위한 인증서를 셋업하는 부분이라고 생각하면 된다.

Alternative Domain Name에 여러분이 Jenkins 주소로 사용하고자 하는 도메인을 입력한다.

보통은 ci.도메인.com 으로 하는 편

이후 Custom SSL Certificate을 설정해주어야 하는데. ci.도메인.com 인증을 적용 가능한 인증서를 셋업해야 한다. 이 부분이 미리 준비가 안되어있거나 잘 모르겠다면 추후 포스팅할 Amazon SSL 인증서 포스팅을 참고하자. (2021년 6월 전 포스팅 예정)

위와 같이 셋업하고 마무리하면 xxxxx.cloudfront.net 과 같은 도메인을 얻을 수 있다.

빨간 네모친 부분의 주소를 브라우저에 입력하면 여러분의 EC2에서 돌아가는 Nginx의 초기 페이지가 보여야 정상이다.

이제 이 CloudFront URL을 우리가 사용하고자 하는 도메인과 연결해야 한다.

Route53에 들어간다.

Route53에서 여러분이 호스팅하고자 하는 영역에 들어가 새로운 레코드를 생성한다.

레코드 이름에는 우리가 아까 Cloud Front에 적은 Alternative Domain Name인 ci.도메인명을 입력해준다. 유형은 CNAME, 값은 Cloud Front URL을 입력하고 레코드를 생성한다.

이 과정까지 정상적이라면 ci.도메인명 으로 브라우저를 통해 접속했을 때 https 적용이 된 상태로 Nginx 초기 화면이 보여야 한다.

이제 남은 과정은 이 도메인으로 들어오는 연결을 젠킨스가 처리하도록 리버스 프록시 설정을 셋업하는 과정이다.

이 과정을 잘 설명해준 블로그 링크를 첨부한다. https://willseungh0.tistory.com/7

우리는 이 블로그와 약간 다르게 진행 할 것이다.

EC2에 접속한 이후(터미널) cd /etc/nginx/sites-available 명령어를 통해 해당 경로를 들어간다.

여기서 ci.example.com 과 같이 사용하고자 하는 도메인명으로 파일을 만든다.

server {
    listen [::]:80;
    listen 80;

    server_name ci.도메인명.com;

    location / {
        proxy_set_header        Host $host:$server_port;
        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_pass          http://localhost:8080;
        proxy_read_timeout  90;

        proxy_redirect      http://localhost:8080 https://ci.도메인명.com;

        proxy_http_version 1.1;
        proxy_request_buffering off;
        add_header 'X-SSH-Endpoint' 'ci.도메인명.com:50022' always;
    } 
}

위와 같은 내용을 작성해 저장한다.

이후 /etc/nginx/sites-enabled 디렉터리에 동일한 파일을 만들어줘야하는데. 보통 심볼릭 링크를 걸어놓는다.

ln -s /etc/nginx/sites-available/ci.도메인명.com /etc/nginx/sites-enabled/ci.도메인명.com

이와 같이 심볼릭 링크를 걸면 된다.

이후 nginx -t 명령어를 입력해 nginx 설정 파일 검증을 한다. 이상이 없다면 다음과 같은 내용이 나올것이다.

테스트에 성공했다면

systemctl restart nginx 를 통해 nginx를 재시작한다.

상기 과정이 모두 정상적이라면 ci.도메인명.com 을 웹브라우저를 통해 접속했을때 다음 화면과 같이 젠킨스를 접근 할 수 있다.

마치며

위와 같은 과정으로 nginx를 사용해 젠킨스에 리버스 프록시를 적용 할 수 있다.

이 작업이 끝나면 Jenkins URL을 사용하는 작업

예를들어 OAuth 인증(깃헙), 깃헙 웹훅과 같은 것들 모두 ci.도메인명.com을 통해 접근, 설정 할 수 있다.

리버스 프록시를 연결하는 방법은 매우 많지만 이 방법은 AWS 리소스만을 활용해서 Jenkins 를 구축하고 Https가 적용된 리버스 프록시 셋업이 가능하다.

혹시나 하다가 막히는 점이 있으면 댓글로 남겨주길 바란다.

profile
DevOps 엔지니어로 핀테크 회사에서 일하고있습니다. 아직 많이 부족합니다.

0개의 댓글