Como ter diversos sub/domínios no mesmo servidor? (Domínios virtuais com Apache2)

Neste tutorial você vai aprender como configurar vários domínios no mesmo servidor, bem como aplicar medidas simples de segurança.

Vou utilizar a distribuição mais recente do Debian 10 como o tutorial LAMP, e claro que antes de mais nada você precisa ter seu DNS configurado com seus subdomínios (hosts) apontando para o IP do seu servidor WEB. logo nossos requezitos são:
Instalação Debian 10 Buster LIMPA Passo-a-passo
Servidor DNS seguro com Bind9 (Recursivo, Autoritativo e Reverso) + Fail2ban + nftables no Debian 10 Buster
Passo-a-passo como criar um servidor WEB Apache + PHP + MariaDB + phpMyAdmin no Debian 10 Buster “LAMP”

No nossos exemplos vou configurar 4 subdomínios www, teste, phpipam e sistema. Com a ideia que seja um nosso site, um testador de banda, nosso querido phpipam onde documentamos os ips da nossa rede e sistema um subdomínio que vai ter alguma “sistema web qualquer”.

Tenha então em seu arquivo da configuração DNS autoritativa ( ex /var/cache/bind/master-aut/seudominio.net.br.hosts) seus subdomínios apontados, no nosso ex os IPs seriam o 45.80.50.2 e 2804:f123:bebe:cafe::2

www         A       45.80.50.2
            AAAA    2804:f123:bebe:cafe::2
teste       A       45.80.50.2
            AAAA    2804:f123:bebe:cafe::2
phpipam     A       45.80.50.2
            AAAA    2804:f123:bebe:cafe::2
sistema     A       45.80.50.2
            AAAA    2804:f123:bebe:cafe::2

Com seu Apache já instalado vamos algumas informações que são necessárias saber. O Apache mantém seus arquivos de configuração dentro da pasta /etc/apache2:

/etc/apache2
├── conf-available
│   └── *.conf
├── conf-available
│   └── *.conf
├── conf-enabled
│   └── *.conf
├── mods-available
│   └── *.load
├── mods-enabled
│   └── *.load
├── sites-available
│   └── *.conf
├── sites-enabled
│   └── *.conf
├── apache2.conf 
├── magic
├── envvars
├── ports.conf

Há vários arquivos de texto simples e alguns subdiretórios de forma bem organizada e objetiva, os principais são:

apache2.conf: Este é o arquivo de configuração principal do servidor. Quase toda a configuração pode ser feita dentro desse arquivo, embora seja recomendado usar arquivos separados e designados para simplificar. Este arquivo irá configurar os padrões e ser o ponto central de acesso para o servidor ler os detalhes da configuração.

ports.conf: Este arquivo é usado para especificar as portas nas quais os hosts devem ouvir.

conf-[available, enabled]/: Este diretório é usado para controlar aspectos específicos da configuração do Apache. Por exemplo, costuma ser usado para definir opções de segurança.

sites-[available-enabled]/: este diretório contém todos os arquivos de hosts virtuais que definem cada subdmínio. Eles estabelecerão qual conteúdo será exibido para quais solicitações.

mods-[available, enabled]/: Esses diretórios são semelhantes em função aos diretórios de sites, mas eles definem módulos que podem ser carregados opcionalmente.

Como você pode ver alguns diretórios encontramos available e enabled, como o próprio nome diz o que esta em available são as configurações disponíveis e em enabled as configurações ativas. As configurações do Apache não ocorre em um único arquivo mas acontece através de um design modular onde novos arquivos podem ser adicionados e modificados conforme necessário.

Normalmente você após instalar o apache “corre” para o navegador e digita o endereço do seu IP para ver se seu servidor esta funcionando.

Mas agora que você conhece um pouquinho mais da arquitetura do diretório apache que tal saber porque ele mostra essa pagina default ao abrir seu IP no navegador?

Logo se é algo que esta carregando web deve estar dentro do diretório /etc/apache2/sites-enabled/ e é la que encontramos o 000-default.conf abra o mesmo e veja como ele é configurado

# vim /etc/apache2/sites-enabled/000-default.conf

Esse é seu arquivo de configuração default


        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf

