Explorando diretivas no nginx: `server_name` e GitHub pages

Nesse post eu fiz um levantamento sobre alguns valores usados no arquivo de configuração do nginx, que geralmente são copiados e colados de um lado pro outro sem muita reflexão:

  • server_name
  • try_file
  • fastcgi_pass
  • fastcgi_param

Compartilho aqui com vocês o que eu escrevi sobre o uso do server_name, pq consegui dar uma explorada legal, usando o GitHub Pages, que é onde eu hospedo o meu blog. >:)

server_name

O uso da diretiva server_name está ligada ao jeito com o qual o nginx processa o recebimento de requisições. Com o nginx, podemos rodar vários projetos (servers) em uma mesma porta, com diferentes nomes.

Um exemplo básico é um arquivo default.conf com os seguintes valores:

server {
    listen      80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      80;
    server_name example.net www.example.net;
    ...
}

server {
    listen      80;
    server_name example.com www.example.com;
    ...
}

Digamos que essa configuração está rodando numa máquina virtual de IP fixo, por exemplo, 52.58.199.22. A escolha do server que vai retornar a requisição é baseada no cabeçalho Host.

Por exemplo, o request

curl -H "Host: example.net" 52.58.199.22

vai ser direcionado para o segundo bloco server definido na configuração.

Um exemplo mais prático (o ip fixo acima é inventado) é usando o domínio do meu blog, que é hospedado no GitHub Pages (que parece usar nginx).

Uma forma de verificar que o github pages usa nginx é forçando um redirect: como o github pages possui uma opção para forçar o redirecionamento de http para https, podemos visualizar um rastro do nginx ao fazer um request na porta :80.

Opção para forçar redirect https no github pages

curl http://guilhermegarcia.dev

guites@macos blog % curl http://guilhermegarcia.dev
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>

O IP fixo do blog é 185.199.111.153. Você pode verificar com

dig guilhermegarcia.dev +short
185.199.111.153

Se tentarmos um acesso com um Host diferente do definido na sua configuração, o acesso não vai ser encontrado:

curl -i -H "Host: notguilhermegarcia.dev" 185.199.111.153

HTTP/1.1 404 Not Found

...
..
<h1>404</h1>
  <p><strong>There isn't a GitHub Pages site here.</strong></p>
.
.

Mas, com o Host esperado, funciona:

curl -i -H "Host guilhermegarcia.dev" 185.199.111.153

HTTP/1.1 301 Moved Permanently
Location: https://guilhermegarcia.dev/

...
..
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>

(e somos redirecionados pra versão https do site).

O GitHub pages serve diversos sites em cada IP fixo, então existem muitos outros domínios que vão funcionar pra esse mesmo IP! Por exemplo,

curl -i -H "Host: government.github.com" 185.199.111.153

HTTP/1.1 301 Moved Permanently
Connection: keep-alive
Content-Length: 162
Server: GitHub.com
Content-Type: text/html
Location: https://government.github.com/
...

(também com o redirect para o https).

Você pode consultar essa listagem de sites hospedados no GH Pages e verificar como eles se comportam nesse teste.

Uma curiosidade é que nem todos esses domínios vão retornar o mesmo IP, usando a consulta com o dig:

dig A government.github.com +short

185.199.109.153

Isso tem a ver com o apontamento de DNS recomendado pelo GitHub pages, que indica até 4 endereços de IP por site:

Apontamento de DNS para sites no domínio principal

Abraço!

outras referências: http://nginx.org/en/docs/http/request_processing.html