JenkinsのリバースプロキシとしてSSLを使用するNginxの構成方法

導入

デフォルトでは、Jenkinsは8080ポートでリッスンする独自の組み込みWebサーバーが付属しています。これは、プライベートのJenkinsインスタンスを実行している場合や、すばやく何かを立ち上げる必要がありセキュリティについて心配していない場合に便利です。ただし、本番データをホストに送信するようになると、トラフィックを処理するためにNginxなどのより安全なWebサーバーを使用するのが良い考えです。

この投稿では、Nginx Webサーバーを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 はその速度と柔軟性からお気に入りの Web サーバーになっており、それが私たちのアプリケーションに理想的な選択肢となっています。

構成の編集

次に、デフォルトの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_nameおよびproxy_redirect行を独自のドメイン名で更新する必要があります。さらに、リクエストがNginxによって読み取られ、レスポンス側でリライトされるようにするためのいくつかの追加的なNginxの処理が行われています。

ファイルを保存して閉じます。もしnanoを使用した場合、Ctrl + XY、そして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でのプロキシ設定について詳しく学びたい場合は、このチュートリアルに良い情報があります。

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_passおよびproxy_redirect設定を再確認してください!

ステップ2 — Jenkinsの設定

JenkinsがNginxと連携するためには、Jenkinsの構成を更新して、すべてのアドレス(0.0.0.0)ではなく、localhostアドレスのみでリッスンする必要があります。これにより、トラフィックが適切に処理されます。これは重要なセキュリティステップです。なぜなら、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を訪問しようとすると、「ページの開くことに失敗しました」というメッセージが表示され、URLは次のようになります:http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string

これを修正するには、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