По умолчанию Jenkins поставляется с нативным встроенным веб-сервером Winstone, который прослушивает порт 8080. Для начала это вполне рабочий вариант.
Однако если вы хотите постоянно использовать Jenkins в производстве, вам потребуется настроить поддержку SSL, чтобы защитить передаваемые пароли и другие конфиденциальные данные.
Этот мануал поможет настроить Nginx как обратный прокси-сервер Jenkins и включить шифрование SSL.
Требования
- Сервер Ubuntu 20.04, настроенный по этому мануалу.
- Предварительно установленный сервер Jenkins (инструкции здесь).
- Веб-сервер Nginx (инструкции по установке можно найти здесь).
- Сертификат Let’s Encrypt (ознакомьтесь с мануалом Создание сертификата Let’s Encrypt для Nginx в Ubuntu 20.04). Обратите внимание: для этого обязательно нужен домен! Здесь мы используем условный домен example.com.
1: Настройка Nginx
Согласно мануалу Создание сертификата Let’s Encrypt для Nginx в Ubuntu 20.04, настройки веб-сервера Nginx для поддержки SSL были помещены в файл /etc/nginx/sites-available/example.com. Откройте его:
sudo nano /etc/nginx/sites-available/example.com
Добавьте в блок server логи доступа и ошибок для Jenkins:
. . .
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).
. . .
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-адрес клиента (файл /etc/nginx/proxy_params предоставляется веб-сервером Nginx).
- Параметр proxy_pass устанавливает протокол и адрес прокси-сервера (в данном случае это сервер Jenkins, доступный на localhost на порту 8080).
- Увеличьте значение proxy_read_timeout с 60 до 90 (так рекомендует документация Jenkins).
- Добавьте proxy_redirect, чтобы ответы правильно переписывались и содержали правильное имя хоста.
Примечание: В поле proxy_redirect укажите свой домен, защищенный сертификатом SSL.
. . .
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
Если ошибок нет, команда вернет:
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
В таком случае убедитесь, что параметры 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; 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
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 будут защищены.
3: Тестирование настройки
Чтобы проверить настройку, сбросьте пароль администратора. Для начала попробуйте получить доступ к сайту по http и убедитесь, что Jenkins автоматически перенаправляет запросы на https.
Для этого в адресную строку браузера введите:
http://example.com
Нажмите ввод. В адресе вместо http должен появиться протокол https. Если это так, сервер поддерживает шифрование и автоматическое перенаправление на безопасный протокол.
В поле User введите admin. В поле Password укажите пароль, который вы выбрали во время установки.
После этого нужно изменить пароль администратора. Нажмите на имя пользователя в правом верхнем углу. Вы попадете на главную страницу профиля, где вам нужно найти выпадающее меню (в верхнем левом углу) и выбрать Configure. Вы попадете на новую страницу. Введите и подтвердите новый пароль. Нажмите Save.
Заключение
Теперь данные Jenkins шифруются, а Nginx работает как обратный прокси-сервер. Защитив свою установку шифрованием, вы можете настроить конвейер непрерывной интеграции, чтобы автоматически тестировать изменения кода.
Читайте также: Настройка непрерывной интеграции в Jenkins в Ubuntu 16.04
Рекомендуем также ознакомиться с мануалом Creating your first Pipeline и с поддерживаемой сообществом библиотекой плагинов.