---
title: "Como hospedar vários sites na mesma VPS com Nginx"
description: "Virtual hosts, SSL por domínio e isolamento básico: guia para rodar múltiplos sites WordPress ou estáticos em uma única VPS no Brasil."
url: "https://streethosting.com.br/guias/vps/nginx-varios-sites-mesma-vps"
category: "vps"
slug: "nginx-varios-sites-mesma-vps"
datePublished: "2026-06-09"
dateModified: "2026-09-28"
author: "Equipe StreetHosting"
difficulty: "intermediario"
language: "pt-BR"
keywords:
  - "varios sites mesma vps"
  - "nginx virtual host"
  - "multi site vps"
  - "hospedar wordpress vps"
  - "server block nginx"
  - "pool php fpm por site"
---

# Vários sites na mesma VPS com Nginx

Uma VPS bem configurada sustenta vários projetos pequenos. O segredo está em server blocks separados, um servidor padrão que barra domínios desconhecidos, um usuário e um pool do PHP por site e certificados independentes.

> **Resposta rápida**
>
> Para **vários sites na mesma VPS**, crie um **server block Nginx** por domínio em `sites-available`, ative com um link em `sites-enabled` e adicione um bloco **default_server** que recusa domínios desconhecidos. Dê a cada site PHP um usuário Linux e um pool do PHP FPM próprios, emita um **certificado por domínio** com Certbot e aponte o DNS de todos para o mesmo IP. Uma VPS Xeon de 4 GB atende um conjunto pequeno de sites estáticos ou WordPress leves.

## Quando faz sentido

Agências, freelancers e makers costumam consolidar projetos de clientes pequenos em uma VPS para reduzir custo fixo. Um servidor com dez sites de pouco tráfego custa bem menos do que dez hospedagens separadas, e você administra um sistema só. Funciona enquanto tráfego e criticidade permitem.

O preço dessa economia é que os sites compartilham CPU, memória e disco. Um site que recebe um pico ou sofre um ataque deixa os vizinhos lentos, e uma configuração quebrada no Nginx pode derrubar todos de uma vez. Quando um site vira carro chefe, migre para instância própria antes de um incidente cruzado.

## Como o Nginx escolhe o site

Todos os domínios chegam ao mesmo IP e às mesmas portas. O Nginx separa as requisições pelo nome que o navegador envia no cabeçalho Host e, no HTTPS, pelo nome enviado no início do handshake TLS. Ele compara esse nome com o `server_name` de cada bloco, nesta ordem de prioridade:

| Prioridade | Tipo de server_name | Exemplo |
| --- | --- | --- |
| 1 | Nome exato | loja.com.br |
| 2 | Curinga no início; o mais longo vence | *.loja.com.br |
| 3 | Curinga no fim; o mais longo vence | loja.* |
| 4 | Expressão regular; vale a primeira na ordem da configuração | ~^(www\.)?loja\.com\.br$ |
| 5 | Nenhum casou: servidor padrão da porta | O bloco com default_server, ou o primeiro carregado |

A última linha é a que causa surpresas. Sem um `default_server` explícito, qualquer domínio apontado para o seu IP, ou o próprio IP digitado no navegador, abre o primeiro site carregado, que no Ubuntu costuma ser o primeiro em ordem alfabética. Isso expõe o site de um cliente em um endereço que não é dele e confunde buscadores. A correção está na seção de SSL e segurança.

## Estrutura Nginx: sites disponíveis e ativos

No Ubuntu, a configuração de cada site fica em um arquivo próprio dentro de `/etc/nginx/sites-available/`. O Nginx só carrega o que estiver linkado em `/etc/nginx/sites-enabled/`. Assim você desativa um site removendo o link, sem apagar a configuração. Nomeie cada arquivo com o domínio para achar tudo de cabeça:

