Настройка Jenkins для поддержки SSL с помощью обратного прокси-сервера Nginx
Ubuntu | Комментировать запись
По умолчанию Jenkins поставляется с собственным встроенным веб-сервером Winstone, который прослушивает порт 8080.
Если вы хотите постоянно использовать Jenkins в производстве, вам потребуется настроить поддержку SSL, чтобы защитить передаваемые пароли и другие конфиденциальные данные.
Данное руководство поможет настроить Nginx как обратный прокси-сервер Jenkins и настроить шифрование SSL.
Требования
- Сервер Ubuntu 16.04 (начальная настройка сервера описана здесь).
- Пользователь с доступом к sudo.
- Предварительно установленный сервер Jenkins (читайте это руководство).
- Веб-сервер Nginx (инструкции можно найти здесь).
- Сертификат Let’s Encrypt (ознакомьтесь с руководством Создание сертификата Let’s Encrypt для Nginx в Ubuntu 16.04). Обратите внимание: для этого обязательно нужен домен!
1: Настройка Nginx
В руководстве Создание сертификата Let’s Encrypt для Nginx в Ubuntu 16.04 настройки веб-сервера Nginx для поддержки SSL были помещены в файл /etc/nginx/sites-available/default. Откройте его:
sudo nano /etc/nginx/sites-available/default
Добавьте в блок server логи доступа и ошибок:
. . .
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; }
. . .
Теперь добавьте настройки проксирования.
Для начала добавьте параметры proxy_params, которые сохраняют в логах важные данные (имя хоста, протокол клиентского запроса и IP-адрес клиента). Параметр proxy_pass устанавливает протокол и адрес прокси-сервера (в данном случае это сервер Jenkins, доступный на localhost на порту 8080). Увеличьте значение proxy_read_timeout с 60 до 90. Добавьте proxy_redirect, чтобы ответы правильно переписывались и содержали правильное имя хоста.
Примечание: В поле proxy_redirect укажите свой домен, защищенный сертификатом SSL.
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 (например, поставили лишний слеш), на странице настройки Jenkins появится такое сообщение:
It appears that your reverse proxy set up is broken
More info Dismiss
В таком случае убедитесь, что параметры proxy_pass и proxy_redirect в настройках Nginx указаны правильно.
2: Настройка Jenkins
Чтобы сервер Jenkins мог взаимодействовать с Nginx, обновите его настройки. Сервер Jenkins должен прослушивать интерфейс localhost, а не все интерфейсы (0.0.0.0). Если Jenkins будет прослушивать все интерфейсы, он будет доступен по стандартному нешифрованному порту 8080.
Внесите поправки в настройки:
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.
sudo systemctl restart jenkins
Команда systemctl не выводит результат некоторых команд. Запросите состояние Jenkins.
sudo systemctl status jenkins
В строке Active должно быть уазано состояние active (exited).
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 будут защищены.
3: Тестирование настройки
Чтобы проверить настройку, попробуйте сбросить пароль администратора. Для начала попробуйте получить доступ к сайту по http и убедитесь, что Jenkins автоматически перенаправляет запросы на https.
В адресную строку браузера введите:
http://your.ssl.domain.name
Примечание: Вместо your.ssl.domain.name укажите свой домен.
Нажмите ввод. В адресе вместо http должен быть указан протокол https. Если это так, сервер поддерживает шифрование.
В поле User введите admin. В поле Password укажите пароль, автоматически сгенерированный инструментом Jenkins во время установки. Пароль можно получить с помощью команды:
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
Примечание: Если вы изменили пароль администратора, введите новый пароль.
После этого нужно изменить пароль администратора. Для этого кликните admin в правом верхнем углу и выберите Configure в выпадающем меню. Введите и подтвердите новый пароль. Нажмите Save.
Заключение
Теперь конфиденциальные данные Jenkins шифруются, а Nginx работает как обратный прокси-сервер.
Больше информации о Jenkins можно найти на сайте или в блоге проекта.
Tags: Jenkins, Let's Encrypt, NGINX, SSL, Ubuntu 16.04