###序章

デフォルトでは、Jenkinsにはポート8080でリッスンする独自の組み込みWebサーバーが付属しています。 これは、プライベートJenkinsインスタンスを実行する場合、または何かをすばやく起動する必要があり、セキュリティを気にしない場合に便利です。 ただし、実際の本番データをホストに送信したら、Nginxなどのより安全なWebサーバーを使用することをお勧めします。

この投稿では、NginxWebサーバーをJenkinsインスタンスのリバースプロキシとして使用してサイトをSSLでラップする方法について詳しく説明します。 このチュートリアルは、Linuxコマンド、動作するJenkinsインストール、およびUbuntu14.04インストールにある程度精通していることを前提としています。

Jenkinsをまだインストールしていない場合は、このチュートリアルの後半でインストールできます。

ステップ1—Nginxを構成する

Nginxは、近年、その速度と柔軟性で人気のあるWebサーバーになっているため、これを使用するWebサーバーです。

このセクションのコマンドは、 sudoaccessでユーザーが設定されていることを前提としています。

Nginxをインストールします

パッケージリストを更新し、Nginxをインストールします。

sudo apt-get update
sudo apt-get install nginx

これは重要ではありませんが、今後トラブルシューティングを行う必要がある場合に備えて、Nginxのバージョンを確認することをお勧めします。 Nginxの新しいバージョンは、さらにいくつかの機能を提供します。

nginx -v

証明書を取得する

次に、SSL証明書を購入または作成する必要があります。 これらのコマンドは自己署名証明書用ですが、ブラウザの警告を回避したい場合は、正式に署名された証明書を取得する必要があります。

適切なディレクトリに移動し、証明書を生成します。

cd /etc/nginx
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt

証明書に関する情報を入力するように求められます。 これは好きなように記入できます。 情報は証明書のプロパティに表示されることに注意してください。 ビット数を2048に設定しました。これは、CAによって署名されるために必要な最小数だからです。 証明書に署名する場合は、CSRを作成する必要があります。

構成を編集する

次に、デフォルトのNginx構成ファイルを編集する必要があります。

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

最終的な構成は次のようになります。 セクションは分解され、以下に簡単に説明されています。 最初にクイックコピーを作成することもできますが、既存の構成ファイルを更新または置換できます。

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

server {

    listen 443;
    server_name jenkins.domain.com;

    ssl_certificate           /etc/nginx/cert.crt;
    ssl_certificate_key       /etc/nginx/cert.key;

    ssl on;
    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;

    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;

      # Fix the “It appears that your reverse proxy set up is broken" error.
      proxy_pass          http://localhost:8080;
      proxy_read_timeout  90;

      proxy_redirect      http://localhost:8080 https://jenkins.domain.com;
    }
  }

この構成では、cert.crtおよびcert.key設定は、SSL証明書を作成した場所を反映しています。 server_nameおよびproxy_redirect行を独自のドメイン名で更新する必要があります。 リバースプロキシが機能していることを確認するために、Nginxによって読み取られ、応答側で書き換えられるように要求を指示する、いくつかの追加のNginxマジックも実行されています。

最初のセクションは、ポート80(デフォルトのHTTP)で着信するすべてのリクエストをリッスンし、それらをHTTPSにリダイレクトするようにNginxサーバーに指示します。

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

次に、SSL設定があります。 これはデフォルトの良いセットですが、間違いなく拡張することができます。 詳細については、このチュートリアルをお読みください。

...
  listen 443;
  server_name jenkins.domain.com;

  ssl_certificate           /etc/nginx/cert.crt;
  ssl_certificate_key       /etc/nginx/cert.key;

  ssl on;
  ssl_session_cache  builtin:1000  shared:SSL:10m;
  ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
  ssl_prefer_server_ciphers on;
  ...

最後のセクションは、プロキシが発生する場所です。 基本的に、着信要求を受け取り、ローカルネットワークインターフェイスのポート8080にバインド/リッスンしているJenkinsインスタンスにプロキシします。 これは少し異なる状況ですが、このチュートリアルには、Nginxプロキシ設定に関するいくつかの良い情報があります。

...
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;

    # Fix the “It appears that your reverse proxy set up is broken" error.
    proxy_pass          http://localhost:8080;
    proxy_read_timeout  90;

    proxy_redirect      http://localhost:8080 https://jenkins.domain.com;
}
...

ここで指摘するいくつかの簡単なこと。 Jenkinsサーバーに解決されるドメイン名がない場合、上記の proxy_redirect ステートメントは変更しないと正しく機能しないため、この点に注意してください。 また、 proxy_pass の構成を誤った場合(たとえば、末尾にスラッシュを追加するなど)、Jenkinsの構成ページに次のようなものが表示されます。

Jenkins error: Reverse proxy set up is broken

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

##ステップ2—Jenkinsを構成する

前に述べたように、このチュートリアルはJenkinsがすでにインストールされていることを前提としています。 このチュートリアルでは、必要に応じてJenkinsをインストールする方法を説明します。 その記事では、おそらくrootユーザーに切り替える必要があります。

JenkinsがNginxと連携するには、トラフィックが適切に処理されるように、すべて(0.0.0.0)ではなくローカルホストインターフェイスでのみリッスンするようにJenkins構成を更新する必要があります。 Jenkinsがまだすべてのインターフェイスでリッスンしている場合は、元のポート(8080)を介してアクセスできる可能性があるため、これは重要なステップです。 / etc / default / jenkins 構成ファイルを変更して、これらの調整を行います。

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を再起動します。

sudo service jenkins restart
sudo service nginx restart

これで、HTTPまたはHTTPSのいずれかを使用してドメインにアクセスできるようになり、Jenkinsサイトが安全に提供されます。 自己署名証明書を使用した場合は、証明書の警告が表示されます。

オプション—OAuthURLを更新します

認証にGitHubまたは別のOAuthプラグインを使用している場合は、この時点で壊れている可能性があります。 たとえば、URLにアクセスしようとすると、次のようなURLの「ページを開くことができませんでした」というメッセージが表示されます。

http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string

これを修正するには、OAuthプラグイン設定を含むいくつかの設定を更新する必要があります。 まず、JenkinsのURLを更新します(Jenkins GUI内)。 それはここで見つけることができます:

Jenkins->Jenkinsの管理->システムの構成->Jenkinsの場所

HTTPSを使用するようにJenkinsURLを更新します-https://jenkins.domain.com/

Jenkins URL

次に、外部プロバイダーでOAuth設定を更新します。 この例はGitHub用です。 GitHubでは、これはGitHubサイトの[設定]->[アプリケーション]->[開発者向けアプリケーション]にあります。

Jenkinsのエントリがあるはずです。 HTTPS設定を反映するようにホームページURL認証コールバックURLを更新します。 次のようになります。

Jenkins settings on GitHub; https:// has been used with both URLs

結論

あとは、すべてが正しく機能したことを確認するだけです。 上記のように、HTTPまたはHTTPSを介して、新しく構成されたURL( jenkins.domain.com )を参照できるようになります。 安全なサイトにリダイレクトされ、新しく更新されたSSL設定を含むいくつかのサイト情報が表示されます。 前述のように、DNS経由でホスト名を使用していない場合、リダイレクトが期待どおりに機能しない可能性があります。 その場合、Nginx設定ファイルのproxy_passセクションを変更する必要があります。

ブラウザを使用して証明書を調べることもできます。 ロックをクリックして、ブラウザ内から証明書のプロパティを確認できるはずです。