Вступление
По умолчанию Jenkins поставляется со своим собственным встроенным веб-сервером Winstone, прослушивающим порт 8080, что удобно для начала работы. Однако, если вы серьезно относитесь к использованию Jenkins, он должен быть защищен с помощью SSL для защиты паролей и других конфиденциальных данных, передаваемых через веб-интерфейс.
В этом руководстве мы покажем, как настроить Nginx в качестве обратного прокси-сервера для направления клиентских запросов в Jenkins. Чтобы начать, вам нужно выполнить все необходимые условия ниже.
Предпосылки
One Ubuntu 16.04 server настроен с пользователемsudo
без полномочий root и брандмауэром, следуя инструкциямUbuntu 16.04 initial server setup guide с установленными и настроенными Jenkins и Nginx, используя следующие руководства:
-
How to Secure Nginx with Let’s Encrypt on Ubuntu 16.04. Обратите внимание, что это руководство требует зарегистрированного доменного имени, которым вы владеете или управляете.
Когда вы выполните эти требования, вы готовы начать.
[[step-one -—- configuring-nginx]] == Шаг первый - Настройка Nginx
В предварительном руководстве,How to Secure Nginx with Let’s Encrypt on Ubuntu 16.04, мы настроили Nginx для использования SSL в файле/etc/nginx/sites-available/default
, поэтому мы откроем этот файл, чтобы добавить настройки обратного прокси.
sudo nano /etc/nginx/sites-available/default
Во-первых, мы добавим специальные журналы доступа и ошибок в блокserver
с настройками конфигурации SSL:
/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
, которая, как написано, вернет ошибку 404 до того, как запрос достигнет Jenkins.
/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; }
. . .
Затем мы добавим фактические настройки прокси. Конфигурация начинается с включения предоставленных Nginxproxy_params
, которые гарантируют, что такая информация, как имя хоста, протокол клиентского запроса и IP-адрес клиента, будет доступна в наших файлах журнала. Затемproxy_pass
устанавливает протокол и адрес прокси-сервера, которым в нашем случае является сервер Jenkins, доступ к которому осуществляется на локальном хосте через порт 8080. Затем мы увеличиваемproxy_read_timeout
с 60-секундного значения по умолчанию для Nginx до рекомендованного для проекта 90-секундного значения. И, наконец, мы добавляемproxy_redirect
, чтобы гарантировать, чтоresponses are properly rewritten включает правильное имя хоста.
Обязательно укажите свое защищенное SSL доменное имя в строкеproxy_redirect
ниже:
/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;
После внесения этих изменений сохраните и выйдите из файла. Мы не собираемся перезапускать 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
(например, добавив косую черту в конце), вы получите что-то похожее на следующее на странице конфигурации Jenkins.
Если вы видите эту ошибку, дважды проверьте настройкиproxy_pass
иproxy_redirect
в конфигурации Nginx.
[[step-two -—- configuring-jenkins]] == Шаг второй - Настройка 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 и Nginx.
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; 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 будет обслуживаться безопасно.
[[step-three -—- testing-the-configuration]] == Шаг третий - Проверка конфигурации
Мы протестируем конфигурацию, сбросив административный пароль сейчас, когда мы включили шифрование. Мы начнем с посещения сайта черезhttp
, чтобы убедиться, что мы достигли Jenkins и были перенаправлены наhttps
, как мы и ожидали:
В веб-браузере введите «http: //your.ssl.domain.name», заменив свой домен наyour.ssl.domain.name
. После нажатия клавиши ВВОД URL-адрес должен начинаться сhttps
, а в строке адреса должно быть указано, что соединение является безопасным.
Мы введемadmin
в поле «Пользователь» и автоматически сгенерированный пароль, который Дженкинс создал и сохранил при его установке.
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
Если вы сбросили пароль администратора, введите этот пароль. В любом случае, как только мы войдем в систему, мы изменим пароль, чтобы убедиться в его безопасности.
Нажмите «admin» в правом верхнем углу и выберите «Configure» из выпадающего меню. Введите и подтвердите новый пароль и нажмите «Сохранить». Теперь вы можете безопасно использовать веб-интерфейс Jenkins.
Заключение
В этом руководстве после выполнения предварительных условий мы настроили Nginx в качестве обратного прокси-сервера для встроенного веб-сервера Jenkins, чтобы защитить свои учетные данные и другую информацию, передаваемую через веб-интерфейс. Теперь, когда Jenkins в безопасности, вы можете изучитьhow to set up a continuous integration pipeline для автоматического тестирования изменений кода. Другие ресурсы, которые следует учитывать, если вы новичок в Jenkins, - это учебникthe Jenkins project’s “Getting Started: Create your first Pipeline илиthe library of community-contributed plugins.