Nginx как обратный прокси-сервер Jenkins

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

Данное руководство подробно описывает, как развернуть сайт с SSL на веб-сервере Nginx, работающем в качестве обратного прокси для Jenkins.

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

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

Nginx очень популярен благодаря своей скорости и гибкости.

Примечание: все команды данного раздела нужно выполнять с привилегиями sudo.

Установка Nginx

Итак, обновите список пакетов, а затем установите Nginx.

sudo apt-get update
sudo apt-get install nginx

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

nginx -v

Создание SSL-сертификата

Теперь нужно приобрести или самостоятельно создать сертификат SSL. Ниже приведены команды для создания самоподписанного сертификата, но во избежание предупреждений браузера рекомендуется получить официально подписанный сертификат.

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

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

На данном этапе нужно будет предоставить некоторую информацию о сертификате. Заполните пустые поля соответственными данными, но имейте в виду: вся эта информация будет видна в свойствах сертификата. Данная команда установит количество битов 2048, так как это минимум, необходимый для получения подписи центра сертификации (ЦС). Кроме того, нужно сгенерировать CSR, чтобы сертификат был подписан.

Настройка 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-сертификата. Нужно отредактировать строки servername и proxyredirect, указав в них доменное имя. Кроме того, Nginx обладает дополнительными функциями, которые позволяют переписывать прочитанные Nginx запросы на стороне ответа,  что гарантирует работу обратного прокси-сервера.

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

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

Итак, теперь необходимые настройки SSL установлены. Это достаточно хороший набор настроек по умолчанию, но его определенно можно расширить.

...
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 можно найти в этом руководстве).

...
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 (например, при внесении лишнего слеша) страница конфигурации Jenkins выдаст сообщение об ошибке «It appears that your reverse proxy set up is broken».

При появлении этой ошибки перепроверьте proxy_redirect и proxy_pass.

2: Настройка Jenkins

Как указывалось ранее, это руководство предполагает, что сервер Jenkins уже установлен. Чтобы узнать, как установить Jenkins, читайте данное руководство (для его выполнения переключитесь на root-пользователя).

Чтобы Jenkins мог работать с 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 будет защищен. При использовании самоподписанного сертификата появится предупреждение.

Дополнительно: Обновление OAuth

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

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

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

Jenkins -> Manage Jenkins -> Configure System -> Jenkins Location

Jenkins URL должен использовать HTTPS: https://jenkins.domain.com/.

Затем отредактируйте настройки OAuth. В данном руководстве в качестве примера будет использоваться GitHub. На сайте GitHub эти настройки можно найти в Settings -> Applications -> Developer applications.

Там должна быть отдельная запись для Jenkins. Обновите поля Homepage URL и Authorization callback URL, повторив параметры HTTPS.

Итоги

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

Используйте браузер, чтобы протестировать сертификат. Нажав на клавишу с замком, вы должны увидеть в браузере свойства сертификата.

Tags: , , , , , , , ,

Добавить комментарий