VirtualHost *:80 – Temos então nosso “primeiro e único” até o momento domínio virtual. Perceba q *:80 quer dizer qlqr ip na porta 80, entao se você tiver diversos endereços ips no mesmo servidor ele sempre vai interpretar. Se você tá experto notou o ServerName comentado, é ele que configuramos nossos hosts, logo se o mesmo não tem nenhum ServerName configurado o apache entende que tudo que jogarem para ele na porta 80 ele carregue essa pagina default, neste momento os 4 subdomínios vão esta carregando a mesma pagina.

ServerAdmin – E-mail do administrador

DocumentRoot – Diretório onde fica os arquivos. Padrão da instalação é o /var/www/html onde encontramos uma index.html que se você editar vai descobrir que é aquela página default. Vale lembrar que sempre que o arquivo se chamar index.html/php ele vai ser carregado ao acessar aquele diretório.

ErrorLog – Local onde ele vai registrar o logs de erros.

CustomLog – local onde guardará os logs de acesso.

Para cada subdomínio (host) vou criar um diretório novo dentro de /var/www/ e para ficar bem objetivo darei o nome da pasta o mesmo do host:

/var/www/
├── www/
│   └── *.html
│   └── *.php
│   └── *.*
├── teste
│   └── *.*
├── phpipam
│   └── *.*
├── sistema
│   └── *.*

Criamos os diretórios

# mkdir -p /var/www/{www,teste,phpipam,sistema}

Se ainda não habilitou o mod_rewrite vamos habilitar, o mesmo utiliza um mecanismo baseado em regras de reescrita, ex o wordpress e phpipam usam o mesmo.

Vamos ao comando para habilita-lo:

# a2enmod rewrite

Nosso primeiro arquivo vai representar o host www, ele vai ficar em sites-available ou seja ainda não está ativo (enable) e mais uma vez para ser objetivo vai ter o mesmo nome do host, porém ele deve terminar com .conf, logo www.conf

# vim /etc/apache2/sites-available/www.conf

Agora vamos ter dois caras novos ServerName e ServerAlias qual vai esta apontando para nossos domínios. Como o ServerAlias pode ser apontado para diversos hosts.


        ServerName remontti.com.br
        ServerAlias www.remontti.com.br
        ServerAdmin noc@remontti.com.br

        DocumentRoot /var/www/www 

        
                Options FollowSymLinks
                AllowOverride All
         

        LogLevel warn 
        ErrorLog ${APACHE_LOG_DIR}/error_www.log
        CustomLog ${APACHE_LOG_DIR}/access_www.log combined

Note que em ErrorLog e CustomLog eu adicionei um _www junto para que no log tenha apenas informações desse host.

Hora de habilitar! Usamos o comando a2ensite ele vai pegar o arquivo www.conf da pasta sites-available e criar um atalho dentro de sites-enabled

# a2ensite www

Para que as novas configurações do apache tenham efeito é necessário restartar o apache.

# systemctl restart apache2

Para o Host teste vai ser o mesmo procedimento, porém em Options vou colocar o valor `Indexes`, para que o mesmo me liste os diretórios sem arquivos index, é recomendado que você não utilize pois vou demonstrar a frente uma tela por isso estou deixando ele. Para um cenario real deixe apenas `Options FollowSymLinks`

# vim /etc/apache2/sites-available/teste.conf

        ServerName teste.remontti.com.br
        ServerAdmin noc@remontti.com.br

        DocumentRoot /var/www/teste 

        
                Options Indexes FollowSymLinks
                AllowOverride All
         

        LogLevel warn 
        ErrorLog ${APACHE_LOG_DIR}/error_teste.log
        CustomLog ${APACHE_LOG_DIR}/access_teste.log combined
# a2ensite teste
# systemctl restart apache2

Você já será capas de acessar os dois host tendo paginas diferentes.

Antes de prosseguir tem um detalhe que eu particularmente não gosto de deixar quaquer um ficar sabendo o que esta rodando e versões:
“Apache/2.4.38 (Debian) Server at teste.remontti.com.br Port 80”.
Por segurança recomendo remover a assinatura do servidor, para isso edite:

# vim /etc/apache2/conf-enabled/security.conf

Altere as variáveis:
ServerTokens Prod
ServerSignature Off

Restar o apache2

# systemctl restart apache2


Pronto ninguém precisa saber!

Para o phpipam vou fazer um pouco diferente, vamos focar na segurança, no exemplo vou permitir apenas “meu bloco do NOC” ter acesso (45.80.51.0/29 2804:f123:bebe:coca::/64), e diferente dos blocos permitidos vou direcionar ele para o “site da empresa”.

