Вступление
По умолчаниюJenkins поставляется со своим собственным встроенным веб-сервером Winstone, который прослушивает порт8080
, что удобно для начала работы. Однако также неплохо бы защитить Jenkins с помощью SSL для защиты паролей и конфиденциальных данных, передаваемых через веб-интерфейс.
В этом руководстве вы настроите Nginx в качестве обратного прокси-сервера для направления клиентских запросов в Jenkins.
Предпосылки
Для начала вам понадобится следующее:
-
Один сервер Ubuntu 18.04, настроенный с пользователем sudo без полномочий root и брандмауэром, послеUbuntu 18.04 initial server setup guide.
-
Jenkins установлен, следуя инструкциям вHow to Install Jenkins on Ubuntu 18.04
-
Nginx установлен, следуя инструкциям вHow to Install Nginx on Ubuntu 18.04
-
Сертификат SSL для домена, предоставленныйLet’s Encrypt. СледуйтеHow to Secure Nginx with Let’s Encrypt on Ubuntu 18.04, чтобы получить этот сертификат. Обратите внимание, что вам понадобитсяregistered domain name, которым вы владеете или контролируете. В этом руководстве будет использоваться доменное имяexample.com.
[[step-1 -—- configuring-nginx]] == Шаг 1. Настройка Nginx
В предварительном руководствеHow to Secure Nginx with Let’s Encrypt on Ubuntu 18.04 вы настроили Nginx для использования SSL в файле/etc/nginx/sites-available/example.com
. Откройте этот файл, чтобы добавить настройки обратного прокси:
sudo nano /etc/nginx/sites-available/example.com
В блокеserver
с настройками конфигурации SSL добавьте специальные журналы доступа и ошибок Jenkins:
/etc/nginx/sites-available/example.com
. . .
server {
. . .
# SSL Configuration
#
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
access_log /var/log/nginx/jenkins.access.log;
error_log /var/log/nginx/jenkins.error.log;
. . .
}
Далее давайте настроим параметры прокси. Поскольку мы отправляем все запросы в Jenkins, мы закомментируем строку по умолчаниюtry_files
, которая в противном случае вернула бы ошибку 404 до того, как запрос достигнет Jenkins:
/etc/nginx/sites-available/example.com
. . .
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# try_files $uri $uri/ =404; }
. . .
Давайте теперь добавим настройки прокси, которые включают в себя:
-
proxy_params
: файл/etc/nginx/proxy_params
предоставляется Nginx и гарантирует, что важная информация, включая имя хоста, протокол клиентского запроса и IP-адрес клиента, сохраняется и доступна в файлах журнала. -
proxy_pass
: устанавливает протокол и адрес прокси-сервера, которым в данном случае будет сервер Jenkins, доступ к которому осуществляется черезlocalhost
на порту8080
. -
proxy_read_timeout
: это позволяет увеличить значение Nginx по умолчанию в 60 секунд до рекомендованного Jenkins значения в 90 секунд. -
proxy_redirect
: это гарантирует, чтоresponses are correctly rewritten будет включать правильное имя хоста.
Обязательно замените свое защищенное SSL доменное имя наexample.com
в строкеproxy_redirect
ниже:
/etc/nginx/sites-available/example.com
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 setup is broken" error.
proxy_redirect http://localhost:8080 https://example.com;
После внесения этих изменений сохраните файл и выйдите из редактора. Мы не будем перезапускать Nginx до тех пор, пока не настроим Jenkins, но теперь мы можем протестировать нашу конфигурацию:
sudo nginx -t
Если все хорошо, команда вернет:
Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Если нет, исправьте все обнаруженные ошибки, пока тест не пройдет.
[.Примечание]##
Note:
Если вы неправильно сконфигурируетеproxy_pass
(например, добавив косую черту в конце), вы получите что-то похожее на следующее на странице JenkinsConfiguration.
Если вы видите эту ошибку, дважды проверьте настройкиproxy_pass
иproxy_redirect
в конфигурации Nginx.
[[step-2 -—- configuring-jenkins]] == Шаг 2. Настройка Jenkins
Чтобы Jenkins мог работать с Nginx, вам необходимо обновить конфигурацию Jenkins, чтобы сервер Jenkins прослушивал только интерфейсlocalhost
, а не все интерфейсы (0.0.0.0
). Если 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:
sudo systemctl restart jenkins
Посколькуsystemctl
не отображает вывод, проверьте статус:
sudo systemctl status jenkins
Вы должны увидеть статусactive (exited)
в строкеActive
:
Output● jenkins.service - LSB: Start Jenkins at boot time
Loaded: loaded (/etc/init.d/jenkins; generated)
Active: active (exited) since Mon 2018-07-09 20:26:25 UTC; 11s ago
Docs: man:systemd-sysv-generator(8)
Process: 29766 ExecStop=/etc/init.d/jenkins stop (code=exited, status=0/SUCCESS)
Process: 29812 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 Mon 2018-07-09 20:27:23 UTC; 31s ago
Docs: man:nginx(8)
Process: 29951 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)
Process: 29963 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Process: 29952 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Main PID: 29967 (nginx)
После перезапуска обоих серверов вы сможете посещать домен по протоколу HTTP или HTTPS. HTTP-запросы будут автоматически перенаправляться на HTTPS, а сайт Jenkins будет обслуживаться безопасно.
[[step-3 -—- testing-the-configuration]] == Шаг 3 - Проверка конфигурации
Теперь, когда вы включили шифрование, вы можете проверить конфигурацию, сбросив пароль администратора. Давайте начнем с посещения сайта через HTTP, чтобы убедиться, что вы можете связаться с Jenkins и перенаправлены на HTTPS.
В браузере введитеhttp://example.com
, заменив свой домен наexample.com
. После того, как вы нажметеENTER
, URL-адрес должен начинаться сhttps
, а в строке местоположения должно быть указано, что соединение является безопасным.
Вы можете ввести имя администратора, созданное вами вHow To Install Jenkins on Ubuntu 18.04, в полеUser, и пароль, который вы выбрали, в полеPassword.
После входа в систему вы можете изменить пароль, чтобы убедиться в его безопасности.
Нажмите на свое имя пользователя в верхнем правом углу экрана. На главной странице профиля выберитеConfigure из списка в левой части страницы:
Это приведет вас на новую страницу, где вы можете ввести и подтвердить новый пароль:
Подтвердите новый пароль, нажавSave. Теперь вы можете безопасно использовать веб-интерфейс Jenkins.
Заключение
В этом руководстве вы настроили Nginx в качестве обратного прокси-сервера для встроенного веб-сервера Jenkins, чтобы защитить свои учетные данные и другую информацию, передаваемую через веб-интерфейс. Теперь, когда Jenkins в безопасности, вы можете изучитьhow to set up a continuous integration pipeline для автоматического тестирования изменений кода. Другие ресурсы, которые следует учитывать, если вы новичок в Jenkins, - это учебникthe Jenkins project’s “Creating your first Pipeline” илиthe library of community-contributed plugins.