Muitas vezes você contrata um VPS (Virtual Private Server) e coloca uma aplicação lá para rodar. Pode ser que essa aplicação comece a crescer e você precisa criar novos módulos ou então decide adicionar novas aplicações, eis então que surge a necessidade da configuração de subdomínios.
Nesse artigo, vou descrever a minha experiência configurando um subdomínio HTTPS e veremos todos os passos para fazer a configuração. Todo o processo realizado neste artigo foi feito no Apache 2.4 rodando no Ubuntu 16.04.
Configuração DNS
Primeiramente, precisamos ir no gerenciador de DNS do nosso domínio e configurar o subdomínio para apontar para nosso servidor. No meu caso, o domínio está sendo gerenciado pela Digital Ocean, porém o conceito é o mesmo para qualquer outro gerenciador de DNS.
Criamos um registro tipo A com o nome do subdomínio que irá direcionar para o IP do nosso servidor. Criamos também um registro do tipo CNAME para que o sufixo www também funcione nesse subdomínio.
Repare que tanto o domínio quanto o subdomínio apontam para o IP nosso servidor. Quando a conexão chegar lá, o Apache vai decidir qual página carregar de acordo com o endereço e as configurações de Virtual Host definidas, assim como exemplificado na Imagem 2.
Criação da pasta do subdomínio
O próximo passo é a criação da pasta raiz dos arquivos para este subdomínio. Para isso, vamos abrir um terminal e acessar nosso servidor via SSH.
ssh rafael@rafaelcouto.com.br
Agora vamos criar a nossa pasta e definir as permissões básicas.
# Entrando na pasta padrão dos arquivos do apache cd /var/www # Criando pasta do subdomínio sudo mkdir subdominio # Mudando o dono do diretório para meu usuário e para o grupo padrão do apache sudo chown -R rafael:www-data subdominio
E para verificarmos se o subdomínio está funcionando, vamos adicionar um arquivo index.html.
# Entrando na pasta que criamos cd /var/www/subdominio # Criando arquivo nano index.html
Estou utilizando o nano como editor, porém você pode utilizar o vim ou qualquer editor de sua preferência. Vamos então colocar o conteúdo no arquivo, depois basta pressionar CTRL+X e depois Y para salvar.
<!DOCTYPE html> <html lang="pt-br"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Subdomínio</title> </head> <body> <h1>Subdomínio está funcionando!</h1> </body> </html>
Arquivo de configuração
O próximo passo é criar um Virtual Host no Apache, para isso vamos criar um arquivo que irá conter a configuração do nosso subdomínio.
# Entrando na pasta padrão dos sites do apache cd /etc/apache2/sites-available # Criando arquivo de configuração sudo nano subdominio.conf
E então vamos colocar a configuração no arquivo.
<VirtualHost *:80> ServerName subdominio.rafaelcouto.com.br ServerAlias www.subdominio.rafaelcouto.com.br ErrorLog ${APACHE_LOG_DIR}/subdominio.error.log CustomLog ${APACHE_LOG_DIR}/subdominio.access.log combined DocumentRoot /var/www/subdominio <Directory /var/www/subdominio> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost>
- Linha 1: O Apache irá considerar o grupo de diretivas dentro desse bloco para qualquer IP (*) que venha na porta 80, que é a porta padrão do HTTP;
- Linha 3: O ServerName é o identificador do endereço do subdomínio. É através dessa diretiva que o Apache vai saber que deve utilizar essas configurações;
- Linha 4: O ServerAlias permite definir endereços alternativos para o endereço base, no caso definimos o www;
- Linha 6 e 7: Definimos o caminho dos arquivos de log desse subdomínio. No caso, o valor padrão da variável
${APACHE_LOG_DIR}
é o caminho/var/log/apache2
; - Linha 9: O DocumentRoot indica o caminho dos arquivos que serão visíveis na web. Se nossa aplicação fosse Laravel, por exemplo, você poderia colocar
/var/www/subdominio/public
; - Linha 11: Definimos algumas configurações adicionais para o diretório;
- Linha 12: Indica se o diretório pode ser um link simbólico. Poderíamos, por exemplo, colocar o projeto na pasta do nosso usuário
/home/rafael/subdominio
e então criar apenas um link simbólico no/var/www/subdominio
apontando para ela; - Linha 13: O AllowOverride nos permite definir as diretivas que podem ser utilizadas no arquivo .htaccess. Como utilizamos All, qualquer diretiva poderá ser utilizada;
- Linha 14: Indica que qualquer requisição será permitida.
Ativando e testando
Por fim, basta nós ativarmos nosso arquivo de configuração.
# Ativando o site no Apache sudo a2ensite subdominio.conf # Reiniciando serviço do Apache sudo service apache2 restart
Pronto, dessa forma se você acessar o endereço do subdomínio, já deveria estar funcionando, porém sem HTTPS. Caso não esteja funcionando, não se desespere! Pode ser que o DNS ainda não foi propagado. Então antes de sair mexendo nas configurações, aguarde um pouco, não costuma demorar muito.
Agora que já temos o nosso subdomínio funcionando, veremos como habilitar o HTTPS.
Habilitando o HTTPS
Você pode utilizar o subdomínio sem HTTPS, porém não é nada recomendado. Com o protocolo HTTPS todo o tráfego entre o cliente e o servidor é criptografado, provendo uma segurança extra para sua aplicação.
Para habilitar o HTTPS precisamos de um certificado que é disponibilizado por uma Autoridade Certificadora. Uma das mais conhecidas é o Let’s Encrypt, com ele é possível emitir e instalar um certificado de forma simples e de graça. E para isso, o Let’s Encrypt disponibiliza um cliente chamado Certbot. Então, antes de qualquer coisa, vamos instalá-lo.
# Adicionando repositório no Ubuntu # Pressione ENTER após rodar o comando sudo add-apt-repository ppa:certbot/certbot # Atualizando pacotes sudo apt-get update # Instalando o pacote Apache do Certbot sudo apt install python-certbot-apache
Pronto, agora basta rodar o comando para instalar os certificados e configurar o Apache.
sudo certbot --apache -d subdominio.rafaelcouto.com.br -d www.subdominio.rafaelcouto.com.br
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. ------------------------------------------------------------------------------- 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. ------------------------------------------------------------------------------- Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
O Certbot irá perguntar se você deseja redirecionar as requisições HTTP para HTTPS. É recomendado que você selecione a segunda opção (Redirect), para evitar que os usuários acessem o endereço HTTP por engano.
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/subdominio.rafaelcouto.com.br/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/subdominio.rafaelcouto.com.br/privkey.pem Your cert will expire on 2020-08-04. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
Se tudo der certo, o Certbot irá gerar os arquivos de certificado nos locais indicados, criar o arquivo /etc/apache2/sites-available/subdominio-le-ssl.conf
, ativá-lo e editar o arquivo /etc/apache2/sites-available/subdominio.conf
adicionando o redirecionamento.
Basta acessar o endereço agora para verificar se deu tudo certo.
Configuração manual (Opcional)
Se por algum motivo o Certbot gerar o certificado, porém não criar o arquivo de configuração, você pode criá-lo manualmente.
sudo nano /etc/apache2/sites-available/subdominio-le-ssl.conf
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName subdominio.rafaelcouto.com.br ServerAlias www.subdominio.rafaelcouto.com.br ErrorLog ${APACHE_LOG_DIR}/subdominio.error.log CustomLog ${APACHE_LOG_DIR}/subdominio.access.log combined DocumentRoot /var/www/subdominio <Directory /var/www/subdominio> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /etc/letsencrypt/live/subdominio.rafaelcouto.com.br/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/subdominio.rafaelcouto.com.br/privkey.pem </VirtualHost> </IfModule>
É basicamente o mesmo arquivo que definimos anteriormente, com alguns ajustes:
- Linha 1: No caso do HTTPS, utilizamos a porta 443 por padrão;
- Linha 18 a 20: Incluímos as configurações padrões do Let’s Encrypt e indicamos os caminhos do certificado e da chave que foram gerados pelo Certbot.
E caso necessário, adicionar o redirecionamento na configuração HTTP.
sudo nano /etc/apache2/sites-available/subdominio.conf
<VirtualHost *:80> ServerName subdominio.rafaelcouto.com.br ServerAlias www.subdominio.rafaelcouto.com.br ErrorLog ${APACHE_LOG_DIR}/subdominio.error.log CustomLog ${APACHE_LOG_DIR}/subdominio.access.log combined DocumentRoot /var/www/subdominio <Directory /var/www/subdominio> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> RewriteEngine on RewriteCond %{SERVER_NAME} =subdominio.rafaelcouto.com.br [OR] RewriteCond %{SERVER_NAME} =www.subdominio.rafaelcouto.com.br RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] </VirtualHost>
- Linha 17: Habilitamos o RewriteEngine que nos permite sobrescrever URLs;
- Linha 18 e 19: Com o RewriteCond definimos as condições da nossa sobrescrita, ou seja, se o endereço base for subdominio.rafaelcouto.com.br ou www.subdominio.rafaelcouto.com.br, será executada a regra adiante.
- Linha 20: O RewriteRule permite executar uma ação se as condições definidas anteriormente forem verdadeiras, no caso redirecionamos para o mesmo endereço, porém com o protocolo
https://
.
Por fim, basta ativar o subdomínio HTTPS e reiniciar o Apache.
# Ativando o site HTTPS no Apache sudo a2ensite subdominio-le-ssl.conf # Reiniciando serviço do Apache sudo service apache2 restart
Renovação do certificado
Os certificados gerados pela Let’s Encrypt tem validade de 90 dias. Entretanto, o Certbot já configura uma rotina para renovação automática dos certificados. Esse script fica localizado em /etc/cron.d
e faz a verificação duas vezes por dia, renovando qualquer certificado que expire dentro de 30 dias.
Caso você queira testar o processo de renovação, basta rodar o comando abaixo.
sudo certbot renew --dry-run
Conclusão
Neste artigo, tentei detalhar a minha experiência na criação de um subdomínio HTTPS. Apesar desse procedimento ter sido feito no Ubuntu, o processo é o mesmo para qualquer distribuição Linux, você só terá que adaptar os comandos.
Caso você utilize Nginx ao invés de Apache, terá que criar um Server Block (equivalente ao Virtual Host) para configuração do subdomínio. E terá que adaptar os comandos do Certbot, porém todo o conceito é o mesmo.
Lembrando também que todo esse processo serve para domínios. Caso você tenha mais de um domínio apontando para a mesma VPS, poderá fazer esse mesmo processo para o novo domínio.
Espero que de alguma forma este artigo tenha sido útil para que você, até a próxima.
Referências
- How To Set Up Apache Virtual Hosts on Ubuntu 16.04 <https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-ubuntu-16-04>. Acesso em 06 de maio de 2020.
- How To Secure Apache with Let’s Encrypt on Ubuntu 16.04 <https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-16-04>. Acesso em 06 de maio de 2020.
- Apache Core Features. <https://httpd.apache.org/docs/2.4/mod/core.html>. Acesso em 07 de maio de 2020.