# vim /etc/apache2/sites-available/phpipam.conf

   ServerName teste.remontti.com.br
   ServerAdmin noc@remontti.com.br

   DocumentRoot /var/www/phpipam

   # Sem permissões será redirecionada para
   ErrorDocument 403 http://www.remontti.com.br

   
      Options FollowSymLinks
      AllowOverride All
      Require all denied
      
         
            Require ip 45.80.51.0/29 2804:f123:bebe:coca::/64
         
      
   

   ErrorLog ${APACHE_LOG_DIR}/error_phpipam.log
   CustomLog ${APACHE_LOG_DIR}/access_phpipam.log combined

# a2ensite phpipam
# systemctl restart apache2

Por fim nosso host sistema, nesse vou ensinar como colocar uma senha do apache. No passado já tem um tutorial como proteger diretórios do apache de duas maneira, pelo arquivo de configuração do apache que vou demonstrar aqui e através do htaccess.

apachelogin

Primeiramente vamos gerar nosso arquivo de usuário/senha com htpasswd -c arquivo usuário (-c criar arquivo)

# htpasswd -c /var/www/sistema/.htpasswd admin

Digite sua senha para o usuário admin

# vim /etc/apache2/sites-available/sistema.conf

Vou permanecer com a restrição por IP mas se você deseja remover basta remover o:

   
        Require ip 45.80.51.0/29 2804:f123:bebe:coca::/64
   
A novidade agora é:
   
      Require valid-user
      AuthBasicProvider file
      AuthType Basic
      AuthName "Login"
      AuthUserFile /var/www/sistema/.htpasswd
   

   ServerAdmin noc@remontti.com.br
   DocumentRoot /var/www/sistema
 
   # Sem permissões será redirecionada para
   ErrorDocument 403 http://www.remontti.com.br
 
   
      Options FollowSymLinks
      AllowOverride All
 
      Require all denied
      
         
            Require ip 45.80.51.0/29 2804:f123:bebe:coca::/64
         
         
            Require valid-user
            AuthBasicProvider file
            AuthType Basic
            AuthName "Login"
            AuthUserFile /var/www/sistema/.htpasswd
         
      
 
    

   ErrorLog ${APACHE_LOG_DIR}/error_sistema.log
   CustomLog ${APACHE_LOG_DIR}/access_sistema.log combined

Por segurança recomendo remover a assinatura do servidor, evitando os "espertinhos"

# sed -i 's/ServerTokens OS/ServerTokens Prod/' /etc/apache2/conf-available/security.conf
# sed -i 's/ServerSignature On/ServerSignature Off/' /etc/apache2/conf-available/security.conf
# a2ensite sistema
# systemctl restart apache2

Que tal usar o letsencrypt e ter certificado valido para seus hosts?
Faça a instalação do letsencrypt

# apt install letsencrypt python-certbot-apache

Antes de gerar nossa configuração pare o apache

# systemctl stop apache2

Altere www.remontti.com.br para SEU.DOMINIO!

# letsencrypt --authenticator standalone --installer apache -d www.remontti.com.br

Você pode rodar também o comando:

# letsencrypt

O mesmo vai verificar todos os domínios virtuais e lheperguntar para quais você deseja gerar certificado!

Dica, se desejar desativar o TLS1.0 e TLS1.1 após criar um certificado um arquivo é criado /etc/letsencrypt/options-ssl-apache.conf, então edite e inclua no SSLProtocol TLSv1 -TLSv1.1

# vim /etc/letsencrypt/options-ssl-apache.conf

Ficando

#SSLProtocol            all -SSLv2 -SSLv3
SSLProtocol             all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

Reinicie o Apache:

# systemctl restart apache2

Para testar acesse: https://www.cdn77.com/tls-test/

Gostou?

Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento!

Se não puder doar pode deixar seu agradecimento nos comentário também ficarei feliz em saber que ajudei. Se tiver qualquer pergunta deixe-a também. Se preferir entrar em Contato clique aqui.

Abraço!

Fonte:
https://httpd.apache.org/docs/2.4/howto/

Rudimar Remontti

Trabalho atualmente como Gerente de Redes em um Provedor de Internet no Rio Grande do Sul.

Você pode gostar...

