JenkinsのリバースプロキシとしてSSLを使用してNginxを構成する方法
###序章
デフォルトでは、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の構成ページに次のようなものが表示されます。
したがって、このエラーが表示された場合は、Nginx構成のproxy_passとproxy_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/
次に、外部プロバイダーでOAuth設定を更新します。 この例はGitHub用です。 GitHubでは、これはGitHubサイトの[設定]->[アプリケーション]->[開発者アプリケーション]にあります。
Jenkinsのエントリがあるはずです。 HTTPS設定を反映するようにホームページURLと認証コールバックURLを更新します。 次のようになります。
結論
あとは、すべてが正しく機能したことを確認するだけです。 上記のように、これで、HTTPまたはHTTPSを介して、新しく構成されたURL( jenkins.domain.com )を参照できるようになります。 安全なサイトにリダイレクトされ、新しく更新されたSSL設定を含むいくつかのサイト情報が表示されます。 前述のように、DNS経由でホスト名を使用していない場合、リダイレクトが期待どおりに機能しない可能性があります。 その場合、Nginx設定ファイルのproxy_passセクションを変更する必要があります。
また、ブラウザを使用して証明書を調べることもできます。 ロックをクリックして、ブラウザ内から証明書のプロパティを確認できるはずです。