웹사이트 검색

SSL을 사용하여 Jenkins의 역방향 프록시로 Nginx를 구성하는 방법


소개

기본적으로 Jenkins는 포트 8080에서 수신 대기하는 자체 내장 웹 서버와 함께 제공됩니다. 이것은 개인 Jenkins 인스턴스를 실행하거나 무언가를 빨리 가져와야 하고 보안에 신경 쓰지 않는 경우에 편리합니다. 그러나 실제 프로덕션 데이터가 호스트로 전송되면 트래픽을 처리하는 Nginx와 같은 더 안전한 웹 서버를 사용하는 것이 좋습니다.

이 게시물에서는 Nginx 웹 서버를 Jenkins 인스턴스의 리버스 프록시로 사용하여 사이트를 SSL로 래핑하는 방법을 자세히 설명합니다. 이 자습서에서는 Linux 명령, 작동 중인 Jenkins 설치 및 Ubuntu 20.04 설치에 어느 정도 익숙하다고 가정합니다.

아직 설치하지 않은 경우 이 자습서의 뒷부분에서 Jenkins를 설치할 수 있습니다.

전제 조건

이 가이드는 Ubuntu 20.04를 사용하고 있다고 가정합니다. 시작하기 전에 시스템에 설정된 sudo 권한이 있는 루트가 아닌 사용자 계정이 있어야 합니다. Ubuntu 20.04에 Nginx를 설치하는 방법 자습서에 따라 이를 수행하는 방법을 배울 수 있습니다.

또한 Jenkins 인스턴스를 SSL로 보호하는 것이 매우 중요합니다. 인터넷에 보이는 경우 Let’s Encrypt로 보호할 수 있습니다. Ubuntu 22.04에서 Let’s Encrypt로 Nginx를 보호하는 방법 자습서에서 이 작업을 수행하는 방법을 배울 수 있습니다.

1단계 - Nginx 구성

Nginx는 최근 몇 년 동안 속도와 유연성으로 인해 선호하는 웹 서버가 되었으며, 이는 우리 애플리케이션을 위한 이상적인 선택이 되었습니다.

구성 편집

다음으로 기본 Nginx 구성 파일을 편집해야 합니다. 다음 예에서는 nano를 사용합니다.

  1. sudo nano etc/nginx/sites-enabled/default

최종 구성은 다음과 같습니다. 섹션이 나누어져 있으며 아래에 간략하게 설명되어 있습니다. 먼저 백업 복사본을 만들 수도 있지만 기존 구성 파일을 업데이트하거나 교체할 수 있습니다.

server {23
    listen 80;
    return 301 https://$host$request_uri;
}

server {

    listen 443;
    server_name jenkins.domain.com;

    access_log            /var/log/nginx/jenkins.access.log;

    location / {

      proxy_set_header        Host $host;
      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://jenkins.domain.com;
    }
    
    ...
}

server_nameproxy_redirect 줄을 자신의 도메인 이름으로 업데이트해야 합니다. 리버스 프록시가 작동하도록 요청을 Nginx에서 읽고 응답 측에서 다시 작성하도록 지시하는 몇 가지 추가 Nginx 마법도 진행됩니다.

파일을 저장하고 닫습니다. nano를 사용한 경우 Ctrl + X, Y를 누른 다음 Enter를 누르면 됩니다.

첫 번째 섹션은 포트 80(기본 HTTP)에서 들어오는 모든 요청을 수신하고 HTTPS로 리디렉션하도록 Nginx 서버에 지시합니다.

...
server {
   listen 80;
   return 301 https://$host$request_uri;
}
...

그 후 프록시가 발생합니다. 기본적으로 들어오는 요청을 받아 로컬 네트워크 인터페이스의 포트 8080에 바인드/리스닝하는 Jenkins 인스턴스로 프록시합니다.

...
location / {

    proxy_set_header        Host $host;
    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://jenkins.domain.com;
}
...