23 Resultados

  1. Clelson Ribeiro disse:

    Excelente tutorial Rudimar, vc é top!!!

  2. Léo de Oliveira Camargo disse:

    Ola
    Existe uma forma de redirecionar para um porta diferente? Por ex: tenho um parte do sistema que roda na porta 80 e outra que roda na porta 8080
    quero redirecionar o serviço1.dominio.com.br para o 8080 e o dominio.com.br para o 80

  3. Cleiton disse:

    Boa Tarde, posso apontar para o meu localhost ao invés de um IP público ?

  4. carlos disse:

    Show. valeu cara.

  5. Willian disse:

    Fiz conforme mencionou para ter vários sites no mesmo ip local interno…. Mas no meu caso, queria algo do tipo
    192.168.50.210 – cai na pagina do apache (normal)
    192.168.50.210/banana (gostaria que mostrasse o site que está nesse diretório)
    192.168.50.210/manga (iria para o outro site)
    E assim sucessivamente…
    No servidor só instalei o debian, apache, php e mariadb… Apache OK
    Na rede local tem um servidor windows que responde como AD….
    Quando digito no navegador da minha máquina o IP do debian 192.168.50.210 apresenta a página do Apache ok, mas as outras que criei conforme seu exemplo acima não acontece nada… O que estou fazendo de errado ?

  6. Olá Rudimar Remontti,

    Uma duvida, quando tem certificado digital, quando entro por exemplo no http://www.remontti.com.br ele vai para pagina principal do apache, para funcionar eu tenho que digitar https://www.remontti.com.br.

    Minha duvida é como fazer o redirecionamento para o https pelo apache. Poderia me ajudar?

  7. Paulo Carvalho disse:

    Uma dúvida meio besta, é possível fazer o não responder quando eu colocar o IP (v4 e v6) do servidor? Tentei desativar tudo que era possível mas, quando coloco o IP do servidor sempre tem alguma resposta.

    PS: Meu server está rodando o zabbix instalado por pacotes (a instalação que subiu o apache).

  8. Douglas disse:

    Olá!
    Encontrei um erro…
    Primeiramente, quero dizer que faço de acordo com o passo a passo desde a instalação limpa do Debian 10 –> LAMP –> aqui.
    Depois do comando a2ensite www, evoquei o comando systemctl reload apache2, e apareceu uma mensagem de erro. O comando systemctl status apache2.service, acusou problema no documento /etc/apache2/apache2.conf na linha escrita: IncludeOptional sites-enabled/*.conf . O que tem que alterar???

  1. 13 de janeiro de 2020

    […] também configurar nosso domínio virtual para acessar o servidor via domínio (ex vbox.remontti.com.br) e restringir ele apenas para nossos […]

  2. 23 de janeiro de 2020

    […] seu servidor web configurado, seria bacana criar um host no seu dns e configurar nesse seu servdor web um domínio virtual ex.: log6.seudominio.com.br onde você irá jogar os arquivos do projeto. Mas como muitos não tem […]

  3. 28 de março de 2020

    […] colocar o projeto no diretório padrão do apache /var/www/html/, mas você pode criar um domínio virtual para isso ficar muito mais legal e ainda criar um certificado gratuitamente com o Let’s […]

  4. 1 de abril de 2020
  5. 25 de julho de 2020

    […] de configuração do Apache2 com um domínio virtual utilizando o Let’s Encrypt para criptografar nossa conexão […]

  6. 25 de agosto de 2020

    […] Para nosso exemplo crie um domínio virtual nas configurações do apache. Lei mais em: Como ter diversos sub/domínios no mesmo servidor? (Domínios virtuais com Apache2) […]

  7. 13 de março de 2021

    […] recomendadas: Como ter diversos sub/domínios no mesmo servidor? Passo-a-passo como criar um servidor WEB Servidor DNS seguro com Bind9 Crie um subdomínio em […]

  8. 6 de abril de 2021

    […] “/”);) em config.php, se você colocou no diretório raiz ou configurou um domínio virtual (recomendo) para o phpipam não é necessário […]

  9. 10 de dezembro de 2021

    […] Para você aprender mais como o apache funciona recomendo: Como ter diversos sub/domínios no mesmo servidor […]

  10. 6 de fevereiro de 2023

    […] também configurar nosso domínio virtual para acessar o servidor via domínio (ex vbox.remontti.com.br) e restringir ele apenas para nossos […]

  11. 20 de fevereiro de 2023

    […] também configurar nosso domínio virtual para acessar o servidor via domínio (ex vbox.remontti.com.br) e restringir ele apenas para nossos […]

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *