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セクションを変更する必要があります。
ブラウザを使用して証明書を調べることもできます。 ロックをクリックして、ブラウザ内から証明書のプロパティを確認できるはずです。