Hosts Virtuais Nginx: Hospedando Vários Websites em um Único Servidor

Desbloqueie o poder dos hosts virtuais Nginx (blocos de servidor) para hospedar eficientemente vários websites ou subdomínios em um único servidor. Este guia fornece um tutorial abrangente e passo a passo, cobrindo a configuração de diretórios, a criação de arquivos de configuração, a habilitação de blocos de servidor e os testes Nginx. Aprenda as melhores práticas para subdomínios, blocos de servidor padrão, integração HTTPS e registro dedicado. Exemplos práticos e dicas essenciais de solução de problemas o ajudarão a dominar a hospedagem multi-site Nginx, otimizando o uso de recursos e simplificando o gerenciamento do servidor web.

39 visualizações

Hosts Virtuais do Nginx: Hospedando Múltiplos Sites em um Único Servidor

A infraestrutura web moderna frequentemente exige a capacidade de servir múltiplos sites ou aplicações web a partir de uma única instância de servidor. Isso não só otimiza a utilização de recursos, mas também simplifica o gerenciamento e reduz os custos operacionais. O Nginx, conhecido por seu alto desempenho, estabilidade, conjunto rico de recursos e baixo consumo de recursos, realiza isso através do que chama de server blocks (blocos de servidor), frequentemente referidos como virtual hosts (hosts virtuais) no mundo do Apache.

Este guia abrangente irá guiá-lo através do processo de configuração de hosts virtuais do Nginx para gerenciar e servir efetivamente múltiplos nomes de domínio ou subdomínios distintos a partir de um único servidor Nginx. Se você está hospedando example.com e anothersite.org, ou um site principal com subdomínios como blog.example.com e shop.example.com, dominar os blocos de servidor do Nginx é uma habilidade fundamental para qualquer administrador de sistema ou desenvolvedor. Ao final deste artigo, você terá uma compreensão clara e exemplos práticos para configurar seu servidor Nginx para hospedagem multi-site.

Entendendo os Blocos de Servidor do Nginx (Hosts Virtuais)

Em sua essência, um server block do Nginx é uma diretiva de configuração definida dentro do arquivo de configuração do Nginx (nginx.conf ou arquivos incluídos). Cada bloco server define a configuração para um host virtual específico, ditando como o Nginx deve responder às solicitações para um domínio ou conjunto de domínios em particular. O Nginx usa a diretiva listen para especificar o endereço IP e a porta em que deve escutar, e a diretiva server_name para identificar a quais nomes de domínio ou hostnames este bloco de servidor deve responder.

Quando uma solicitação chega, o Nginx examina o cabeçalho Host da solicitação HTTP e o compara com as diretivas server_name de seus blocos de servidor configurados. Em seguida, ele serve o conteúdo definido no bloco de servidor correspondente. Se nenhum server_name corresponder, o Nginx geralmente reverte para o bloco de servidor padrão (o primeiro bloco server ou um explicitamente marcado como default_server).

Pré-requisitos

Antes de começar, certifique-se de ter o seguinte:

  1. Nginx Instalado: O Nginx deve estar instalado e em execução no seu servidor. Se não estiver, você geralmente pode instalá-lo através do gerenciador de pacotes do seu sistema (ex: sudo apt update && sudo apt install nginx no Ubuntu/Debian, sudo yum install nginx no CentOS/RHEL).
  2. Nomes de Domínio: Você precisa de pelo menos dois nomes de domínio (ex: example1.com e example2.com) ou subdomínios (ex: blog.example.com e app.example.com) que você deseja hospedar. Os registros DNS A/AAAA desses domínios devem apontar para o endereço IP público do seu servidor.
  3. Estrutura Básica de Diretórios: Um plano para onde os arquivos do seu site residirão. Uma prática comum é /var/www/seudominio.com/html.
  4. Privilégios Sudo: Você precisará de acesso sudo para modificar os arquivos de configuração do Nginx.

Guia de Configuração Passo a Passo

