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

前書き

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

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

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

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

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

このセクションのコマンドは、ユーザーがhttps://www.digitalocean.com/community/tutorials/how-to-add-and-delete-users-on-an-ubuntu-14-04-でセットアップされていることを前提としていますvps [sudoアクセス]。

Nginxをインストールする

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

sudo apt-get update
sudo apt-get install nginx

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

nginx -v

証明書を取得する

次に、SSL証明書を購入または作成する必要があります。 これらのコマンドは自己署名証明書用ですが、公式にhttps://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs [ブラウザの警告を回避したい場合。

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

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 ;

   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://;
   }
 }

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

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

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

次に、SSL設定があります。 これはデフォルトの良いセットですが、間違いなく拡張できます。 詳細については、https://www.digitalocean.com/community/tutorials/how-to-create-an-ssl-certificate-on-nginx-for-ubuntu-14-04 [このチュートリアル]をお読みください。

...
 listen 443;
 server_name ;

 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インスタンスにプロキシします。 これはわずかに異なる状況ですが、https://www.digitalocean.com/community/tutorials/how-to-configure-nginx-as-a-front-end-proxy-for-apache [このチュートリアル]にはいくつかの良いことがあります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サーバーに解決されるドメイン名がない場合、上記のステートメントは変更しないと正しく機能しません。そのことに注意してください。 また、(たとえば、末尾のスラッシュを追加することにより)構成を誤った場合、Jenkinsの構成ページに次のようなものが表示されます。

image:https://assets.digitalocean.com/articles/nginx_jenkins/1.jpg [Jenkinsエラー:リバースプロキシの設定が壊れています]

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

ステップ2-Jenkinsの構成

前述のように、このチュートリアルでは、Jenkinsが既にインストールされていることを前提としています。 https://www.digitalocean.com/community/tutorials/how-to-install-and-use-jenkins-on-ubuntu-12-04 [このチュートリアル]は、必要に応じてJenkinsをインストールする方法を示します。 おそらく、その記事のルートユーザーに切り替える必要があります。

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

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サイトが安全に提供されます。 自己署名証明書を使用した場合は、証明書の警告が表示されます。

オプション-OAuth URLを更新する

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

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

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

  • Jenkins→ Jenkinsの管理→システムの設定→ Jenkinsの場所*

HTTPSを使用するようにJenkins URLを更新する-+ https:// +

image:https://assets.digitalocean.com/articles/nginx_jenkins/2.jpg [Jenkins URL]

次に、外部プロバイダーでOAuth設定を更新します。 この例はGitHub用です。 GitHubでは、これはGitHubサイトの* Settings→ Applications→ Developer applications *にあります。

Jenkinsのエントリがあるはずです。 HTTPSの設定を反映するために、* Homepage URL および AuthorizationコールバックURL *を更新します。 次のようになります。

image:https://assets.digitalocean.com/articles/nginx_jenkins/3.jpg [GitHubのJenkins設定; https://は両方のURLで使用されています]

結論

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

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

Related