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

前書き

デフォルトでは、Jenkinsには、ポート8080をリッスンする独自の組み込みWinstone Webサーバーが付属しています。これは、開始するのに便利です。 ただし、JenkinsをSSLで保護し、ウェブインターフェースを介して送信されるパスワードと機密データを保護することもお勧めします。

このチュートリアルでは、クライアントリクエストをJenkinsに転送するために、Nginxをリバースプロキシとして設定します。

前提条件

開始するには、次のものが必要です。

[[step-1 -—- configuring-nginx]] ==ステップ1—Nginxの構成

前提条件のチュートリアルHow to Secure Nginx with Let’s Encrypt on Ubuntu 18.04で、/etc/nginx/sites-available/example.comファイルでSSLを使用するようにNginxを構成しました。 このファイルを開いて、リバースプロキシ設定を追加します。

sudo nano /etc/nginx/sites-available/example.com

SSL構成設定のserverブロックに、Jenkins固有のアクセスログとエラーログを追加します。

/etc/nginx/sites-available/example.com

. . .
server {
        . . .
        # SSL Configuration
        #
        listen [::]:443 ssl ipv6only=on; # managed by Certbot
        listen 443 ssl; # managed by Certbot
        access_log            /var/log/nginx/jenkins.access.log;
        error_log             /var/log/nginx/jenkins.error.log;
        . . .
        }

次に、プロキシ設定を構成します。 すべてのリクエストをJenkinsに送信するため、デフォルトのtry_files行をコメントアウトします。そうしないと、リクエストがJenkinsに到達する前に404エラーが返されます。

/etc/nginx/sites-available/example.com

. . .
           location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                # try_files $uri $uri/ =404;        }
. . .

次のプロキシ設定を追加しましょう。

  • proxy_params/etc/nginx/proxy_paramsファイルはNginxによって提供され、ホスト名、クライアント要求のプロトコル、クライアントIPアドレスなどの重要な情報が保持され、ログファイルで利用できるようにします。

  • proxy_pass:これは、プロキシされたサーバーのプロトコルとアドレスを設定します。この場合、ポート8080localhostを介してアクセスされるJenkinsサーバーになります。

  • proxy_read_timeout:これにより、Nginxの60秒のデフォルトからJenkinsが推奨する90秒の値に増やすことができます。

  • proxy_redirect:これにより、responses are correctly rewrittenに適切なホスト名が含まれるようになります。

以下のproxy_redirect行のexample.comをSSLで保護されたドメイン名に置き換えてください。

/etc/nginx/sites-available/example.com

Location /
. . .
           location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                # try_files $uri $uri/ =404;
                include /etc/nginx/proxy_params;
                proxy_pass          http://localhost:8080;
                proxy_read_timeout  90s;
                # Fix potential "It appears that your reverse proxy setup is broken" error.
                proxy_redirect      http://localhost:8080 https://example.com;

これらの変更を行ったら、ファイルを保存してエディターを終了します。 Jenkinsを設定するまでNginxの再起動を保留しますが、今すぐ設定をテストできます。

sudo nginx -t

すべてが正常な場合、コマンドは以下を返します。

Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

そうでない場合は、テストに合格するまで報告されたエラーを修正します。

[。注意]##

Note:
proxy_passの構成を誤った場合(たとえば、末尾にスラッシュを追加するなど)、JenkinsのConfigurationページに次のようなものが表示されます。

Jenkins error: Reverse proxy set up is broken

このエラーが表示された場合は、Nginx構成のproxy_passproxy_redirectの設定を再確認してください。

[[step-2 -—- configuring-jenkins]] ==ステップ2—Jenkinsの構成

JenkinsがNginxと連携するには、Jenkinsサーバーがすべてのインターフェイス(0.0.0.0)ではなく、localhostインターフェイスでのみリッスンするようにJenkins構成を更新する必要があります。 Jenkinsがすべてのインターフェースでリッスンする場合、元の暗号化されていないポート(8080)でアクセスできる可能性があります。

/etc/default/jenkins構成ファイルを変更して、次の調整を行います。

sudo nano /etc/default/jenkins

JENKINS_ARGS行を見つけて、既存の引数に--httpListenAddress=127.0.0.1を追加します。

/etc/default/jenkins

. . .
JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT --httpListenAddress=127.0.0.1"

ファイルを保存して終了します。

新しい構成設定を使用するには、Jenkinsを再起動します。

sudo systemctl restart jenkins

systemctlは出力を表示しないため、ステータスを確認してください。

sudo systemctl status jenkins

Active行にactive (exited)ステータスが表示されます。

Output● jenkins.service - LSB: Start Jenkins at boot time
   Loaded: loaded (/etc/init.d/jenkins; generated)
   Active: active (exited) since Mon 2018-07-09 20:26:25 UTC; 11s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 29766 ExecStop=/etc/init.d/jenkins stop (code=exited, status=0/SUCCESS)
  Process: 29812 ExecStart=/etc/init.d/jenkins start (code=exited, status=0/SUCCESS)

Nginxを再起動します。

sudo systemctl restart nginx

ステータスを確認します。

sudo systemctl status nginx
Output● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-07-09 20:27:23 UTC; 31s ago
     Docs: man:nginx(8)
  Process: 29951 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)
  Process: 29963 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 29952 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 29967 (nginx)

両方のサーバーを再起動すると、HTTPまたはHTTPSを使用してドメインにアクセスできるはずです。 HTTPリクエストは自動的にHTTPSにリダイレクトされ、Jenkinsサイトは安全に提供されます。

[[step-3 -—- testing-the-configuration]] ==ステップ3—構成のテスト

暗号化を有効にしたので、管理パスワードをリセットして構成をテストできます。 まず、HTTP経由でサイトにアクセスして、Jenkinsにアクセスでき、HTTPSにリダイレクトされることを確認します。

Webブラウザーで、http://example.comと入力し、ドメインをexample.comに置き換えます。 ENTERを押すと、URLはhttpsで始まり、ロケーションバーは接続が安全であることを示しているはずです。

How To Install Jenkins on Ubuntu 18.04で作成した管理ユーザー名をUserフィールドに入力し、選択したパスワードをPasswordフィールドに入力できます。

ログインしたら、パスワードを変更して安全であることを確認できます。

画面の右上隅にあるユーザー名をクリックします。 メインプロファイルページで、ページの左側にあるリストからConfigureを選択します。

Navigate to Jenkins password page

これにより新しいページが表示され、新しいパスワードを入力して確認できます。

Jenkins create password page

Saveをクリックして、新しいパスワードを確認します。 Jenkins Webインターフェースを安全に使用できるようになりました。

結論

このチュートリアルでは、NginxをJenkinsの組み込みWebサーバーのリバースプロキシとして設定し、Webインターフェース経由で送信される資格情報やその他の情報を保護しました。 Jenkinsが安全になったので、コードの変更を自動的にテストするためのhow to set up a continuous integration pipelineを学習できます。 Jenkinsを初めて使用する場合に考慮すべきその他のリソースは、the Jenkins project’s “Creating your first Pipeline”チュートリアルまたはthe library of community-contributed pluginsです。

Related