Введение
По умолчанию Jenkins поставляется с собственным веб-сервером, который слушает порт 8080. Это удобно, если вы запускаете частный экземпляр Jenkins или если вам просто нужно быстро что-то запустить и вам не важна безопасность. Однако, после того как у вас будут реальные производственные данные, поступающие на ваш хост, рекомендуется использовать более безопасный веб-сервер, такой как Nginx, обрабатывающий трафик.
Эта статья подробно описывает, как обернуть ваш сайт SSL-сертификатом, используя веб-сервер Nginx в качестве обратного прокси для вашего экземпляра Jenkins. Этот учебник предполагает некоторую знакомство с командами Linux, наличие установленного Jenkins и Ubuntu 20.04.
Вы можете установить Jenkins позже, следуя этому учебнику, если у вас его еще нет.
Предварительные требования
Этот руководство предполагает, что вы используете Ubuntu 20.04. Прежде чем начать, у вас должна быть учетная запись пользователя, отличная от root, с настроенными привилегиями sudo
в вашей системе. Вы можете узнать, как это сделать, следуя руководству Настройка начального сервера Ubuntu 20.04. Вам также потребуется установленный сервер Nginx и размещенный на вашем домене. Вы можете узнать, как это сделать, из руководства Как установить Nginx на Ubuntu 20.04.
Кроме того, важно обеспечить безопасность вашего экземпляра Jenkins с помощью SSL. Если он доступен в Интернете, вы можете обеспечить его безопасность с помощью Let’s Encrypt. Вы можете узнать, как это сделать, из руководства Как обеспечить безопасность Nginx с помощью Let’s Encrypt на Ubuntu 22.04.
Как было сказано ранее, это руководство предполагает, что Jenkins уже установлен. Это руководство покажет вам, как установить Jenkins при необходимости. Вам, вероятно, придется переключиться на пользователя root для этой статьи.
Шаг 1 — Настройка Nginx
За последние годы Nginx стал одним из любимых веб-серверов благодаря своей скорости и гибкости, что делает его идеальным выбором для нашего приложения.
Измените конфигурацию
Затем вам потребуется отредактировать файл конфигурации Nginx по умолчанию. В следующем примере используется nano
.
Вот как может выглядеть окончательная конфигурация; разделы разобраны и кратко объяснены ниже. Вы можете обновить или заменить существующий файл конфигурации, хотя вы можете сначала сделать резервную копию.
Вам нужно будет обновить строки server_name и proxy_redirect
на свое собственное доменное имя. Также происходит некоторая дополнительная магия Nginx, которая указывает на то, что запросы должны быть прочитаны Nginx и переписаны на стороне ответа, чтобы обеспечить работу обратного прокси.
Сохраните и закройте файл. Если вы использовали nano
, можете сделать это, нажав Ctrl + X
, Y
, а затем Enter
.
Первый раздел указывает серверу Nginx прослушивать любые запросы, поступающие на порт 80 (по умолчанию HTTP) и перенаправлять их на HTTPS.
После этого происходит проксирование. Он в основном берет любые входящие запросы и проксирует их к экземпляру Jenkins, который привязан/прослушивает порт 8080 на локальном сетевом интерфейсе.
Примечание: Если вы хотите узнать больше о проксировании в Nginx, этот учебник содержит некоторую полезную информацию о настройках прокси в Nginx.
A few quick things to point out here. If you don’t have a domain name that resolves to your Jenkins server, then the proxy_redirect statement above won’t function correctly without modification, so keep that in mind. Also, if you misconfigure the proxy_pass (by adding a trailing slash for example), you will get something similar to the following in your Jenkins Configuration page.
Итак, если вы видите эту ошибку, дважды проверьте настройки proxy_pass и proxy_redirect в конфигурации Nginx!
Шаг 2 — Настройка Jenkins
Для работы Jenkins с Nginx необходимо обновить конфигурацию Jenkins, чтобы он слушал только локальный адрес (localhost), а не все (0.0.0.0), чтобы гарантировать правильную обработку трафика. Это важный шаг по безопасности, потому что если Jenkins все еще слушает все адреса, то он по-прежнему может быть доступен через его исходный порт (8080). Мы внесем изменения в файл конфигурации /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.
Теперь вы должны иметь возможность посетить ваш домен с использованием HTTPS, и сайт Jenkins будет обслуживаться безопасно.
Дополнительно — Обновление URL-адресов OAuth
Если вы используете плагин аутентификации GitHub или другой плагин OAuth, вероятно, он будет сломан на данный момент. Например, при попытке посетить URL-адрес, вы получите сообщение “Не удалось открыть страницу” с URL-адресом, подобным http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string
.
Для исправления этого вам потребуется обновить несколько настроек в Jenkins, включая настройки вашего плагина OAuth. Сначала обновите URL Jenkins в графическом интерфейсе Jenkins; его можно найти в меню Jenkins -> Управление Jenkins -> Настройка системы -> Местоположение Jenkins.
Обновите URL Jenkins для использования HTTPS – https://jenkins.domain.com/
Затем обновите настройки OAuth с внешнего провайдера. В этом примере используется GitHub. На GitHub это можно найти в разделе Настройки -> Приложения -> Приложения разработчика на сайте GitHub.
Там должна быть запись для Jenkins. Обновите URL домашней страницы и URL обратного вызова авторизации, чтобы отразить настройки HTTPS. Это может выглядеть примерно следующим образом:
Заключение
Осталось только проверить, что всё работает правильно. Как упоминалось ранее, теперь вы должны иметь возможность перейти по вашему новому настроенному URL-адресу – jenkins.domain.com – как через HTTP, так и через HTTPS. Вас должно перенаправить на безопасный сайт, и вы должны увидеть некоторую информацию о сайте, включая ваши недавно обновленные настройки SSL. Как отмечалось ранее, если вы не используете имена хостов через DNS, то ваше перенаправление может не работать так, как задумано. В этом случае вам придется изменить раздел proxy_pass в файле конфигурации Nginx.