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
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.
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 ErrorLog ${APACHE_LOG_DIR}/error_sistema.log CustomLog ${APACHE_LOG_DIR}/access_sistema.log combined 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 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 apache2Que tal usar o letsencrypt e ter certificado valido para seus hosts?
Faça a instalação do letsencrypt# apt install letsencrypt python-certbot-apacheAntes de gerar nossa configuração pare o apache
# systemctl stop apache2Altere www.remontti.com.br para SEU.DOMINIO!
# letsencrypt --authenticator standalone --installer apache -d www.remontti.com.brVocê pode rodar também o comando:
# letsencryptO 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.confFicando
#SSLProtocol all -SSLv2 -SSLv3 SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1Reinicie o Apache:
# systemctl restart apache2Para 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!
Excelente tutorial Rudimar, vc é top!!!
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
Boa Tarde, posso apontar para o meu localhost ao invés de um IP público ?
Show. valeu cara.
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 ?
Neste caso não precisa mexer nas configurações do apache, basta colocar cada site ou projeto em uma pasta diferente dentro da /var/www/html/
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?
Adiciona dentro do seu virtualhost:
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).
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???
Provavelmente o arquivo http://www.conf que voce criou tem alguma linha errada, no log, ou ate mesmo no status do serviço pode estar dizendo qual linha é.
Comparando o /etc/apache2/sites-enabled/000-default.conf com o arquivo /etc/apache2/sites-available/www.conf , ficou assim:
ServerName (domínio) – Ativei nos dois arquivos, ou seja, no 000-default.conf eu tirei o argumento.
ServerAdmin – webmaster@localhost – Não alterei
Pode ser o fato de ter mantido o ServerAdmin?
E o ServerAlias, eu criei no http://www.conf apenas.