По умолчанию, Jenkins приходит со своим собственным встроенным веб-сервером Winstone, который прослушивает порт 8080, что удобно для начала работы. Как только вы серьезно возьметесь за использовании Jenkins, необходимо обеспечить его с помощью SSL для защиты паролей и других конфиденциальных данных, передаваемых через веб-интерфейс.
В этой статье мы покажем, как настроить Nginx в качестве обратного прокси-сервера, чтобы направлять запросы клиентов Jenkins. Для того, чтобы начать, вам необходимо выполнить каждое условие из указанных ниже.
Один сервер Ubuntu 16,04 сконфигурированный с внекорневым sudo
пользователем и брандмауэром, следуя как в статье руководство по первоначальной настройки сервера на Ubuntu 16.04 с установленными Jenkins и Nginx.
Когда вы выполнили эти требования, вы готовы начать.
В предварительных требованиях статьи как обеспечить Nginx с Encrypt Давай на Ubuntu 16.04, мы настроили Nginx использовать SSL в файле /etc/nginx/sites-available/default
, так что мы будем откроем этот файл, чтобы добавить наши настройки обратного прокси — сервера.
sudo nano /etc/nginx/sites-available/default
Во- первых, мы добавим конкретный доступ и журналы ошибок в блок server
с параметрами конфигурации SSL:
. . . 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.
. . . location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. # try_files $uri $uri/ =404; } . . .
Затем мы добавим фактические параметры прокси — сервера. Конфигурация начинается в Nginx с установкой proxy_params
которые обеспечивают такую информацию, как имя хост, протокол запроса клиента, а также IP — адрес клиента, которые будут доступны в нашем логе — файле. Далее, proxy_pass
устанавливает протокол и адрес проксируемого сервера, который в нашем случае является сервером Jenkins, который доступен на локальный хост по порту 8080. Затем мы увеличиваем proxy_read_timeout
с 60 по умолчанию в Nginx до рекомендуемого значения 90. И, наконец, мы добавим proxy_redirect
чтобы гарантировать включение соответствующего имени хоста.
Обязательно замените свое SSL-защищенное имя домена в proxy_redirect
, как в строке ниже:
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
Если все хорошо, то команда возвращает:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Если нет, то исправить все обнаруженные ошибки, пока тест не будет пройден.
Примечание:
Если вы неправильно установите proxy_pass
(например, добавите слэш), вы получите что — то похожее на следующее на странице Configuration Jenkins.
Если вы видите эту ошибку, проверьте настройки proxy_pass
и proxy_redirect
в конфигурации Nginx.
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
к существующим аргументам:
. . . 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
:
● 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
● 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 будет обслуживаться надежно.
Мы будем тестировать конфигурацию путем сброса пароля администратора, когда мы включили шифрование. Мы начнем с посещения сайта с помощью http
чтобы убедиться, что мы заходим в Jenkins и перенаправляемся на https,
как мы ожидали:
В вашем веб — браузере, введите «HTTP: // your.ssl.domain.name », подставляя свой домен вместо your.ssl.domain.name
. После нажатия клавиши ввода, URL должен начинаться с https
и зеленый замок укажет, что соединение является безопасным.
Мы войдем admin
в поле «User» и автоматически сгенерируем пароль, Jenkins создаст и хранит, когда мы его установили.
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
Если вы хотите сбросить пароль пользователя с правами администратора, введите этот пароль вместо этого. В любом случае, как только мы войдем, мы изменим пароль, чтобы убедиться, что это безопасно.
Нажмите кнопку «admin» в верхнем правом углу и выберите «Настройка» из выпадающего меню. Введите и подтвердите новый пароль и нажмите кнопку «Сохранить». Теперь вы можете использовать веб-интерфейс Jenkins надежно.
В этом учебном пособии, после выполнения предварительных установок, мы настроили Nginx в качестве обратного прокси — сервера для встроенного веб — сервера Jenkins для того, чтобы защитить нашу информацию, передаваемую через веб — интерфейс. Если вы новичок в Jenkins, вы можете начать с учебника «Начало работы проекта с Jenkins: Создайте свой первый Pipeline.