Jenkins를 위한 SSL로 Nginx를 역방향 프록시로 구성하는 방법

소개

Jenkins는 기본적으로 자체 내장 웹 서버를 가지고 있으며, 포트 8080에서 듣습니다. 이것은 개인적인 Jenkins 인스턴스를 실행하거나 보안에 대해 걱정하지 않고 빠르게 무언가를 설정해야 하는 경우 편리합니다. 그러나 실제 프로덕션 데이터가 호스트로 전송되면 트래픽을 처리하는 데 Nginx와 같은 보안 웹 서버를 사용하는 것이 좋습니다.

이 게시물에서는 Nginx 웹 서버를 사용하여 Jenkins 인스턴스의 역방향 프록시로 사이트를 SSL로 랩핑하는 방법에 대해 설명하겠습니다. 이 튜토리얼은 Linux 명령에 대한 약간의 익숙함, 작동하는 Jenkins 설치 및 Ubuntu 20.04 설치에 대한 지식이 있다고 가정합니다.

아직 Jenkins를 설치하지 않은 경우 이 튜토리얼에서 나중에 설치할 수 있습니다.

필수 사항

이 안내서는 Ubuntu 20.04를 사용한다고 가정합니다. 시작하기 전에 시스템에 sudo 권한이 있는 비 root 사용자 계정이 설정되어 있어야 합니다. 이를 수행하는 방법은 Ubuntu 20.04 초기 서버 설정 자습서를 따라서 배울 수 있습니다. 또한 도메인을 호스팅하고 있는 Nginx 서버가 필요합니다. 이를 수행하는 방법은 Ubuntu 20.04에 Nginx 설치 방법을 따라서 배울 수 있습니다.

게다가, Jenkins 인스턴스를 SSL로 보호하는 것이 매우 중요합니다. 인터넷에서 보이는 경우, Let’s Encrypt로 보호할 수 있습니다. 이를 수행하는 방법은 Ubuntu 22.04에 Let’s Encrypt로 Nginx 보호하는 방법을 따라서 배울 수 있습니다.
이전에 언급한대로, 이 튜토리얼은 이미 Jenkins가 설치되어 있다고 가정합니다. 이 튜토리얼은 필요한 경우 Jenkins를 설치하는 방법을 보여줍니다. 아마도 그 문서를 위해 root 사용자로 전환해야 할 것입니다.

단계 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를 눌러주세요.

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

...
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 프록시 설정에 대한 좋은 정보가 있습니다.

A few quick things to point out here. If you don’t have a domain name that resolves to your Jenkins server, then the proxy_redirect statement above won’t function correctly without modification, so keep that in mind. Also, if you misconfigure the proxy_pass (by adding a trailing slash for example), you will get something similar to the following in your Jenkins Configuration page.

그러면 이 오류가 발생하는 경우 Nginx 구성에서 proxy_passproxy_redirect 설정을 다시 확인하십시오!

단계 2 — Jenkins 구성

Nginx와 함께 Jenkins를 사용하려면 모든 (0.0.0.0) 대신 로컬호스트 주소에서만 Jenkins 구성을 수신하도록 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이 포함된 “페이지를 열 수 없음” 오류가 발생합니다.

이를 해결하려면 Jenkins 내에서 몇 가지 설정을 업데이트해야 합니다. 먼저 Jenkins GUI에서 Jenkins URL을 업데이트하세요. 이는 Jenkins -> Manage Jenkins -> Configure System -> Jenkins Location 메뉴에서 찾을 수 있습니다.

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

그런 다음, 외부 제공업체의 OAuth 설정을 업데이트하세요. 이 예제는 GitHub을 위한 것입니다. GitHub에서 이 설정은 Settings -> Applications -> Developer applications에서 찾을 수 있습니다.

Jenkins에 대한 항목이 있어야 합니다. Homepage URLAuthorization callback URL을 HTTPS 설정에 맞게 업데이트하세요. 다음과 유사한 내용일 수 있습니다:

결론

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-configure-nginx-with-ssl-as-a-reverse-proxy-for-jenkins