Como Configurar o Nginx com SSL como um Proxy Reverso para o Jenkins

Introdução

Por padrão, o Jenkins vem com seu próprio servidor web integrado, que escuta na porta 8080. Isso é conveniente se você executar uma instância privada do Jenkins, ou se precisar apenas colocar algo rapidamente e não se importar com a segurança. No entanto, uma vez que você tenha dados de produção reais indo para seu host, é uma boa ideia usar um servidor web mais seguro, como o Nginx, para lidar com o tráfego.

Este post detalhará como envolver seu site com SSL usando o servidor web Nginx como um proxy reverso para sua instância do Jenkins. Este tutorial assume alguma familiaridade com comandos Linux, uma instalação funcional do Jenkins e uma instalação do Ubuntu 20.04.

Você pode instalar o Jenkins posteriormente neste tutorial, se ainda não o tiver instalado.

Pré-requisitos

Este guia pressupõe que você está usando o Ubuntu 20.04. Antes de começar, você deve ter uma conta de usuário não root com privilégios sudo configurados em seu sistema. Você pode aprender como fazer isso seguindo o tutorial de configuração inicial do servidor Ubuntu 20.04. Você também precisará do servidor Nginx instalado e hospedando seu domínio. Você pode aprender como fazer isso com o Tutorial de Instalação do Nginx no Ubuntu 20.04.

Além disso, ter sua instância do Jenkins protegida por SSL é muito importante. Se estiver visível na internet, você pode protegê-lo com o Let’s Encrypt. Você pode aprender como fazer isso com o Como Proteger o Nginx com Let’s Encrypt no Tutorial do Ubuntu 22.04.
Como mencionado anteriormente, este tutorial pressupõe que o Jenkins já está instalado. Este tutorial irá mostrar como instalar o Jenkins, se necessário. Você provavelmente precisará alternar para o usuário root para esse artigo.

Passo 1 — Configurar o Nginx

O Nginx se tornou um servidor web favorito por sua velocidade e flexibilidade nos últimos anos, o que o torna uma escolha ideal para nossa aplicação.

Editar a Configuração

Em seguida, você precisará editar o arquivo de configuração padrão do Nginx. O exemplo a seguir usa nano.

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

Aqui está como a configuração final pode parecer; as seções estão divididas e brevemente explicadas abaixo. Você pode atualizar ou substituir o arquivo de configuração existente, embora seja recomendável fazer uma cópia de backup primeiro.

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

Você precisará atualizar as linhas server_name e proxy_redirect com seu próprio nome de domínio. Também há algum tipo de magia adicional do Nginx que diz para as solicitações serem lidas pelo Nginx e reescritas no lado da resposta para garantir que o proxy reverso esteja funcionando.

Salve e feche o arquivo. Se você usou o nano, pode fazer isso pressionando Ctrl + X, Y, e depois Enter.

A primeira seção indica ao servidor Nginx para escutar todas as solicitações que chegam na porta 80 (HTTP padrão) e redirecioná-las para HTTPS.

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

Depois disso, ocorre a proxyficação. Basicamente, ela pega todas as solicitações recebidas e as encaminha para a instância do Jenkins que está vinculada/ouvindo na porta 8080 na interface de rede local.

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

Observação: Se você deseja aprender mais sobre a proxyficação no Nginx, este tutorial tem algumas informações úteis sobre as configurações de proxy do Nginx.

A few quick things to point out here. If you don’t have a domain name that resolves to your Jenkins server, then the proxy_redirect statement above won’t function correctly without modification, so keep that in mind. Also, if you misconfigure the proxy_pass (by adding a trailing slash for example), you will get something similar to the following in your Jenkins Configuration page.

Portanto, se você encontrar esse erro, verifique novamente suas configurações de proxy_pass e proxy_redirect no arquivo de configuração do Nginx!

Passo 2 — Configurar o Jenkins

Para que o Jenkins funcione com o Nginx, precisamos atualizar a configuração do Jenkins para ouvir apenas no endereço localhost em vez de todos (0.0.0.0), para garantir que o tráfego seja tratado corretamente. Este é um passo de segurança importante, porque se o Jenkins ainda estiver ouvindo em todos os endereços, ainda poderá ser acessível através de sua porta original (8080). Vamos modificar o arquivo de configuração /etc/default/jenkins para fazer esses ajustes.

  1. sudo nano /etc/default/jenkins

Localize a linha JENKINS\_ARGS e atualize para ficar como o seguinte:

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

Observe que a configuração –httpListenAddress=127.0.0.1 deve ser adicionada ou modificada.

Em seguida, reinicie o Jenkins e o Nginx.

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

Agora você deve conseguir visitar seu domínio usando HTTPS, e o site do Jenkins será servido com segurança.

Opcional — Atualizar URLs do OAuth

Se estiver a utilizar o GitHub ou outro plugin OAuth para autenticação, provavelmente estará com problemas neste momento. Por exemplo, ao tentar visitar o URL, irá obter um “Falha ao abrir página” com um URL semelhante a http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string.

Para resolver isso, será necessário atualizar algumas configurações dentro do Jenkins, incluindo as configurações do plugin OAuth. Primeiro, atualize o URL do Jenkins na interface gráfica do Jenkins; pode ser encontrado no menu Jenkins -> Gerenciar Jenkins -> Configurar Sistema -> Localização do Jenkins.

Atualize o URL do Jenkins para usar HTTPS – https://jenkins.domain.com/

Em seguida, atualize as configurações do OAuth com o provedor externo. Este exemplo é para o GitHub. No GitHub, isso pode ser encontrado em Configurações -> Aplicativos -> Aplicativos de Desenvolvedor, no site do GitHub.

Deverá existir uma entrada para o Jenkins. Atualize o URL da Página Inicial e URL de Callback de Autorização para refletir as configurações de HTTPS. Pode parecer semelhante ao seguinte:

Conclusão

A única coisa que resta fazer é verificar se tudo funcionou corretamente. Como mencionado acima, agora você deve conseguir navegar até o seu URL recém-configurado – jenkins.domain.com – tanto via HTTP quanto HTTPS. Você deverá ser redirecionado para o site seguro e deverá ver algumas informações do site, incluindo suas configurações SSL recém-atualizadas. Como observado anteriormente, se você não estiver usando nomes de host via DNS, então seu redirecionamento pode não funcionar conforme desejado. Nesse caso, será necessário modificar a seção proxy_pass no arquivo de configuração do Nginx.

Source:
https://www.digitalocean.com/community/tutorials/how-to-configure-nginx-with-ssl-as-a-reverse-proxy-for-jenkins