Apache — para quem tem pressa

Rodrigo Vieira
OperacionalTI
Published in
5 min readSep 9, 2016

Neste post irei abordar a instalação do servidor web Apache no CentOS 7 com o objetivo de:

  • servir páginas estáticas e dinâmicas em PHP.
  • hospedar diferentes sites através de VirtualHosts.
  • servir páginas através de criptografia SSL com chaves auto-assinadas.
  • listar arquivos em uma pasta, após autenticar o usuário.

Instalação

yum install httpd mod_ssl lynx# Ativando o apache para subir durante o boot.
systemctl enable httpd
# Inicia o servidor web apache
systemctl start httpd
# Verifica se o apache está no ar
systemctl status httpd
# Tenta conectar na porta padrão do apache
telnet localhost 80
# Usa um navegador em modo texto para testar nosso servidor
lynx localhost

Por padrão o Apache irá servir os arquivos colocados no diretório /var/www/html. Portanto, basta colocar nesta pasta seus arquivos .html que ao acessar o endereço IP ou hostname do seu servidor, através de um browser, eles serão exibidos.

No entanto, se você deseja hospedar múltiplos sites no mesmo servidor, ou mesmo sites dinâmicos, serão necessárias alguma configurações adicionais relacionadas a VirtualHosts e ao módulo mod_php.

VirtualHost

Para que o Apache saiba redirecionar a requisição recebida a diretórios específicos, de acordo com o hostname requisitado, é necessário criar um arquivo de configuração para cada VirtualHost.

Por exemplo, para atender requisições ao endereço http://rodrigovieira.com, redirecionando-as para a pasta /var/www/rodrigovieira/public, temos que criar o arquivo com as configurações deste VirtualHost, preferencialmente em /etc/httpd/conf.d/rodrigovieira.com.conf, com o seguinte conteúdo:

# /etc/httpd/conf.d/rodrigovieira.com.conf<VirtualHost *:80>
ServerAdmin rodrigodelimavieira@gmail.com
DocumentRoot /var/www/rodrigovieira.com/public
ServerName rodrigovieira.com
ServerAlias www.rodrigovieira.com
ErrorLog logs/rodrigovieira.com-error_log
CustomLog logs/rodrigovieira.com-access_log common
</VirtualHost>

E então, no diretório /var/www/rodrigovieira/public, podemos criar os arquivos do website estático. Vamos criar um simples "index.html" para simular o site:

# /var/www/rodrigovieira/public/index.html<h1>Rodrigo Vieira</h1>

Após fazer qualquer alteração nas configurações do Apache, é necessário recarregar o daemon:

systemctl reload httpd

Para acessar www.rodrigovieira.com do seu navegador, você deve ter configurado um DNS que reponda por este domínio ou emular colocando a seguinte entrada no seu /etc/hosts:

54.84.6.121    rodrigovieira.com

Substitua 54.84.6.121 pelo IP do seu servidor Apache. Para usuários windows o arquivo em questão deve ser o C:\WINDOWS\system32\drivers\etc\hosts.

VirtualHost com SSL — HTTPS

Irei criar um novo VirtualHost, ativando o SSL e especificando os arquivos do certificado digital e da chave criptográfica. Podemos fazer isso em um novo arquivo ou no próprio arquivo onde criamos o VirtualHost para rodrigovieira.com:

# /etc/httpd/conf.d/rodrigovieira.com.conf<VirtualHost *:443>
ServerAdmin rodrigodelimavieira@gmail.com
DocumentRoot /var/www/rodrigovieira.com/public
ServerName rodrigovieira.com
ServerAlias www.rodrigovieira.com
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

</VirtualHost>

A maior parte do arquivo permanece a mesma, os trechos relacionados ao SSL estão em destaque.

Tenha em mente que os arquivos localhost.crt e localhost.key foram criados ao instalar o pacote mod_ssl. Podemos definir novos certificados auto-assinados, comprar certifidados válidos para o domínio ou utilizar o https://letsencrypt.org para conseguir certificados válidos gratuitos.

Gerando certificados e chaves auto-assinados

Basta executar o comando abaixo e utilizar os arquivos "rodrigovieira.crt" e "rodrigovieira.key" respectivamente nos parâmetros SSLCertificateFile e SSLCertificateKeyFile do VirtualHost SSL definido acima.

openssl req -x509 -nodes -days 365 -newkey rsa:2048  \
-out /etc/pki/tls/certs/rodrigovieira.crt \
-keyout /etc/pki/tls/private/rodrigovieira.key

Recarregue as configurações do servidor web Apache e teste:

systemctl restart httpd# acesse https://rodrigovieira.com a partir do seu browser.
# não se esqueça de configurar o /etc/hosts, como mencionado acima.

Listando conteúdo de uma pasta