Vamos configurar dois hosts virtuais: example1.com e example2.com.

Passo 1: Criar Estrutura de Diretório para Sites

Primeiro, crie diretórios raiz para cada um dos seus sites. É aqui que seus arquivos HTML, CSS, JavaScript e outros arquivos estáticos serão armazenados. Um local comum é /var/www/.

sudo mkdir -p /var/www/example1.com/html
sudo mkdir -p /var/www/example2.com/html

# Define a propriedade para o seu usuário (substitua $USER pelo seu nome de usuário) para permitir a edição
sudo chown -R $USER:$USER /var/www/example1.com/html
sudo chown -R $USER:$USER /var/www/example2.com/html

# Define permissões de leitura para o servidor web
sudo chmod -R 755 /var/www

Em seguida, crie um arquivo index.html simples em cada diretório para testar a configuração:

Para /var/www/example1.com/html/index.html:

<!-- /var/www/example1.com/html/index.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Bem-vindo ao Example1.com!</title>
</head>
<body>
    <h1>Sucesso! Este é o Example1.com.</h1>
    <p>Este host virtual está funcionando corretamente.</p>
</body>
</html>

Para /var/www/example2.com/html/index.html:

<!-- /var/www/example2.com/html/index.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Bem-vindo ao Example2.com!</title>
</head>
<body>
    <h1>Sucesso! Este é o Example2.com.</h1>
    <p>Este host virtual também está funcionando!</p>
</body>
</html>

Passo 2: Criar Arquivos de Configuração de Bloco de Servidor Nginx

O Nginx geralmente carrega as configurações de bloco de servidor a partir de arquivos no diretório /etc/nginx/sites-enabled/. Esses arquivos geralmente são links simbólicos para configurações armazenadas em /etc/nginx/sites-available/. Essa separação permite armazenar configurações que ainda não estão ativas ou habilitar/desabilitar sites facilmente.

Crie um novo arquivo de configuração para example1.com:

sudo nano /etc/nginx/sites-available/example1.com.conf

Adicione o seguinte conteúdo:

# /etc/nginx/sites-available/example1.com.conf
server {
    listen 80;
    listen [::]:80;

    root /var/www/example1.com/html;
    index index.html index.htm index.nginx-debian.html;

    server_name example1.com www.example1.com;

    location / {
        try_files $uri $uri/ =404;
    }

    access_log /var/log/nginx/example1.com_access.log;
    error_log /var/log/nginx/example1.com_error.log;
}

Explicação das Diretivas:

  • listen 80;: O Nginx escuta na porta 80 (HTTP padrão). listen [::]:80; é para IPv6.
  • root /var/www/example1.com/html;: Especifica a raiz do documento para este bloco de servidor. O Nginx procurará arquivos dentro deste diretório.
  • index index.html ...;: Define o arquivo padrão que o Nginx deve servir quando um diretório é solicitado (ex: quando alguém visita example1.com/).
  • server_name example1.com www.example1.com;: Isso é crucial. Diz ao Nginx para responder às solicitações para example1.com ou www.example1.com usando a configuração deste bloco de servidor.
  • location / { ... }: Um bloco que define como lidar com solicitações para URIs específicas. try_files tenta servir um arquivo diretamente ($uri), depois um diretório ($uri/) e, finalmente, retorna um erro 404 Not Found.
  • access_log e error_log: Especifica arquivos de log separados para este site específico, o que é uma boa prática para facilitar a depuração e análises.

Agora, crie um arquivo de configuração semelhante para example2.com:

sudo nano /etc/nginx/sites-available/example2.com.conf

Adicione o seguinte conteúdo:

# /etc/nginx/sites-available/example2.com.conf
server {
    listen 80;
    listen [::]:80;

    root /var/www/example2.com/html;
    index index.html index.htm index.nginx-debian.html;

    server_name example2.com www.example2.com;

    location / {
        try_files $uri $uri/ =404;
    }

    access_log /var/log/nginx/example2.com_access.log;
    error_log /var/log/nginx/example2.com_error.log;
}

