Поиск по сайту:

Как настроить Nginx с SSL в качестве обратного прокси для Jenkins


Введение

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

В этом посте подробно рассказывается, как обернуть ваш сайт с помощью SSL, используя веб-сервер Nginx в качестве обратного прокси-сервера для вашего экземпляра Jenkins. Этот учебник предполагает некоторое знакомство с командами Linux, работающую установку Jenkins и установку Ubuntu 20.04.

Вы можете установить Jenkins позже в этом руководстве, если он еще не установлен.

Предпосылки

В этом руководстве предполагается, что вы используете Ubuntu 20.04. Прежде чем начать, в вашей системе должна быть настроена учетная запись пользователя без полномочий root с привилегиями sudo. Вы можете узнать, как это сделать, следуя руководству How To Install Nginx on Ubuntu 20.04.

Кроме того, очень важно, чтобы ваш экземпляр Jenkins был защищен с помощью SSL. Если он виден в Интернете, вы можете защитить его с помощью Let’s Encrypt. Вы можете узнать, как это сделать, из учебника «Как защитить Nginx с помощью Let’s Encrypt в Ubuntu 22.04».

Шаг 1 — Настройте Nginx

В последние годы Nginx стал любимым веб-сервером за его скорость и гибкость, что делает его идеальным выбором для нашего приложения.

Изменить конфигурацию

Далее вам нужно будет отредактировать файл конфигурации Nginx по умолчанию. В следующем примере используется nano.

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

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

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

server {

    listen 443;
    server_name jenkins.domain.com;

    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;

      proxy_pass          http://localhost:8080;
      proxy_read_timeout  90;

      proxy_redirect      http://localhost:8080 https://jenkins.domain.com;
    }
    
    ...
}

Вам нужно будет обновить строки server_name и proxy_redirect своим собственным доменным именем. Также происходит некоторая дополнительная магия Nginx, которая сообщает Nginx, что запросы должны быть прочитаны и переписаны на стороне ответа, чтобы обеспечить работу обратного прокси.

Сохраните и закройте файл. Если вы использовали nano, вы можете сделать это, нажав Ctrl + X, Y, а затем Enter.

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

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

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

...
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;

    proxy_pass          http://localhost:8080;
    proxy_read_timeout  90;

    proxy_redirect      http://localhost:8080 https://jenkins.domain.com;
}
...

Примечание. Если вы хотите узнать больше о прокси-сервере в Nginx, в этом руководстве есть полезная информация о настройках прокси-сервера Nginx.

Несколько быстрых вещей, чтобы указать здесь. Если у вас нет доменного имени, которое разрешается на ваш сервер Jenkins, приведенный выше оператор proxy_redirect не будет работать правильно без модификации, так что имейте это в виду. Кроме того, если вы неправильно настроите proxy_pass (например, добавив косую черту в конце), вы получите что-то похожее на следующее на странице конфигурации Jenkins.

Итак, если вы видите эту ошибку, дважды проверьте настройки proxy_pass и proxy_redirect в конфигурации Nginx!

Шаг 2 — Настройте Дженкинс

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

  1. 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.

  1. sudo service jenkins restart
  2. sudo service nginx restart

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

Необязательно — обновить URL-адреса OAuth.

Если вы используете GitHub или другой подключаемый модуль OAuth для аутентификации, он, вероятно, будет нарушен на этом этапе. Например, при попытке перейти по URL-адресу вы получите сообщение «Не удалось открыть страницу» с URL-адресом, похожим на http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string. .

Чтобы исправить это, вам нужно будет обновить несколько настроек в Jenkins, включая настройки плагина OAuth. Сначала обновите URL-адрес Jenkins в графическом интерфейсе Jenkins; его можно найти в меню Jenkins -> Manage Jenkins -> Configure System -> Jenkins Location.

Обновите URL-адрес Jenkins для использования HTTPS — https://jenkins.domain.com/

Затем обновите настройки OAuth у внешнего поставщика. Этот пример для GitHub. На GitHub это можно найти в разделе «Настройки» -> «Приложения» -> «Приложения для разработчиков» на сайте GitHub.

Должна быть запись для Дженкинса. Обновите URL-адрес домашней страницы и URL-адрес обратного вызова авторизации, чтобы они отражали настройки HTTPS. Это может выглядеть примерно так:

Заключение

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