```
/etc/nginx/sites-available/
  site1.com.br      (WordPress)
  site2.com.br      (estático)
  padrao            (bloco default_server)

# ativar um site
sudo ln -s /etc/nginx/sites-available/site1.com.br /etc/nginx/sites-enabled/

# desativar o site de exemplo que vem com o pacote
sudo rm /etc/nginx/sites-enabled/default

# testar antes de recarregar, sempre
sudo nginx -t && sudo systemctl reload nginx
```

> **Dica**
>
> Rode sempre `nginx -t` antes de recarregar. Um erro de sintaxe no arquivo de um site impede o Nginx de aceitar a configuração nova de todos, e um restart ou um boot da VPS com esse erro deixa todos os sites fora do ar. O teste pega o problema enquanto eles ainda rodam com a configuração anterior.

## Server blocks para PHP e site estático

Um site WordPress ou outra aplicação PHP em `/etc/nginx/sites-available/site1.com.br`, já apontando para o pool próprio que vamos criar na próxima seção:

```
server {
    listen 80;
    server_name site1.com.br www.site1.com.br;
    root /var/www/site1.com.br/public;
    index index.php index.html;

    access_log /var/log/nginx/site1.com.br.access.log;
    error_log  /var/log/nginx/site1.com.br.error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm-site1.sock;
    }

    location ~ /\.(?!well-known) {
        deny all;
    }
}
```

Um site estático em `/etc/nginx/sites-available/site2.com.br` é ainda mais simples, porque não passa pelo PHP:

```
server {
    listen 80;
    server_name site2.com.br www.site2.com.br;
    root /var/www/site2.com.br/public;
    index index.html;

    access_log /var/log/nginx/site2.com.br.access.log;
    error_log  /var/log/nginx/site2.com.br.error.log;

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

Logs separados por site mostram de onde vem cada erro e cada pico, e como ficam em `/var/log/nginx/` com final `.log`, a rotação que já vem configurada no Ubuntu cuida deles. Para uma aplicação Node, Python ou um container, troque o bloco do PHP por um `proxy_pass`, como em [Nginx como reverse proxy na VPS](https://streethosting.com.br/guias/vps/configurar-nginx-reverse-proxy-vps). A instalação completa do WordPress, com banco, cache e ajustes do PHP, está em [WordPress na VPS com Nginx e PHP 8.3](https://streethosting.com.br/guias/vps/hospedar-wordpress-vps-nginx).

## Isolamento: usuário e pool do PHP por site

Na instalação padrão, todo o PHP roda como o usuário do servidor web em um único pool. Um plugin vulnerável em um site passa a ler e alterar os arquivos de todos os outros. O isolamento básico é dar a cada site um usuário Linux sem login e um pool do PHP FPM que roda com esse usuário.

### Usuário e permissões

```
sudo useradd --system --user-group --home-dir /var/www/site1.com.br \
  --shell /usr/sbin/nologin site1

sudo mkdir -p /var/www/site1.com.br/public
sudo chown -R site1:www-data /var/www/site1.com.br
sudo find /var/www/site1.com.br -type d -exec chmod 2750 {} +
sudo find /var/www/site1.com.br -type f -exec chmod 640 {} +
```

- **Dono site1:** o PHP do site, rodando como esse usuário, lê e grava os próprios arquivos, como uploads e cache.
- **Grupo do servidor web com leitura:** o Nginx lê CSS, imagens e JavaScript para servir direto, mas não grava nada.
- **Nenhuma permissão para outros:** o usuário do site2 não consegue nem listar a pasta do site1.
- **O 2 do 2750:** é o bit setgid, que faz arquivos novos herdarem o grupo da pasta. Sem ele, um upload feito pelo PHP ficaria com o grupo site1 e o Nginx não conseguiria servir.

### Um pool do PHP FPM por site

Crie `/etc/php/8.3/fpm/pool.d/site1.conf`:

```
[site1]
user = site1
group = site1

listen = /run/php/php8.3-fpm-site1.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