Passo 3: Habilitar Blocos de Servidor

Para habilitar essas configurações, crie links simbólicos do diretório sites-available para o diretório sites-enabled. Isso informa ao Nginx para incluir esses arquivos quando ele iniciar.

sudo ln -s /etc/nginx/sites-available/example1.com.conf /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/example2.com.conf /etc/nginx/sites-enabled/

Passo 4: Testar a Configuração do Nginx

É crucial testar sua configuração do Nginx em busca de erros de sintaxe antes de recarregar. Isso evita que o Nginx falhe ao reiniciar devido a um erro de digitação.

sudo nginx -t

Você deve ver uma saída semelhante a esta, indicando sucesso:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Se você vir algum erro, corrija-o nos respectivos arquivos de configuração e execute sudo nginx -t novamente até que passe.

Passo 5: Reiniciar o Nginx

Aplique a nova configuração reiniciando ou recarregando o Nginx. reload é geralmente preferido, pois permite que o Nginx carregue novas configurações sem descartar conexões ativas.

sudo systemctl reload nginx
# Ou, se o reload não funcionar ou para instalações novas:
sudo systemctl restart nginx

Passo 6: Atualizar Registros DNS

Certifique-se de que os registros A DNS para example1.com, www.example1.com, example2.com e www.example2.com apontem todos para o endereço IP do seu servidor Nginx. Sem entradas DNS corretas, seu navegador não saberá onde encontrar seus sites.

Assim que a propagação do DNS for concluída (o que pode levar de alguns minutos a várias horas), você deverá ser capaz de visitar http://example1.com e http://example2.com em seu navegador da web e ver as respectivas páginas index.html.

Cenários Avançados e Melhores Práticas

Hospedagem de Subdomínios

Hospedar subdomínios (ex: blog.example.com, shop.example.com) funciona exatamente como hospedar domínios separados. Você apenas define um novo bloco de servidor com o subdomínio como server_name.

Exemplo para blog.example.com:

# /etc/nginx/sites-available/blog.example.com.conf
server {
    listen 80;
    listen [::]:80;

    root /var/www/blog.example.com/html;
    index index.html;

    server_name blog.example.com;

    location / {
        try_files $uri $uri/ =404;
    }
}

Lembre-se de criar o diretório (/var/www/blog.example.com/html), criar um index.html, criar o link simbólico e recarregar o Nginx.

O Bloco de Servidor Padrão

É uma boa prática ter um bloco de servidor padrão que captura solicitações para nomes de domínio que não correspondem a nenhuma outra diretiva server_name no seu servidor. Isso evita que solicitações desconhecidas sejam atendidas pelo "primeiro" host virtual que o Nginx encontrar, ou permite que você sirva uma página genérica de "site não encontrado".

Tipicamente, o primeiro bloco server no seu nginx.conf ou sites-enabled é implicitamente o padrão. Você pode definir um explicitamente usando default_server:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name _;
    # O sublinhado `_` é um nome de domínio inexistente que nunca corresponderá a uma solicitação real.
    # Você também pode usar localhost.

    root /var/www/default_site/html;
    index index.html;

    location / {
        return 444; # Retorna um erro 444 específico do Nginx (sem resposta) para hosts desconhecidos
        # Ou, sirva uma página de destino genérica:
        # try_files $uri $uri/ =404;
    }
}

Aviso: Se você definir um bloco default_server, certifique-se de que apenas um bloco server em uma determinada porta listen tenha a flag default_server, caso contrário, o Nginx registrará um aviso.

Protegendo Hosts Virtuais com HTTPS (SSL/TLS)