참고: Nginx에서 프록시에 대해 자세히 알아보려면 이 자습서에서 Nginx 프록시 설정에 대한 좋은 정보를 얻을 수 있습니다.

여기서 지적해야 할 몇 가지 간단한 사항입니다. Jenkins 서버로 확인되는 도메인 이름이 없는 경우 위의 proxy_redirect 문은 수정하지 않으면 올바르게 작동하지 않으므로 이 점을 명심하세요. 또한 proxy_pass를 잘못 구성한 경우(예: 후행 슬래시 추가) Jenkins 구성 페이지에 다음과 유사한 내용이 표시됩니다.

따라서 이 오류가 표시되면 Nginx 구성에서 proxy_passproxy_redirect 설정을 다시 확인하세요!

2단계 — Jenkins 구성

Jenkins가 Nginx와 함께 작동하려면 모든 주소(0.0.0.0)가 아닌 localhost 주소에서만 수신하도록 Jenkins 구성을 업데이트하여 트래픽이 제대로 처리되도록 해야 합니다. Jenkins가 여전히 모든 주소에서 수신 대기 중인 경우 원래 포트(8080)를 통해 여전히 잠재적으로 액세스할 수 있기 때문에 이것은 중요한 보안 단계입니다. 이러한 조정을 위해 /etc/default/jenkins 구성 파일을 수정합니다.

  1. sudo nano /etc/default/jenkins

JENKINS\\_ARGS 줄을 찾아 다음과 같이 업데이트합니다.

JENKINS_ARGS="--webroot=/var/cache/jenkins/war --httpListenAddress=127.0.0.1 --httpPort=$HTTP_PORT -ajp13Port=$AJP_PORT"

–httpListenAddress=127.0.0.1 설정을 추가하거나 수정해야 합니다.

그런 다음 계속해서 Jenkins와 Nginx를 다시 시작합니다.

  1. sudo service jenkins restart
  2. sudo service nginx restart

이제 HTTPS를 사용하여 도메인을 방문할 수 있으며 Jenkins 사이트가 안전하게 제공됩니다.

선택 사항 - OAuth URL 업데이트

인증을 위해 GitHub 또는 다른 OAuth 플러그인을 사용하는 경우 이 시점에서 손상될 수 있습니다. 예를 들어 URL을 방문하려고 하면 http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string과 유사한 URL을 사용하여 "페이지를 열지 못했습니다.\라는 메시지가 표시됩니다. .

이 문제를 해결하려면 OAuth 플러그인 설정을 포함하여 Jenkins 내의 몇 가지 설정을 업데이트해야 합니다. 먼저 Jenkins GUI에서 Jenkins URL을 업데이트합니다. Jenkins -> Jenkins 관리 -> 시스템 구성 -> Jenkins 위치 메뉴에서 찾을 수 있습니다.

HTTPS를 사용하도록 Jenkins URL 업데이트 - https://jenkins.domain.com/

그런 다음 외부 공급자로 OAuth 설정을 업데이트합니다. 이 예제는 GitHub용입니다. GitHub에서는 GitHub 사이트의 설정 -> 애플리케이션 -> 개발자 애플리케이션에서 찾을 수 있습니다.

Jenkins에 대한 항목이 있어야 합니다. HTTPS 설정을 반영하도록 홈페이지 URL 및 인증 콜백 URL을 업데이트합니다. 다음과 유사할 수 있습니다.

결론

남은 일은 모든 것이 올바르게 작동하는지 확인하는 것입니다. 위에서 언급한 대로 이제 HTTP 또는 HTTPS를 통해 새로 구성된 URL(jenkins.domain.com)을 탐색할 수 있습니다. 보안 사이트로 리디렉션되고 새로 업데이트된 SSL 설정을 포함한 일부 사이트 정보가 표시되어야 합니다. 앞에서 언급했듯이 DNS를 통해 호스트 이름을 사용하지 않는 경우 리디렉션이 원하는 대로 작동하지 않을 수 있습니다. 이 경우 Nginx 구성 파일에서 proxy_pass 섹션을 수정해야 합니다.