pm = ondemand
pm.max_children = 5
pm.process_idle_timeout = 30s
pm.max_requests = 500
```

```
sudo php-fpm8.3 -t
sudo systemctl reload php8.3-fpm
ls -l /run/php/
```

O socket pertence ao usuário do Nginx, que é quem se conecta a ele, mas os processos rodam como site1. O modo `ondemand` é o que torna vários sites viáveis em pouca RAM: sem visitas, o pool não mantém processo nenhum; eles nascem na primeira requisição e morrem depois de 30 segundos parados. O `pm.max_children` limita quanto um site pode crescer, e assim um pico em um não consome a memória dos outros. O `pm.max_requests` recicla processos para conter vazamentos de memória de plugins.

> **Atenção**
>
> Dá para ir além com `php_admin_value[open_basedir]` no pool, restringindo o PHP à pasta do site. Trate como uma camada extra, não como barreira de segurança, e teste antes: alguns plugins leem arquivos fora da pasta e quebram com essa opção. Para clientes que não se conhecem, containers separados, como em [WordPress com Docker Compose](https://streethosting.com.br/guias/vps/instalar-wordpress-docker-vps), isolam mais.

## DNS, SSL e segurança

Cada domínio precisa de registros A, no raiz e no www, apontando para o mesmo IP da VPS. O passo a passo, com testes pelo dig, está em [apontar domínio para a VPS](https://streethosting.com.br/guias/vps/apontar-dominio-vps-registro-dns). Com o DNS resolvendo, emita um certificado por site:

```
sudo certbot --nginx -d site1.com.br -d www.site1.com.br
sudo certbot --nginx -d site2.com.br -d www.site2.com.br

sudo certbot certificates
sudo certbot renew --dry-run
```

Não junte os domínios de clientes diferentes em um certificado só. A renovação valida todos os nomes do certificado: se um cliente sai e o domínio dele deixa de apontar para a VPS, a renovação falha para todos os sites daquele certificado. Os detalhes do Certbot estão em [certificado SSL com Let's Encrypt e Nginx](https://streethosting.com.br/guias/vps/certificado-ssl-vps-lets-encrypt-nginx).

Agora o bloco padrão que barra domínios desconhecidos, em `/etc/nginx/sites-available/padrao`:

```
server {
    listen 80 default_server;
    listen 443 ssl default_server;
    server_name _;

    ssl_reject_handshake on;
    return 444;
}
```

O `return 444` fecha a conexão HTTP sem resposta, e o `ssl_reject_handshake`, disponível desde o Nginx 1.19.4, recusa o HTTPS para nomes sem bloco próprio sem precisar de certificado. Ative com um link em `sites-enabled` e teste com `curl -I http://IP_DA_VPS`, que deve falhar sem resposta.

