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 (server
s) 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.
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:
Abraço!
outras referências: http://nginx.org/en/docs/http/request_processing.html