Nginxリバースプロキシを使用してSSLでJenkinsを構成する方法
序章
デフォルトでは、Jenkinsにはポート8080でリッスンする独自の組み込みWinstoneWebサーバーが付属しています。これは開始に便利です。 ただし、Jenkinsの使用に真剣に取り組むとすぐに、Webインターフェイスを介して送信されるパスワードやその他の機密データを保護するためにSSLで保護する必要があります。
このチュートリアルでは、クライアントリクエストをJenkinsに転送するためのリバースプロキシとしてNginxを構成する方法を示します。 開始するには、以下の各前提条件を完了する必要があります。
前提条件
非ルートsudo
ユーザーとファイアウォールで構成された1つのUbuntu16.04サーバー。次のガイド:
- Ubuntu16.04にJenkinsをインストールする方法
- Ubuntu16.04にNginxをインストールする方法
- Ubuntu16.04でLet'sEncryptを使用してNginxを保護する方法。 このチュートリアルには、自分が所有または管理している登録済みドメイン名が必要であることに注意してください。
これらの要件を完了すると、開始する準備が整います。
ステップ1—Nginxの構成
前提条件のチュートリアルUbuntu16.04でLet'sEncryptを使用してNginxを保護する方法では、/etc/nginx/sites-available/default
ファイルでSSLを使用するようにNginxを構成したため、そのファイルを開いてリバースプロキシを追加します設定。
sudo nano /etc/nginx/sites-available/default
まず、SSL構成設定を使用してserver
ブロックに特定のアクセスログとエラーログを追加します。
/ etc / nginx / sites-available / default
. . . server { # SSL Configuration # # listen 443 ssl default_server; # listen [::]:443 ssl default_server; 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 / default
. . . location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. # try_files $uri $uri/ =404; } . . .
次に、実際のプロキシ設定を追加します。 構成は、ホスト名、クライアント要求のプロトコル、クライアントIPアドレスなどの情報がログファイルで利用できるようにするNginx提供のproxy_params
を含めることから始まります。 次に、proxy_pass
は、プロキシされたサーバー(この場合はポート8080のローカルホストでアクセスされるJenkinsサーバー)のプロトコルとアドレスを設定します。 次に、proxy_read_timeout
をNginxのデフォルトの60秒からプロジェクトの推奨値である90秒に増やします。 最後に、proxy_redirect
を追加して、応答が適切に書き換えられ、適切なホスト名が含まれるようにします。
以下のproxy_redirect
行でSSLで保護されたドメイン名に置き換えてください。
/ etc / nginx / sites-available / default
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 set up is broken" error. proxy_redirect http://localhost:8080 https://your.ssl.domain.name;
これらの変更を行ったら、ファイルを保存して終了します。 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
そうでない場合は、テストに合格するまで報告されたエラーを修正してください。
注: proxy_pass
の構成を誤った場合(たとえば、末尾にスラッシュを追加するなど)、Jenkinsの構成ページに次のようなものが表示されます。
このエラーが表示された場合は、Nginx構成のproxy_pass
とproxy_redirect
の設定を再確認してください。
ステップ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とNginxを再起動します。
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; bad; vendor preset: enabled) Active: active (exited) since Tue 2017-04-25 22:37:29 UTC; 5s ago Docs: man:systemd-sysv-generator(8) Process: 11360 ExecStop=/etc/init.d/jenkins stop (code=exited, status=0/SUCCESS) Process: 11391 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 Tue 2017-04-25 22:36:08 UTC; 2min 51s ago Process: 11339 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code= Process: 11349 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Process: 11345 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUC Main PID: 11353 (nginx)
両方のサーバーを再起動したので、HTTPまたはHTTPSのいずれかを使用してドメインにアクセスできるはずです。 HTTPリクエストは自動的にHTTPSにリダイレクトされ、Jenkinsサイトは安全に提供されます。
ステップ3—構成のテスト
暗号化を有効にしたので、管理者パスワードをリセットして構成をテストします。 まず、http
経由でサイトにアクセスして、Jenkinsに到達し、期待どおりにhttps
にリダイレクトされることを確認します。
ウェブブラウザで「http:// your.ssl.domain.name 」と入力し、ドメインをyour.ssl.domain.name
に置き換えます。 Enterキーを押すと、URLはhttps
で始まり、ロケーションバーに接続が安全であることが示されます。
「ユーザー」フィールドにadmin
と入力し、Jenkinsがインストール時に作成して保存した自動生成パスワードを入力します。
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
管理者ユーザーのパスワードをリセットした場合は、代わりにそのパスワードを入力してください。 いずれにせよ、ログインしたら、安全を確保するためにパスワードを変更します。
右上の「admin」をクリックし、ドロップダウンメニューから「Configure」を選択します。 新しいパスワードを入力して確認し、「保存」をクリックします。 これで、JenkinsWebインターフェイスを安全に使用できます。
結論
このチュートリアルでは、前提条件を完了した後、Webインターフェイスを介して送信される資格情報やその他の情報を保護するために、NginxをJenkinsの組み込みWebサーバーへのリバースプロキシとして構成しました。 Jenkinsが安全になったので、継続的インテグレーションパイプラインをセットアップして、コードの変更を自動的にテストする方法を学ぶことができます。 Jenkinsを初めて使用する場合に考慮すべきその他のリソースは、 Jenkinsプロジェクトの「はじめに:最初のパイプラインチュートリアルを作成する」またはコミュニティ提供プラグインのライブラリです。