- **Firewall:** libere só 80, 443 e o SSH, de preferência restrito, como em [UFW na VPS](https://streethosting.com.br/guias/vps/firewall-ufw-vps-ubuntu).
- **Fail2ban:** opcional, contra força bruta no SSH e no login do WordPress.
- **Migração:** para trazer um site existente, siga [migrar WordPress para VPS](https://streethosting.com.br/guias/vps/migrar-site-wordpress-para-vps) e crie o usuário e o pool antes de copiar os arquivos.

## Erros comuns com vários sites

Quase todo problema nessa montagem cai em uma destas linhas. Comece sempre pelo log de erro do site afetado, que agora fica separado dos outros.

| Sintoma | Causa provável | Como resolver |
| --- | --- | --- |
| 502 Bad Gateway em um site PHP | O caminho do socket no server block não bate com o do pool, ou o pool não subiu | Compare o fastcgi_pass com o listen do pool e confira o status do PHP FPM |
| 403 Forbidden em tudo | O Nginx não consegue atravessar a pasta do site ou falta o arquivo de índice | Confira dono, grupo e o modo 2750 das pastas até a raiz do site |
| Um domínio abre o site de outro | Nome faltando no server_name, como o www, ou DNS apontado para outro lugar | Revise o server_name e teste o nome com dig |
| Upload funciona, mas a imagem não aparece | Arquivo novo criado sem o grupo do servidor web | Reaplique o grupo e o bit setgid nas pastas do site |
| Certbot falha em um domínio | O domínio ainda não aponta para a VPS ou o server_name não existe em nenhum bloco | Confirme o registro A e rode o Certbot de novo só para esse site |

Para ver os erros de um site em tempo real, use `sudo tail -f /var/log/nginx/site1.com.br.error.log` enquanto recarrega a página. Para conferir qual configuração o Nginx realmente carregou, com todos os arquivos incluídos, rode `sudo nginx -T` e procure pelo domínio. E para testar um site antes de mudar o DNS, force o nome na requisição com `curl -I -H "Host: site1.com.br" http://IP_DA_VPS`.

## Limites e escala

Monitore RAM e swap. Com um usuário por site, fica fácil ver quanto cada um consome, somando a memória dos processos do PHP por dono:

```
ps -o user=,rss= -C php-fpm8.3 | awk '{m[$1]+=$2} END {for (u in m) printf "%s %.0f MB\n", u, m[u]/1024}'
free -h
```

Pools em modo dinâmico ou estático mantêm processos parados consumindo memória mesmo sem visita, por isso o ondemand é a escolha para sites pequenos. Quando a soma dos projetos passar de 70% da RAM de forma sustentada, suba de plano ou separe as cargas. Um site que sozinho responde pela maior parte do consumo é o candidato natural a ganhar uma VPS própria.

| Conjunto de sites | Plano de partida | Preço mensal |
| --- | --- | --- |
| Até 5 sites WordPress leves ou dezenas de estáticos | VPS Xeon 3 vCPU, 4 GB, 40 GB NVMe | R$ 43,00 |
| Agência com 10 a 15 sites e uma loja pequena | VPS Xeon 6 vCPU, 8 GB, 80 GB NVMe | R$ 77,00 |
| Sites com muito PHP fora do cache | VPS Ryzen 4 vCPU, 8 GB DDR5, 80 GB NVMe | R$ 126,00 |

Na [VPS da StreetHosting](https://streethosting.com.br/vps) você tem acesso root, datacenter em São Paulo, AntiDDoS incluso e ativação em até 60 segundos. Quando a VPS ficar pequena, o upgrade pelo painel cobra só a diferença proporcional e pede um reinício, que derruba todos os sites por alguns instantes, então agende para a madrugada.

## Perguntas frequentes

### Quantos sites cabem em uma VPS de 4 GB?

Com pools do PHP em modo ondemand e cache de página, de 3 a 5 sites WordPress leves com tráfego modesto, ou dezenas de sites estáticos. Loja WooCommerce ou site com tráfego alto pede mais RAM ou uma VPS só para ele. Meça o consumo de cada site antes de colocar o próximo.

### Um site invadido afeta os outros?

Sem isolamento, sim: se todos os sites rodam com o mesmo usuário do servidor web, um plugin vulnerável em um deles dá acesso aos arquivos de todos. Com um usuário e um pool do PHP por site e pastas fechadas para os demais, o estrago fica contido. Para clientes que não se conhecem, containers ou VPS separadas isolam ainda mais.

### Preciso de um IP extra por site?

Não. O Nginx escolhe o site pelo nome que o navegador envia no cabeçalho Host e, no HTTPS, pela extensão SNI do TLS. Um único IP atende todos os domínios, cada um com o seu certificado.

### Por que um domínio desconhecido abre um dos meus sites?

Porque, quando nenhum server_name casa com o nome pedido, o Nginx usa o servidor padrão da porta, que sem configuração é o primeiro bloco carregado. Crie um bloco com default_server que responde 444 e rejeita o handshake TLS, e só os domínios configurados vão abrir algum site.

### Um certificado para todos os sites ou um por site?

Um por site. Um certificado com todos os domínios falha na renovação inteira se um deles deixar de apontar para a VPS, por exemplo quando um cliente sai, e todos os sites ficam com o certificado perto de vencer. Separados, cada um renova sozinho e sai sem afetar os outros.

## Guias relacionados

- [Como apontar domínio para VPS: registros A, AAAA e CNAME](https://streethosting.com.br/guias/vps/apontar-dominio-vps-registro-dns.md)
- [Hospedar WordPress na VPS: Nginx, PHP 8.3 e MariaDB](https://streethosting.com.br/guias/vps/hospedar-wordpress-vps-nginx.md)
- [Certificado SSL na VPS com Let's Encrypt e Nginx](https://streethosting.com.br/guias/vps/certificado-ssl-vps-lets-encrypt-nginx.md)
- [Como configurar o Nginx como reverse proxy na VPS](https://streethosting.com.br/guias/vps/configurar-nginx-reverse-proxy-vps.md)
- [Como migrar site WordPress para VPS sem perder visitas](https://streethosting.com.br/guias/vps/migrar-site-wordpress-para-vps.md)

## Produtos citados

- https://streethosting.com.br/vps
- https://streethosting.com.br/vps/xeon
- https://streethosting.com.br/vps/ryzen

## Dados estruturados

```json
[
  {
    "@context": "https://schema.org",
    "@type": [
      "Article",
      "TechArticle"
    ],
    "headline": "Vários sites na mesma VPS com Nginx",
    "name": "Como hospedar vários sites na mesma VPS com Nginx",
    "abstract": "Uma VPS bem configurada sustenta vários projetos pequenos. O segredo está em server blocks separados, um servidor padrão que barra domínios desconhecidos, um usuário e um pool do PHP por site e certificados independentes.",
    "description": "Virtual hosts, SSL por domínio e isolamento básico: guia para rodar múltiplos sites WordPress ou estáticos em uma única VPS no Brasil.",
    "datePublished": "2026-06-09",
    "dateModified": "2026-09-28",
    "author": {
      "@type": "Organization",
      "name": "Equipe StreetHosting"
    },
    "publisher": {
      "@type": "Organization",
      "name": "StreetHosting",
      "url": "https://streethosting.com.br"
    },
    "inLanguage": "pt-BR",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://streethosting.com.br/guias/vps/nginx-varios-sites-mesma-vps"
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    "mainEntity": [
      {
        "@type": "Question",
        "name": "Quantos sites cabem em uma VPS de 4 GB?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Com pools do PHP em modo ondemand e cache de página, de 3 a 5 sites WordPress leves com tráfego modesto, ou dezenas de sites estáticos. Loja WooCommerce ou site com tráfego alto pede mais RAM ou uma VPS só para ele. Meça o consumo de cada site antes de colocar o próximo."
        }
      },
      {
        "@type": "Question",
        "name": "Um site invadido afeta os outros?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Sem isolamento, sim: se todos os sites rodam com o mesmo usuário do servidor web, um plugin vulnerável em um deles dá acesso aos arquivos de todos. Com um usuário e um pool do PHP por site e pastas fechadas para os demais, o estrago fica contido. Para clientes que não se conhecem, containers ou VPS separadas isolam ainda mais."
        }
      },
      {
        "@type": "Question",
        "name": "Preciso de um IP extra por site?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Não. O Nginx escolhe o site pelo nome que o navegador envia no cabeçalho Host e, no HTTPS, pela extensão SNI do TLS. Um único IP atende todos os domínios, cada um com o seu certificado."
        }
      },
      {
        "@type": "Question",
        "name": "Por que um domínio desconhecido abre um dos meus sites?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Porque, quando nenhum server_name casa com o nome pedido, o Nginx usa o servidor padrão da porta, que sem configuração é o primeiro bloco carregado. Crie um bloco com default_server que responde 444 e rejeita o handshake TLS, e só os domínios configurados vão abrir algum site."
        }
      },
      {
        "@type": "Question",
        "name": "Um certificado para todos os sites ou um por site?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Um por site. Um certificado com todos os domínios falha na renovação inteira se um deles deixar de apontar para a VPS, por exemplo quando um cliente sai, e todos os sites ficam com o certificado perto de vencer. Separados, cada um renova sozinho e sai sem afetar os outros."
        }
      }
    ]
  }
]
```