Imagine que precisamos de um meio simples para compartilhar arquivos na Internet. Podemos utilizar o Apache, colocar os arquivos desejados em uma pasta, sob um VirtualHost ou não, e configurar o servidor web para listar e servir tais arquivos.
Vamos criar o diretório "files" sob o VirtualHost "rodrigovieira.com" para que o Apache liste qualquer arquivo colocado nesta pasta e possibilite o seu download:

# /etc/httpd/conf.d/rodrigovieira.com.conf<VirtualHost *:443>
ServerAdmin rodrigodelimavieira@gmail.com
DocumentRoot /var/www/rodrigovieira.com/public
ServerName rodrigovieira.com
ServerAlias www.rodrigovieira.com
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/rodrigovieira.crt
SSLCertificateKeyFile /etc/pki/tls/private/rodrigovieira.key
<Directory "/var/www/rodrigovieira.com/public/files">
Options +Indexes
</Directory>

</VirtualHost>

Repare que as configurações foram adicionadas sob o VirtualHost SSL, dessa forma o acesso aos arquivos disponibilizados em "files" terá o tráfego criptografado. No entanto, do jeito que está, qualquer um de qualquer lugar da Internet terá acesso a esses arquivos. A seguir, vamos aprender a restringir o acesso aos arquivos dessa pasta através de um login/senha.

Restringindo acesso a uma pasta

Precisamos criar o arquivo que irá armazenar os usuários e senhas utilizados pelo Apache, para permitir o acesso a pasta "files".

htpasswd -c /var/www/.htpasswd rodrigo
htpasswd /var/www/.htpasswd ana

O parâmetro "-c" só é necessário a primeira vez, para criar o arquivo.
A seguir temos que adicionar algumas configurações para informar ao Apache que o acesso a pasta "files" deve ser protegido:

# /etc/httpd/conf.d/rodrigovieira.com.conf<Directory "/var/www/rodrigovieira.com/public/files">
Options +Indexes
AuthType Basic
AuthName "Acesso Restrito:"
AuthUserFile /var/www/.htpasswd
Require valid-user

</Directory>

Recarrege as configurações do Apache e teste o acesso à url https://www.rodrigovieira.com/files. Não se esqueça de copiar ou criar alguns arquivos no diretório /var/www/rodrigovieira.com/public/files.

Servindo sites dinâmicos — PHP

Primeiramente, não existe só uma forma de servir sites dinâmicos através do Apache. Neste post vou utilizar o mod_php, mas poderíamos usar CGI ou php-fpm:

yum install mod_php

Agora basta criar um novo VirtualHost e colocar o site php em seu DocumentRoot. Ou usar o que criamos anteriormente e escrevendo o seguinte arquivo de teste:

# /var/www/rodrigovieira.com/public/index.php<?php
phpinfo();

Nota1: eu não esqueci de fechar a tag do php. Esta é uma boa prática.
Nota2: talvez seja necessário desativar o SELinux:

setenforce 0

Ou então adicionar o diretório onde estão os scripts PHP ao tipo de contexto httpd_sys_script_exec_t:

sudo chcon -Rv --type=httpd_sys_script_exec_t /var/www/rodrigovieira

Resolvendo Problemas

Qualquer SysAdmin com um mínimo de experiência sabe que o melhor lugar para buscar a solução para o seus problemas é nos arquivos de log.

Log Files

O Apache possui dois arquivos de log principais:

  • error log: armazena mensagens de erro do Apache que ocorrem durante sua inicialização e leitura das configurações. Pode ser genérico /var/log/httpd/error_log ou específico a um VirtualHost, como /var/log/httpd/rodrigovieira.com-error_log.
  • access log: armazena mensagens do Apache ao responder requisições web, inclusive dos acesso que ele não consegue responder. Pode ser genérico /var/log/httpd/access_log ou específico a um VirtualHost, como /var/log/httpd/rodrigovieira.com-access_log.

O formato das mensagens do access_log, podem ser definidas conforme a necessidade do SysAdmin. Já o error_log não pode ser personalizado.
Procure pelo seguinte trecho no arquivo de configuração principal do Apache:

# /etc/httpd/conf/httpd.confLogFormat "%h %l %u %t \"%r\" %>s %b" common

Este trecho define um padrão nomeado de "common", sendo seu formato composto pelos seguintes items:

  • %h: hostname remoto.
  • %l: logname remoto. A partir do identd, se disponibilizado.
  • %u: usename remoto. Se o usuário estiver autenticado.
  • %t: data hora e timezone.
  • "%r": primeira linha da requisição (entre aspas).
  • %>s: status final da requisição.
  • %b: tamanho da resposta.

Depois de definido o formato e dado um nome para ele, no caso "common", podemor utilizá-lo dentro de uma configuração de VirtualHost, como no caso do rodrigovieira.com, na seguinte linha:

CustomLog logs/rodrigovieira.com-access_log common

Espero ter ajudado. Dúvidas, críticas e sugestões para próximos posts, sintam-se livres para comentar.

Gostou? Então recomende.

Obrigado.

--

--