Para sites em produção, habilitar HTTPS é essencial. Isso envolve obter um certificado SSL/TLS (ex: via Let's Encrypt usando Certbot) e configurar o Nginx para escutar na porta 443 com o certificado.

Um bloco de servidor HTTPS típico se parece com isto (após a obtenção dos certificados):

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name example1.com www.example1.com;

    root /var/www/example1.com/html;
    index index.html;

    ssl_certificate /etc/letsencrypt/live/example1.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example1.com/privkey.pem;

    # Incluir outras configurações SSL (ciphers, protocolos, etc.)
    include /etc/nginx/snippets/ssl-params.conf;
    include /etc/nginx/snippets/force-ssl.conf; # Opcional: redireciona HTTP para HTTPS

    location / {
        try_files $uri $uri/ =404;
    }
}

# Opcional: Redirecionamento de HTTP para HTTPS para este domínio
server {
    listen 80;
    listen [::]:80;
    server_name example1.com www.example1.com;
    return 301 https://$host$request_uri;
}

É comum ter um bloco de servidor HTTP separado cuja única finalidade é redirecionar todo o tráfego para seu equivalente HTTPS.

Logs para Cada Site

Conforme mostrado nos exemplos, dedicar arquivos access_log e error_log separados para cada host virtual é uma melhor prática. Isso torna significativamente mais fácil depurar problemas e analisar o tráfego de sites individuais sem vasculhar logs combinados.

Estrutura de Arquivos de Configuração

Para implementações maiores, considere organizar seus arquivos de configuração do Nginx desta forma:

  • nginx.conf: Configuração principal, inclui conf.d/*.conf e sites-enabled/*.
  • conf.d/: Configurações gerais em nível de servidor (ex: Gzip, cache).
  • snippets/: Trechos de configuração do Nginx reutilizáveis (ex: parâmetros SSL, blocos location comuns).
  • sites-available/: Blocos server individuais para cada site.
  • sites-enabled/: Links simbólicos para configurações ativas em sites-available/.

Solução de Problemas de Problemas Comuns

  • Erro 403 Forbidden (Proibido): Isso geralmente significa que o Nginx não tem permissão de leitura para os arquivos ou diretórios do seu site. Verifique as permissões de arquivos e diretórios (ex: sudo chmod -R 755 /var/www/seudominio.com/html e garanta que o usuário Nginx, geralmente www-data ou nginx, possa lê-los).
  • Erro 404 Not Found (Não Encontrado): Verifique se a diretiva root no seu bloco de servidor aponta para o diretório correto e se seu arquivo index.html existe nesse local. Além disso, verifique se o try_files está configurado corretamente.
  • Site Errado Está Carregando: Isso geralmente indica um problema com a diretiva server_name. Certifique-se de que o server_name corresponda exatamente ao nome do domínio que você está tentando acessar (incluindo www. ou subdomínios). Verifique também seus registros DNS.
  • Nginx Falha ao Iniciar/Recarregar: Sempre use sudo nginx -t para testar sua configuração antes de tentar recarregar ou reiniciar o Nginx. As mensagens de erro apontarão para a linha e o arquivo onde ocorreu o erro de sintaxe.
  • Problemas de DNS: Se você puder acessar seu site pelo endereço IP, mas não pelo nome de domínio, é quase certamente um problema de DNS. Use dig ou nslookup para verificar se os registros A do seu domínio apontam para o IP correto do servidor.

Conclusão

Os hosts virtuais do Nginx (blocos de servidor) fornecem uma maneira poderosa e flexível de hospedar múltiplos sites em um único servidor. Ao configurar corretamente os blocos server com as diretivas apropriadas listen, server_name, root e location, você pode gerenciar eficientemente propriedades web diversas. Esta abordagem não apenas conserva recursos, mas também centraliza a administração do servidor.

Com o conhecimento fundamental e as etapas práticas delineadas neste guia, você está agora equipado para configurar e gerenciar múltiplos domínios no seu servidor Nginx. Lembre-se de sempre testar suas configurações, proteger seus sites com HTTPS e seguir as melhores práticas para log e estrutura de diretórios para um ambiente web robusto e de fácil manutenção. A partir daqui, você pode explorar ainda mais as capacidades do Nginx, como proxy reverso, balanceamento de carga e cache, para aprimorar o desempenho e a confiabilidade do seu servidor web.