Nginx как обратный прокси-сервер с поддержкой SSL для Jenkins

По умолчанию Jenkins поставляется со встроенным веб-сервером, который прослушивает порт 8080. Его удобно использовать для запуска приватного экземпляра Jenkins или для быстрого тестирования приложения. Но в среде производства лучше использовать более безопасный и надежный веб-сервер типа Nginx.

Этот мануал поможет добавить на сайт Jenkins поддержку SSL с помощью обратного прокси-сервера Nginx.

Примечание: Для этого нужно знать базовые команды Linux и иметь рабочий экземпляр Jenkins и сервер Ubuntu 14.04, настроенный по этому мануалу.

1: Настройка Nginx

Установка Nginx

Обновите индекс пакетов и установите Nginx:

sudo apt-get update
sudo apt-get install nginx

После этого можно проверить версию Nginx и убедиться, что установка прошла успешно.

nginx -v

Получение сертификата

Читайте также: Основы OpenSSL: SSL-сертификаты, закрытые ключи и запросы на подпись

Теперь нужно получить SSL-сертификат. В этом разделе вы узнаете, как создать самоподписанный сертификат.

Примечание: Чтобы создать доверенный сертификат, читайте статью Создание сертификата Let’s Encrypt для Nginx в Ubuntu 14.04.

Перейдите в соответствующий каталог и сгенерируйте сертификат.

cd /etc/nginx
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt

Вам будет предложено ввести информацию о сертификате. Вы можете заполнить эту форму на свое усмотрение; просто помните, что эта информация будет видна в свойствах сертификата. Если вы хотите получить сертификат, вам необходимо создать запрос на подпись (CSR). 2048 бит – это минимум, необходимый для подписания сертификата.

Настройка Nginx

Откройте стандартный конфигурационный файл Nginx:

sudo nano /etc/nginx/sites-enabled/default

Отредактируйте файл следующим образом:

server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443;
server_name jenkins.domain.com;
ssl_certificate           /etc/nginx/cert.crt;
ssl_certificate_key       /etc/nginx/cert.key;
ssl on;
ssl_session_cache  builtin:1000  shared:SSL:10m;
ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
access_log            /var/log/nginx/jenkins.access.log;
location / {
proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header        X-Forwarded-Proto $scheme;
# Fix the “It appears that your reverse proxy set up is broken" error.
proxy_pass          http://localhost:8080;
proxy_read_timeout  90;
proxy_redirect      http://localhost:8080 https://jenkins.domain.com;
}
}

В этой конфигурации параметры cert.crt и cert.key указывают местоположение, в котором будет храниться SSL-сертификат. Вам нужно обновить строки server_name и proxy_redirect и указать свой домен. Есть еще одна полезная функция Nginx: запросы читаются Nginx и переписываются на стороне ответа, чтобы обеспечить обратное проксирование.

Первый раздел говорит, что сервер Nginx может прослушивать любые запросы, поступающие на порт 80 (порт по умолчанию HTTP), и перенаправлять их на HTTPS.

...
server {
listen 80;
return 301 https://$host$request_uri;
}
...

Следующий раздел содержит параметры SSL. В нем находятся хорошие значения по умолчанию.

Читайте также: Создание SSL-сертификата на Nginx в Ubuntu 14.04

...
listen 443;
server_name jenkins.domain.com;
ssl_certificate           /etc/nginx/cert.crt;
ssl_certificate_key       /etc/nginx/cert.key;
ssl on;
ssl_session_cache  builtin:1000  shared:SSL:10m;
ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
...

В последнем разделе настраивается проксирование. Этот раздел принимает любые входящие запросы и передает их на экземпляр Jenkins, который слушает порт 8080 в локальном сетевом интерфейсе.

Читайте также: Использование Nginx в качестве проксирующего фронтенда Apache

...
location / {
proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header        X-Forwarded-Proto $scheme;
# Fix the “It appears that your reverse proxy set up is broken" error.
proxy_pass          http://localhost:8080;
proxy_read_timeout  90;
proxy_redirect      http://localhost:8080 https://jenkins.domain.com;
}
...

Если у вас нет доменного имени, которое разрешается на ваш сервер Jenkins, то выражение proxy_redirect не будет работать правильно и нуждается в модификации. Также, если вы неправильно настроите proxy_pass (например, добавив слеш в конец), вы увидите такое сообщение:

Manage Jenkins
It appears that your proxy set up is broken.

Если вы видите такую ошибку, перепроверьте параметры proxy_pass и proxy_redirect.

2: Настойка Jenkins

Этот мануал предполагает, что Jenkins уже установлен. Если вам нужна помощь в установке, читайте руководство Установка и использование Jenkins на Ubuntu 12.04.

Чтобы обеспечить поддержку Nginx и правильную обработку трафика, нужно обновить конфигурацию Jenkins и настроить экземпляр для прослушивания только локального интерфейса (а не 0.0.0.0). Это важный шаг, потому что если Jenkins будет прослушивать все интерфейсы, он по-прежнему будет доступен через исходный порт (8080). Внесите изменения в файл конфигурационный файл /etc/default/jenkins.

sudo nano /etc/default/jenkins

Найдите строку JENKINS\_ARGS:

JENKINS_ARGS="--webroot=/var/cache/jenkins/war --httpListenAddress=127.0.0.1 --httpPort=$HTTP_PORT -ajp13Port=$AJP_PORT"

Здесь нужно изменить или добавить параметр —httpListenAddress=127.0.0.1.

После этого перезапустите Jenkins и Nginx.

sudo service jenkins restart
sudo service nginx restart

Теперь вы можете получить доступ к домену по HTTP и HTTPS, а сайт Jenkins будет защищен самоподписанным сертификатом.

3: Обновление URL-ов OAuth (опционально)

Если для аутентификации вы используете GitHub или другой плагин OAuth, он, вероятно, перестанет работать на этом этапе. Например, при попытке посетить URL-адрес вы получите сообщение «Failed to open page»:

http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string

Чтобы исправить это, нужно обновить несколько параметров, включая настройку плагина OAuth. Для начала обновите URL

Jenkins (в GUI Jenkins):
Jenkins -> Manage Jenkins -> Configure System -> Jenkins Location
В URL-е Jenkins укажите HTTPS:
Update the Jenkins URL to use HTTPS - https://jenkins.domain.com/

После этого обновите параметры OAuth и укажите внешнего провайдера. Например, чтобы настроить GitHub, перейдите на сайт GitHub и откройте Settings -> Applications -> Developer applications.

Здесь вы найдете запись для Jenkins. Обновите Homepage URL и Authorization callback URL, чтобы отразить настройки HTTPS.

Заключение

Осталось только убедиться, что все работает правильно. Как уже упоминалось выше, теперь вы можете просмотреть свой URL-адрес через HTTP или HTTPS. Вы будете перенаправлены на защищенный сайт и должны увидеть информацию о сайте, включая недавно обновленные настройки SSL. Как уже отмечалось ранее, если вы не используете имена хостов через DNS, ваше перенаправление может не работать должным образом. В этом случае вам нужно будет изменить раздел proxy_pass в конфигурации Nginx.

Для проверки сертификата можно также использовать браузер. Вы можете щелкнуть по символу замочка в адресной строке, чтобы просмотреть свойства сертификата.

Tags: , , ,