Administração de Redes GNU/Linux/Web: Serviço WWW

Estaremos neste capítulo tratando o Servidor Web Apache, que fornece serviços através do protocolo HTTP, o protocolo que disponibiliza páginas na Internet.

<img src="%ATTACHURLPATH%/pag_289a.jpg" alt="pag_289a.jpg" width="609" height="268" />

Obs.: O conteúdo deste capítulo está sendo migrado de: http://wiki.marceloakira.com/bin/view/GrupoLinux/ArtigoServidorWeb

Servidor Web

editar

A principal função de um servidor web é disponibilizar dados, podendo ser imagens, vídeo, áudio, ou arquivos em geral. Estes dados são passados para os clientes de forma que estes possam exibir as informações. O cliente de um Servidor Web é o browser (por exemplo, temos: Internet Explorer, Netscape Navigator, Opera, Lynx, Mozilla) e o formato entendido por estes é o HTML - <nop>HyperText Markup Language, a linguagem utilizada para formatar e definir páginas da Internet.

O servidor web utiliza-se do protocolo HTTP - <nop>HyperText Transport Protocol - , o protocolo mais conhecido da Internet , que utiliza-se de hiper-textos, que são textos com referências (links) que levam a outros textos, formando uma teia [web] de páginas interligadas, daí vem o nome WWW que significa World Wide Web [Grande Teia Mundial].

A Internet veio a se tornar tão conhecida e popular graças aos servidores web. Por exemplo, quando digitamos em um browser www.sistemasabertos.com.br estamos fazendo uma requisição a uma máquina (www.sistemasabertos.com.br) que é o servidor web do domínio sistemasabertos.com.br.

%T% quanto a forma de interação do cliente com o Servidor, podemos citar duas formas:

  • dinâmica: o usuário do browser cliente interage com o servidor enviando dados como formulários por exemplo, o servidor processa os dados (geralmente com acesso a banco de dados) e envia a resposta para o cliente.
  • estática: o usuário do browser cliente interage com o servidor apenas solicitando páginas.

A WWW (World Wide Web)

editar

A World Wide Web é a estrutura pela qual conseguimos acessar documentos espalhados por todo mundo na Internet. Em seus primórdios, os documentos eram formados somente de texto, mas com o tempo foi-se agregando figuras (jpeg, gif, etc), animações gráficas (Macromedia® flash, gifs animados, etc), áudio (.au, .wav, .MP3, etc), vídeo (MPEG, divx, etc), desta maneira, os documentos tornaram-se mais poderosos e de interface mais amigável, repercutindo em sua enorme popularidade atual.

A WWW, que é também conhecida como Web, nasceu em 1989 no CERN, o Centro Europeu para Pesquisa Nuclear, advinda da necessidade de fazer com que os grupos de pesquisadores de diferentes nacionalidades pudessem colaborar uns com os outros através de documentos como: relatórios, trabalhos, fotos, entre outros.

Dentro da vertente cliente/servidor, temos como cliente, o browser [navegador]; no lado servidor temos processos servidores que escutam a porta 80 do protocolo TCP, aguardando por solicitações de clientes. Devido à principal funcionalidade do protocolo - a de servir conteúdo aos clientes - este se baseia em solicitação e resposta através de conexões temporárias com duração suficiente para solicitar o conteúdo e baixar o conteúdo solicitado (resposta). Este protocolo baseado em solicitação e resposta é o HTTP.

Para compreendermos melhor este protocolo, vejamos um exemplo. Suponha o seguinte: um cliente utilizando-se de um navegador digita no campo de endereço a seguinte URL - Uniform Resource Locator - http://www.sistemasabertos.com.br/jpaulo/apostilarede.html. Veja abaixo a sequência dos procedimentos que se seguem:

<img src="%ATTACHURLPATH%/pag_291a.jpg" alt="pag_291a.jpg" width="582" height="279" />
Fig. 1 - Procedimento de acesso ao Servidor Web.


  • 1.O navegador pergunta ao DNS: Qual é o endereço IP de www.sistemasabertos.com.br?
  • 2.O DNS responde: o endereço IP é 200.163.79.1.
  • 3.O navegador estabelece uma conexão com a máquina 200.163.79.1 na porta 80 através do protocolo HTTP.
  • 4.Em seguida, o navegador envia um comando HTTP:
GET /jpaulo/apostilarede.html
  • 5.O servidor www.sistemasabertos.com.br envia o arquivo apostilarede.html para o cliente.
  • 6.O navegador, uma vez de baixar o arquivo solicitado, apresenta e formata o arquivo HTML apostilarede.html

O Apache

editar

O servidor apache é o servidor Web mais popular no mundo devido ao seu desempenho, portabilidade, flexibilidade e baixo custo.

O Apache foi desenvolvido a partir do servidor Web mais popular antigamente, chamado o daemon httpd, de domínio público e desenvolvido por Rob <nop>McCool no NCSA - Nacional Centre for Supercomputing Aplications. O desenvolvimento deste servidor Web estagnou-se quando seu autor deixou a NCSA. A partir deste momento, vários voluntários (webmasters) que conheciam o daemon httpd se interessaram em dar seguimento ao projeto. Estes colaboradores formaram o que é chamado de Projeto Apache . Em menos de um ano de trabalho, o servidor Apache, em sua versão 1.0 lançada em abril de 1995, superou o servidor httpd da NCSA, tornando o Servidor Web mais utilizado na Internet.

Desde então, várias versões foram lançadas, hoje a mais utilizada é a versão 1.3, da qual iremos tratar neste documento. Recentemente foi publicada uma nova versão 2.0, com várias novas funcionalidades, algumas em testes, porém a versão 1.3 não foi abandonada, recebendo ainda atenção para correções. Para maiores detalhes ver: http://httpd.apache.org.

Instalando o Apache

editar

<img src="%ATTACHURLPATH%/pag_292a.jpg" alt="pag_292a.jpg" width="436" height="119" />
Fig. 2 - Característica do Servidor Web Apache.


Há basicamente duas formas gerais que podem ser utilizadas para instalar o Apache. Através de pacotes ou compilando-se o código fonte.

Instalando o Apache via pacotes

editar

Utilizaremos como primeiro exemplo o Conectiva Linux e a ferramenta RPM . Existem principalmente 3 pacotes RPM para instalação, que podem ser encontrados no endereço ftp.conectiva.com.br através de ftp, e que também estão no cdrom número 1 do Conectiva 7.0. Para verificar se o Apache está instalado execute:

#rpm -q apache

Se o apache não estiver instalado, use a opção -ivh para instalá-lo.

#rpm -ivh apache*
apache      ###########################################################
apache-devel      ###########################################################
apache-doc      ###########################################################  

O pacote apache-devel contém os arquivos de cabeçalho (arquivos include) do apache, necessários para sua recompilação, assim como o utilitário apxs, utilizado na compilação de módulos dinâmicos (DSO). O apache-doc contém toda documentação relacionada.

Instalando o apache via código fonte

editar

O código fonte do apache pode ser encontrado no endereço http://www.apache.org/dist/httpd. Vejamos:

#cp apache_1.3.19.tar.gz /usr/local/src
#cd /usr/local/src
#./configure --prefix=/usr/local/apache_1.3.19
#make
#make install
#ln -s /usr/local/apache_1.3.19 /usr/local/apache

A opção --prefix em ./configure, indica qual é o diretório raiz do servidor apache, sobre o qual será criada toda árvore de diretórios, inclusive com todos os arquivos de configuração, binários, etc; no nosso caso, se localizará em /usr/local/apache_1.3.19. O comando make compila o código fonte do apache e o comando make install copia os arquivos gerados para a árvore de diretórios criados em /usr/local/apache_1.3.19. O último comando é para se criar um link simbólico para a versão previamente instalada, tornando mais fácil referenciá-la depois, pois é mais fácil lembrar de /usr/local/apache do que /usr/local/apache_1.3.19.

Para maiores informações veja o arquivo INSTALL que acompanha o pacote apache_1.3.19.tar.gz.

%DEBIAN% %PASSO% Instalando o apache no DEBIAN %PASSO% Utilizando a ferramenta apt, podemos escolher entre instalar o apache ou o apache2

lab152:/etc/network# apt-get install apache
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
apache-common apache2-utils libapr0
Suggested packages:
apache-doc apache-ssl apache-perl
The following NEW packages will be installed:
apache apache-common apache2-utils libapr0
0 upgraded, 4 newly installed, 0 to remove and 384 not upgraded.
Need to get 1443kB of archives.
After unpacking 4359kB of additional disk space will be used.
Do you want to continue? [Y/n] n

lab152:/etc/network# apt-get install apache2
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
apache2-common apache2-mpm-worker apache2-utils libapr0 openssl ssl-cert
Suggested packages:
apache2-doc lynx www-browser ca-certificates
The following NEW packages will be installed:
apache2 apache2-common apache2-mpm-worker apache2-utils libapr0 openssl ssl-cert
0 upgraded, 7 newly installed, 0 to remove and 384 not upgraded.
Need to get 2170kB of archives.
After unpacking 5254kB of additional disk space will be used.
Do you want to continue? [Y/n]

Conceitos essenciais

editar

<img src="%ATTACHURLPATH%/pag_294a.jpg" alt="pag_294a.jpg" width="606" height="319" />
Fig. 3 - Representação esquemática de endereçamento de recursos através de URL.


A URL - Uniform Resource Locator - é utilizado para acessarmos um determinado conteúdo em uma máquina específica. A URL é composta do endereço de host, podendo ser especificado pelo seu nome ou o endereço IP; o caminho completo para o arquivo e o protocolo que será utilizado na comunicação com o servidor. Os protocolos mais utilizados são:

*Protocolo* *Descrição*
http Protocolo utilizado para acessar páginas HTML na Internet.
file Usado para acessar arquivos na máquina local.
ftp Utilizado para transferir arquivos.
telnet Utilizado como terminal remoto, ou seja, login remoto.
news Utilizado pelos servidores de Notícias da Internet. Este protocolo permite que clientes acessem artigos de newsgroups como se fosse páginas da internet.

Em uma URL você pode ainda especificar uma porta específica de acesso, por exemplo:

http://www.sistemasabertos.com.br:1333/teste.html

Neste caso, estamos fazendo uma solicitação na porta 1333 de www.sistemasabertos.com.br através do protocolo http e requerendo o conteúdo do arquivo teste.html. Quando esta porta não é especificada, o navegador acessa o conteúdo na porta padrão 80. Vejamos agora um exemplo de uso do protocolo ftp:

ftp://lab12.sistemasabertos.com.br/pub/README.TXT

Este último exemplo é muito utilizado na Internet para se especificar arquivos disponíveis publicamente para download. Apesar dos navegadores, terem serem criados com o objetivo de usar basicamente o protocolo HTTP, foi-se agregando outros protocolos, como o FTP mostrado no exemplo anterior. Desta forma, todos os exemplos apresentados anteriormente podem ser executados utilizando-se de navegadores [browsers].

Protocolo HTTP

editar

Este é o protocolo padrão de transferência de conteúdo nos Servidores Web. Para conhecer mais a fundo a sintaxe deste protocolo, faça a seguinte experiência, utilizando o utilitário telnet (através do telnet pode-se realizar uma comunicação a nível de protocolo HTTP com o servidor web):

# telnet localhost 80
GET /index.html HTTP/1.0
<enter>

<img src="%ATTACHURLPATH%/pag_295a.jpg" alt="pag_295a.jpg" width="432" height="296" />
Fig. 4 - Procedimento de acesso ao Servidor Web através HTTP.


Através desta experiência, podemos notar que:

  • O HTTP é baseado em solicitações: note o comando GET e a resposta (conteúdo do arquivo /index.html);
  • Conexões HTTP são temporárias: uma vez fornecido o conteúdo solicitado pelo GET (note no argumento do GET o arquivo /index.html) o servidor desconecta automaticamente o cliente. Note no final da transferência do arquivo, a mensagem do telnet ?Connection closed by foreign host? no final da resposta do servidor;
  • Existem diferentes versões do HTTP: note que o parâmetro HTTP/1.0 significa qual protocolo está sendo utilizado pelo cliente e qual é a versão de HTTP que está sendo utilizada pelo cliente;
  • Uma linha vazia marca o final da solicitação: apesar de termos enviado inicialmente para o servidor o comando ?GET /index.html HTTP/1.0?, o servidor só entende que terminou a solicitação quando for enviado uma linha vazia, verifique que o servidor só respondeu quando foi teclado <ENTER>;
  • A resposta HTTP é formada de cabeçalho e conteúdo: note também o formato da resposta do servidor web, formada de cabeçalho e conteúdo. O cabeçalho é formado de informações de controle, necessárias para a correta interpretação do conteúdo. Veja o formato do cabeçalho:
*Resposta*
HTTP/1.1 200 OK
Date: Sun, 07 Apr 2002 16:29:51 GMT
Server: Apache/1.3.14 (Unix) (Conectiva/Linux) PHP/4.0.3pl1 mod_ssl/2.7.1 OpenSSL/0.9.6
Last-Modified: Thu, 02 Nov 2000 22:00:35 GMT
Content-Length: 2908
Content-Type: text/html; charset=iso-8859-1
<linha em branco>
<linha em branco>
<conteúdo>


Este cabeçalho fornecido pelo servidor também é utilizado pelo navegador (cliente) em uma conexão HTTP, porém não é apresentado para o usuário. O cabeçalho tem bastante utilidade para o cliente, pois permite que tenha uma noção melhor do conteúdo fornecido. Por exemplo:

  • data da última modificação: é útil para saber se o cliente precisa realmente baixar o conteúdo, ou simplesmente utilizar conteúdo em cache, comparando-se com a data do conteúdo em cache. Assim, há uma melhora no desempenho do cliente; principalmente se o conteúdo for um arquivo extenso, ele não necessita baixá-lo novamente, pois simplesmente pode utilizar a cópia armazenada localmente.
  • tipo do conteúdo: fornecido pelo servidor, também conhecido como mime-type, expresso pela diretiva Content-Type no arquivo de configuração do apache, também é importante para que o navegador saiba apresentar corretamente o conteúdo. O navegador pode interpretar conteúdos como: texto html, texto puro, imagem gif, utilizando tipos mime-type text/html, text/plain, image/gif, respectivamente. Caso você queira verificar quais tipos de arquivos o seu navegador suporta, verifique opção semelhante ao Netscape 4.X, localizado em: Editar->Preferências->Navegador->Aplicações. Outros navegadores possuem uma configuração semelhante.

Apesar de não utilizarmos o comando telnet para navegar na Internet, esta experiência tem grande valor didático, pois apresenta o que acontece por ?detrás dos bastidores? na comunicação entre o navegador e o servidor web, além de também ser uma ótima forma simples e rápida para se testar o funcionamento de um servidor web.

A HTML- <nop>HyperText Markup Language - é uma linguagem de criação de páginas na Internet, também classificada como linguagem de marcação, que visa a formatação de documentos. A marcação é realizada através das tags . O browser interpreta estas tags e apresenta o documento formatado . Vejamos um exemplo de arquivo em formato HTML:

%CODE{"php3"}% <HTML> <HEAD><TITLE>TESTE DE PÁGINA INTERNET</TITLE></HEAD>

<BODY>

HOME-PAGE DO FULANO

Bem-vindo à HOME-PAGE do fulano.


</BODY> </HTML> %ENDCODE%

Não cabe a este documento explicar e ensinar a linguagem HTML. Caso o leitor tenha interesse em aprendê-la, existem vários livros desta área, porém se desejar um tutorial on-line, indicamos o endereço: http://www.icmsc.sc.usp.br/manuals/HTML/.

%T% O HTML não é uma considerado uma linguagem de programação, pois não possui estruturas de desvios (comandos do tipo se..então...senão [if...then...else]), ou repetição, equanto...faça [while...do]); mas sim uma linguagem de marcação [tags] voltadas para a formatação da informação em uma forma apresentável.

Publicando Minha Home-Page

editar

A priori, nosso objetivo será publicar o exemplo de página HTML apresentado anteriormente. Considerando que o Apache já esteja instalado, faça as seguintes atividades:

  • 1. Salve o exemplo de arquivo html como o nome teste.html.
  • 2. Em seguida, mova este arquivo para o diretório /home/httpd/html
  • 3.Inicie o serviço do Apache, seu nome é httpd. Vejamos
#/etc/rc.d/init.d/httpd start

%DEBIAN% %PASSO% No caso do DEBIAN, para inicializar o serviço apache ou apache2, a fim de setar as alteraçoes que fizemos, iremos digitar:

#/etc/init.d/apache start

ou

#/etc/init.d/apache start

A página apresentada será:

<img src="%ATTACHURLPATH%/pag_299a.jpg" alt="pag_299a.jpg" width="533" height="357" />
Fig. 5 - Exemplo de publicação de uma página Internet.


Observe que este exemplo só é possível pelo fato do Apache já vir com uma pré -configuração funcional de instalação. É importante observar, que neste exemplo foi necessário fornecer o nome do arquivo a ser apresentado - arquivo teste.html, na url http://localhost/teste.html.

É comum informar ao browser apenas o nome do servidor Web e este apresentar a página padrão, por exemplo http://localhost. Mas qual arquivo será apresentado por padrão? Este arquivo é o index.html. Para fins didáticos, você pode fazer o seguinte teste: renomeie o arquivo teste.html que você criou para index.html, e em seguida através do navegador solicite a página http://localhost/. Observe que será apresentada novamente a página criada por você. Repare também que não foi preciso especificar o nome index.html na URL. Caso o navegador apresente uma página diferente da criada, tente recarregar a página pois este pode estar utilizando a página que está guardada em cache.

Configuração do Apache

editar

O arquivo de configuração do Apache fica dentro do diretório /etc/httpd/conf, seu nome é httpd.conf, este caminho se refere a distribuição Conectiva e Red Hat, para outras use o comando find ou locate para localizá-lo. Iremos tratar a configuração do Apache nos seguintes aspectos:

  • básica - aspectos de configuração básica do Apache, tais como: porta TCP que o servidor responde, nome do servidor web, diretório padrão das páginas Web, etc;
  • otimização - aspectos da configuração que afetam o desempenho do Apache, tais como: como os processos são inicializados, qual a quantidade de processos que serão inicializados para responder os clientes, etc;
  • histórico - controle das informações históricas (log) que o servidor gera, tais como: configuração do diretório padrão de logs, formato dos logs, etc.
  • segurança - aspectos de configuração que afetam a segurança, tais como: qual será o usuário e grupo dono dos processos,
  • avançada - aspectos avançados de configuração, tais como: domínios virtuais, criação de aliases, configuração avançada de diretórios, etc.

%DEBIAN% %PASSO% No Debian, o arquivo de configuração do apache e do apache2 são, respectivamente, /etc/apache/httpd.conf e /etc/apache2/httpd.conf

Configuração Básica

editar

<img src="%ATTACHURLPATH%/pag_300a.jpg" alt="pag_300a.jpg" width="425" height="140" />
Fig. 6 - Definições do Servidor Web.


<nop>ServerAdmin: Definindo o Email do Administrador

editar

A diretiva <nop>ServerAdmin define o email do administrador. Quando o servidor reporta algum erro para o navegador, como página não encontrada (erro de código 404), ou sem permissão de acesso, é solicitado que o usuário envie um email para o administrador para reportar o problema, e então é passado o argumento de <nop>ServerAdmin.

ServerAdmin root@localhost

<nop>DocumentRoot: Diretório raiz do Apache

editar

<nop>DocumentRoot define o diretório onde devem ficar os arquivos, logo os arquivos de suas páginas Web devem ficar neste diretório. Você pode mudar este caminho para outro de sua preferência, porém este diretório deve ser definido como um diretório de acesso do apache, ou seja, com permissão de leitura do usuário definido na diretiva User.

Vejamos o exemplo que já vem pré-configurado:

DocumentRoot "/home/httpd/html"

Agora você já sabe porquê de nós termos colocado o arquivo teste.html (apresentado no início do capítulo) no diretório /home/httpd/html.

Abaixo está a configuração padrão para este diretório. Vejamos:

<Directory "/home/httpd/html">

Options Indexes FollowSymLinks Includes
AllowOverride None
Order allow,deny
Allow from all
</Directory>

Estas definições devem começar com<Directory ?nome-do-diretório?> e terminar com </Directory>. Mais adiante, iremos ver como definir estas opções desta diretiva.

<nop>ServerName: definindo o nome do servidor

editar

A diretriz responsável pelo nome do servidor é a <nop>ServerName

ServerName www.sistemasabertos.com.br

Lembrando que a máquina www.sistemasabertos.com.br deve existir ou deve ao menos existir um apelido através da entrada CNAME da configuração do DNS. Isto é importante quando o hospedeiro tem um nome real (canônico) diferente do nome utilizado para acesso ao serviço. Por exemplo, quando o nome real do servidor é serv1.sistemasabertos.com.br, mas o nome utilizado para acessar o servidor via url é www.sistemasabertos.com.br.

<nop>PidFile: o identificador do processo pai

editar

<nop>PidFile define o arquivo que armazena o número de identificação do processo pai httpd. Quando o serviço httpd é inicializado vários outros serviços httpd são inicializados ao mesmo tempo, isto pode ser observado se você listar os processos com o comando ps. Porém existe um processo pai de todos os demais cujo PID fica armazenado no arquivo definido pela diretiva <nop>PidFile. Vejamos o exemplo:

PidFile /var/run/httpd.pid

Port: Definindo a porta do Servidor

editar

A diretiva Port é utilizada para definir a porta padrão de trabalho do servidor Web Apache. Esta porta é convenientemente a porta HTTP. Pode-se executar o servidor Web em qualquer porta, mas isto exige que o cliente indique esta porta na URL de acesso. Assim se um Servidor Web estiver escutando a porta 8080, o cliente deve fornecer a URL da seguinte forma http://www.dominio.com.br:8080/index.html.

A porta padrão de utilização dos servidores Web é a porta 80. Portas abaixo de 1024 somente podem ser utilizadas por processos cujo dono é o super - usuário root.

Vejamos o exemplo:

Port 80

Fica a seu critério mudar o número desta porta assim como qualquer outra diretiva padrão deste arquivo. Neste caso específico, a mudança de porta do servidor Web somente tem sentido caso você queira um servidor Web privado.

Se o seu servidor for responder por solicitações em mais que uma porta, deve-se utilizar a diretiva Listen. Esta diretiva especifica quais interfaces e portas o servidor vai escutar.

Listen 10.1.0.123:80

Neste exemplo o servidor vai escutar solicitações da interface 10.1.0.123, na porta 80.

Listen 8000

Aqui o servidor estará respondendo solicitações de todas interfaces na porta 8000.

Se fosse defina as duas diretivas o servidor responderia por ambas, ou seja na porta 8000 em todas interfaces e na porta 80 para a interface 10.1.0.123.

<nop>DirectoryIndex: Arquivo índice

editar

Esta diretiva tem a função de definir qual arquivo será apresentado caso o nome do arquivo não seja especificado na URL. Exemplo: quando o usuário digita http://www.sistemasabertos.com.br o browser apresentará automaticamente o arquivo index.html que estará dentro do diretório definido pelo parâmetro <nop>DocumentRoot, por padrão como visto, este diretório é o /home/httpd/html. Vejamos um exemplo:

DirectoryIndex index.html

Você ainda pode especificar mais de um nome de arquivo, basta separá-los por espaço. Assim quando você digitar a URL no browser, o servidor Web procurará primeiramente pelo primeiro nome especificado, caso este não esteja contido no diretório, ele procurará pelo segundo nome.

DirectoryIndex index.html index.php

<nop>UseCanonicalName: Nome utilizado no navegador

editar

<img src="%ATTACHURLPATH%/pag_303a.jpg" alt="pag_303a.jpg" width="510" height="138" />
Fig. 7 - Exemplo de redirecionamento utilizando UseCanonicalName.


Esta opção força o navegador (cliente) a usar o nome indicado pela diretiva <nop>ServerName ou quando esta diretiva não está habilitada, o nome canônico (real) do servidor. Por exemplo, suponha que você tenha um servidor Web com endereço IP 192.168.1.1 e nome canônico serv1.sistemasabertos.com.br; mesmo se você entrar com a URL http://192.168.1.1 no seu navegador, o servidor Web com a opção <nop>UseCanonicalName habilitada irá forçar a utilização do nome canônico serv1.sistemasabertos.com.br. Isto é útil para forçar que um nome seja sempre utilizado como padrão.

Note que se o nome indicado por esta diretiva não for resolvível pelo DNS ou pelo arquivo /etc/hosts, o navegador não conseguirá acessar a página, neste caso, se você desejar acessar somente pelo endereço IP, configure o valor desta diretiva para Off. Veja como:

UseCanonicalName Off

Configuração de otimização

editar

<img src="%ATTACHURLPATH%/pag_304a.jpg" alt="pag_304a.jpg" width="371" height="202" />
Fig. 8 - Definições de otimização do Servidor Web.


Uma das tarefas básicas do administrador de um servidor web é sempre otimizar o servidor, não somente logo após uma instalação, mas também no decorrer de seu uso, uma vez que a carga de uso pode variar. Veremos nesta seção quais são as diretivas relativas à otimização. Para saber mais sobre otimização, acesse o endereço http://httpd.apache.org/docs/misc/perf-tuning.html.

<nop>ServerType: Controle dos processos

editar

A forma de execução do Apache é configurada através da entrada:

ServerType standalone

Esta forma de execução pode ser standalone ou inetd. Na forma standalone é gerado um processo, httpd, no momento da inicialização do Apache. A forma standalone é a forma padrão de uso. No segundo caso o serviço httpd é inicializado pelo super servidor inetd .

A opção standalone resulta em maior desempenho que a opção inetd, pelo fato do serviço httpd ficar carregado em memória. Com a opção inetd, o serviço somente é carregado quando há alguma solicitação de serviço, este processo de carregar por solicitação, gera um atraso em relação a forma standalone. A opção inetd tem a vantagem de economizar recursos do sistemas como a memória, pois o serviço não fica ativo indefinidamente.

Timeout: Tempo máximo de transferência

editar

Timeout define o número de segundos que o servidor aguarda pelo término da transferência de um arquivo. Assim, se o cliente estiver fazendo a transferência e esta demorar mais que 300 segundos, caso abaixo, o arquivo será transmitido parcialmente até os 300 s.

Timeout 300

O servidor Web usa uma quantidade de processos proporcional à necessidade para dividir o trabalho. Todos os processos compartilham a carga de trabalho. Ao inicializar o daemon do apache, se você executar o comando ps aux verificará a quantidade de servidores apache trabalhando. Se todos os processos httpd ficarem ocupados, processos livres são iniciados para dividirem os serviços.

<nop>MinSpareServers: quantidade mínima de processos

editar

A diretiva <nop>MinSpareServers define a quantidade mínima de processos que podem ser iniciados pelo processo pai httpd. Estes vários processos inicializados são importantes para o performance do servidor pois uma vez que o cliente solicite o serviço, vão ter processos em execução para atendê-lo, senão, quando o cliente solicitasse ao servidor, neste instante ele inicializaria um processo, resultando em mais tempo a resposta. Vejamos:

MinSpareServers 8

<nop>MaxSpareServers: quantidade máxima de processos

editar

O parâmetro <nop>MaxSpareServers define a quantidade máxima de serviços que podem ser inicializados pelo processo pai httpd. Caso existam mais solicitações que a quantidade de processos ocupados, o servidor nega a solicitação, simplesmente respondendo ao cliente uma mensagem de servidor ocupado. Caso não seja limitado pode-se chegar a consumir tantos recursos que causa a parada total do computador.

MaxSpareServers 20

<nop>StartServers: quantidade de processos inicializados

editar

Define a quantidade de serviços que serão inicializados. Como explicado anteriormente, quando o apache é inicializado vários processos filhos são criados. Lembrando que uma quantidade muito grande de processos inicializados, mesmo que não estejam ociosos, podem consumir memória necessária a outros processos, diminuindo a performance do sistema. A diretiva <nop>StartServers define a quantidade de processos filhos que será criado pelo serviço pai httpd. Vejamos:

StartServers 10

<nop>MaxClients: quantidade máxima de clientes

editar

A quantidade máxima de clientes que podem ser atendidos pelos servidores httpd é definida através da diretiva <nop>MaxClients. Requisições superiores ao definido pela diretiva ficam na fila de espera. Caso você tenha um servidor muito solicitado aumente o valor.

MaxClients 150

Configuração de histórico

editar

<img src="%ATTACHURLPATH%/pag_306a.jpg" alt="pag_306a.jpg" width="276" height="192" />
Fig. 9 - Logs do Servidor Web.


Conhecer e saber analisar as informações históricas de um servidor é essencial para se administrar eficientemente um servidor. Os logs (registros históricos) de um servidor web, podem fornecer informações essenciais como: - parâmetros de análise para ajuste de desempenho; - verificar possíveis problemas de segurança; - informações para se gerar relatórios estatísticos de acesso;

Veremos a seguir diretivas utilizadas para se administrar arquivos de log.

<nop>ServerRoot: localização dos arquivos de logs

editar

Esta diretiva define o diretório onde deverão ser armazenados os arquivos de logs, erros e acessos do servidor Web. Por padrão este diretório é o /etc/httpd.

ServerRoot /etc/httpd

É importante entender que todos arquivos, quando não especificado o caminho absoluto, ficam subordinados a este diretório.

<nop>HostnameLookups: configurando registro de nomes

editar
HostnameLookups Off

Esta opção quando configurada com o valor On faz com que o registro de informações de log gravadas no arquivo definida pela Diretiva <nop>AccessFileName seja identificado com o nome das maquinas, quando assinalada com Off o registro será gravado com o endereço IP. É interessante deixar esta opção desabilitada (Off), pois aumenta a velocidade de acesso do cliente, poupando do servidor a tarefa de resolver nomes.

O Apache trabalha com dois arquivos de Log, o arquivo access_log e o error_log. Estes arquivos são gerados pelo processo httpd pai quando este é iniciado, e se localizam por padrão dentro do diretório /var/log/httpd.

<nop>CustomLog: arquivo de histórico de acesso

editar

Esta diretiva permite definir qual é o arquivo de logs de acesso (logs/access_log), e qual é o formato dos logs: common - (definido pela diretiva <nop>LogFormat, que veremos mais adiante) que este arquivo segue. Os acessos bem sucedidos dos clientes são registrados neste arquivo. Os acessos mal sucedidos são registrados no arquivo definido no arquivo de log de erros, definido pela diretiva <nop>ErrorLog; veremos sobre esta diretiva mais adiante.

CustomLog logs/access_log common

Este arquivo, aqui definido como access_log, é utilizado por analisadores de log para se obter estatísticas de acesso do servidor. Para se analisar este log, sugerimos utilizar o analisador de log http://www.webalizer.org/. Um excelente analisador de log, que produz relatórios estatísticos em páginas de formato HTML.

<nop>LogFormat: formato de histórico de acesso

editar

Este arquivo é utilizado para registrar todos os acessos efetuados no servidor Web. Vejamos um exemplo deste arquivo:

10.1.0.101 - - [03/Dec/2001:00:14:54 -0200] "GET /icons/unknown.gif HTTP/1.0" 200 245
10.1.0.101 - - [03/Dec/2001:00:14:54 -0200] "GET /icons/text.gif HTTP/1.0" 200 229
10.1.0.103 - - [03/Dec/2001:00:14:54 -0200] "GET /icons/folder.gif HTTP/1.0" 200 225
10.1.0.103 - - [03/Dec/2001:00:15:02 -0200] "GET /~fulano HTTP/1.0" 301 329

O formato deste arquivo suporta 7 campos por linha, ou seja, 7 informações para cada acesso. Observe que dois campos não estão sendo utilizados (existem dois hífens). O administrador do servidor pode mudar a forma de formatação deste arquivo, assim como utilizar destes campos que não estão em uso para registrar mais informações.

A diretiva que define o formato deste arquivo de log é a <nop>LogFormat. Vejamos a configuração original desta diretiva:

LogFormat "%h %l %u %t \"%r\" %>s %b" common

Esta diretiva define um formato, delimitado em aspas duplas (?), e também o nome deste formato, denominado common. Este é o formato mais utilizado, mas outros formatos de logs (combined, referer e agent) geralmente também são fornecidos por padrão:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

Abaixo está apresentada as principais variáveis de formatação. Note que você tem a liberdade de utilizar qualquer um destes formatos ou criar os seus próprios. Caso você deseje saber de mais variáveis de formatação, acesse o endereço: http://httpd.apache.org/docs/mod/mod_log_config.html#formats

*Variável de Formatação*
%A Endereço IP local
%a Endereço IP remoto
%b Bytes transmitidos.
%f Nome do Arquivo
%h Host remoto
%H Protocolo Requisitado
%l Nome de usuário remoto, obtido do daemon identd, se foi fornecido
%r Primeira linha da solicitação. Lembre-se que o HTTP é um protocolo baseado em solicitação-resposta.
%s Status do retorno. Um valor de >, entre o sinal de porcentagem (%) e a letra 's', como %>s significa que é o último status de retorno.
%t Data e Hora
%T Tempo gasto do servidor para atender uma requisição
%u Nome de usuário, obtido de uma autenticação de acesso .

<nop>ErrorLog: definindo arquivo de erros

editar
ErrorLog logs/error_log 

Esta diretiva define o arquivo de log de erros. Através deste arquivo é possível descobrir problemas responsáveis pelos erros ocorridos no Servidor Web. Note que o diretório fornecido como argumento desta diretiva (logs/error_log) é um caminho relativo ao caminho especificado na diretiva <nop>ServerRoot citado anteriormente. Ou seja, a localização absoluta padrão deste arquivo é /etc/httpd/logs/error_log.

%T% No Linux Conectiva, este diretório definido como logs, na verdade, é um link simbólico para o diretório /var/log/httpd, logo o arquivo error_log pode ser encontrado neste diretório.

Configuração de segurança

editar

User: usuário dono dos processos

editar

<img src="%ATTACHURLPATH%/pag_310a.jpg" alt="pag_310a.jpg" width="390" height="197" />
Fig. 10 - Segurança no Servidor Web.


Quando o servidor Apache é inicializado, primeiramente é ativado apenas um daemon httpd, este será o processo pai dos demais. Como visto anteriormente, a quantidade total de serviços que serão inicializados é definido pela diretiva <nop>StartServers. O dono do processo pai sempre é o super-usuário root. Entretanto, o dono dos processos filhos é definido pelas diretivas User e Group. Define o dono dos processos filhos httpd. Vejamos o exemplo:

User nobody

Group: grupo dono dos processos

editar

O servidor httpd normalmente é usado por usuários remotos para ler informações que estão no seu servidor e, se forem usados scripts , ele será usado para executar programas, estas ações são realizadas no servidor pelo usuário e grupo definido pelas diretivas User e Group respectivamente. Portanto o ideal é que este usuário tenha mínimas permissões em seu sistema, em geral é utilizado o usuário nobody e grupo nobody. Define o grupo relacionado aos processos filhos httpd.

Group nobody

Configuração avançada

editar

<nop>UserDir: Criando páginas para usuários

editar

O apache tem a funcionalidade de permitir que cada usuário tenha sua própria página Web. Assim, cada usuário poderá publicar seus trabalhos, curriculum, documentários, etc. A diretiva que implementa está funcionalidade é a <nop>UserDir. Vejamos o exemplo:

UserDir public_html

<nop>UserDir define o diretório que o usuário deve colocar os arquivos de sua página. Este diretório deve ser criado dentro de seu diretório home e ter as permissões 755 - leitura, escrita e acesso para o dono, leitura e acesso para o grupo e leitura e acesso para outros. Lembrando que o valor para permissão 4 significa leitura, o número 2 significa escrita e o número 1 significa execução para arquivo ou acesso para diretório. Além disso deve-se modificar as permissões do diretorio home do usuário para 711. Estas configurações são necessárias pois o processo httpd é executado como usuário nobody e portanto este necessita ter acesso de leitura no diretório em questão.

<img src="%ATTACHURLPATH%/pag_311a.jpg" alt="pag_311a.jpg" width="610" height="268" />
Fig. 11 - Disponibilização de páginas de usuários.


Atividade:

%PASSO% 1.Entre no sistema como um usuário comum. Em nosso exemplo usaremos o usuário fulano.

%PASSO% 2.Vá para seu diretório home e crie o diretório public_html.

$cd /home/fulano                                                                               $mkdir public_html

%PASSO% 3. Dentro do diretório public_html crie o arquivo index.html. O conteúdo deste arquivo será mostrado no navegador. Para motivo de teste não há necessidade de preocupar com a linguagem HTML, coloque apenas alguma frase qualquer como no exemplo abaixo:

$vi /home/fulano/public_html/index.html
Home-Page do usuário fulano 

%PASSO% 4. É hora de atribuirmos as permissões destes diretórios. Para o diretório /home/fulano vamos atribuir permissões 711 e para o diretório /home/fulano/public_html, 755. Vejamos:

$chmod 711 /home/fulano 
$chmod 755 /home/fulano/public_html

%PASSO% 5.Execute o navegador e acesse a URL http://localhost/~fulano. Observe que a URL de páginas de usuários terá sua sintaxe da seguinte forma: http://maquina.dominio/~nomedousuario

Alias: definindo apelidos para diretórios

editar

Podem surgir ocasiões onde você precisa de definir outros diretórios para armazenar páginas, diferente do padrão /home/httpd/html. Para isto você pode fazer uso da diretiva Alias, que permite que você defina apelidos para um determinado diretório específico diferente do padrão. Por exemplo, suponha que exista o diretório /sa/atendimento/www compartilhado para um grupo de pessoas do setor de atendimento de sua empresa e que seja necessário que as pessoas publiquem páginas ou arquivos para clientes efetuarem download. Você pode fazer isto através da diretiva Alias, colocada no arquivo de configuração httpd.conf:

Alias /atendimento "/sa/atendimento/www"

%T% É costume colocar uma barra (/) logo após o alias. Quando fizer isto também não esqueça de inserir a barra no diretório apontado. Por exemplo, isto estaria correto: Alias /atendimento/  ?/sa/atendimento/www/?; mas isto resultaria em erro: Alias /atendimento/  ?/sa/atendimento/www?.

<img src="%ATTACHURLPATH%/pag_312a.jpg" alt="pag_312a.jpg" width="616" height="129" />
Fig. 12 - Definindo apelidos para diretórios.


Este primeiro exemplo permitirá com que o browser acesse o diretório /sa/atendimento/www, através do endereço http://www.sistemasabertos.com.br/atendimento . Obviamente este deve ser um diretório com permissões que possibilite o acesso do apache, ou seja, com permissões de leitura (r) e acesso (x) para o usuário definido em User, por padrão nobody.

A diretiva Alias serve para criar um atalho para o diretório /sa/atendimento/www, caso contrário não seria possível acessá-lo pois este não se encontra no de diretório padrão de documentos, definido por <nop>DocumentRoot. Para acessar o diretório acima, o cliente deveria solicitar por www.sistemasabertos.com.br/atendimento. Antes de fazer isto, você deve criar um arquivo index.html dentro do diretório /sa/atendimento/www para seu conteúdo ser apresentado.

Agora uma boa pergunta: se já existir um diretório de nome atendimento dentro do diretório padrão, qual diretório será acessado para a URL http://localhost/atendimento? A resposta é que a diretiva Alias sempre é a predominante; ou seja, neste caso o diretório acessado será sempre a que for indicado pela diretiva Alias.

%T% inicialmente o arquivo srm.conf era utilizado para definir configurações de atalhos para diretórios diferentes do padrão. Porém perceberam que seria mais simples para fins de manutenção utilizar somente o arquivo httpd.conf. Portanto, em nossas configurações utilizaremos apenas o arquivo httpd.conf. Você pode habilitar ou desabilitar o uso deste arquivo, basta configurar a diretiva que a controla: <nop>ResourceConfig (que habilita o arquivo srm.conf) . Por padrão esta diretiva é desabilitada.

<Directory>: opções de segurança de um diretório

editar

A diretiva <Directory> serve para agrupar um conjunto diretivas associadas a um diretório especificado. Para isto a diretiva <Directory> possui um formato diferente das usuais:

%CODE{"php3"}% <Directory caminho> outras_diretivas_relativas_ao_diretorio </Directory> %ENDCODE%

<img src="%ATTACHURLPATH%/pag_314a.jpg" alt="pag_314a.jpg" width="339" height="156" />
Fig. 13 - Definições do diretório de acesso do Servidor Apache.


Lembre-se também que as outras são assim:

Diretiva opção

Sob outro ponto de vista, pode-se dizer que a diretiva <Directory> é uma diretiva "agrupadora" de diretivas.

%T% a sintaxe do arquivo de configuração do apache é basicamente formado por diretivas simples e agrupadoras; estas são geralmente delimitadas com '<>'. Outros exemplos de diretivas agrupadoras são: <IfDefine>, <Files>, <IfModule> e <VirtualHost>. Algumas destas diretivas serão tratadas adiante. Caso você queira uma descrição completa de todas as diretivas do Apache acesse o endereço: http://httpd.apache.org/docs/mod/directives.html.

Por exemplo, veja as diretivas padrões associadas ao diretório padrão:

%CODE{"php3"}% <Directory "/home/httpd/html"> Options Indexes FollowSymLinks Includes AllowOverride None Order allow,deny Allow from all </Directory> %ENDCODE%

Basicamente as diretivas associadas ao diretório são relativas à segurança:

  • Options - define várias opções relativas à permissão: listar diretórios (Indexes), acessar links simbólicos (<nop>FollowSymLinks) e permitir executar tags padrões do servidor (Includes).
  • <nop>AllowOverride - permite ou impede as opções (por padrão, nenhuma opção, veja opção None) do um arquivo de configuração de acesso à diretórios .htaccess. Geralmente o .htaccess é utilizado para definir senhas de acesso à diretórios.
  • Order - Define a ordem em que serão avaliadas as permissões de acesso a este servidor por redes ou hosts específicos. No nosso caso, será permitir acesso (por padrão allow) para depois proibir (por padrão deny).
  • Allow - Define quais servidores (por padrão todos, veja opção all) terão acesso permitido a este servidor.

Estas opções serão exemplificadas e discutidas com mais detalhes mais adiante.

%T% Antigamente o arquivo access.conf era muito utilizado para definir segurança de acesso à diretórios. Porém perceberam que seria mais simples para fins de manutenção utilizar somente o arquivo httpd.conf. Portanto, em nossas configurações utilizaremos apenas o arquivo httpd.conf. Você pode habilitar ou desabilitar o uso deste arquivo, basta configurar a diretiva <nop>AccessConfig. Por padrão esta diretiva é desabilitada.

Vamos exemplificar o uso da diretiva <Directory> através de um exemplo. Crie abaixo a seguinte entrada no arquivo httpd.conf:

%CODE{"php3"}% <Directory "/sa/atendimento/www"> Options Indexes FollowSymLinks Includes AllowOverride All Order allow,deny Allow from all </Directory> %ENDCODE%

Note que no exemplo anterior, havíamos criado um alias para este diretório, através da entrada:

Alias /atendimento "/sa/atendimento/www"

Caso este alias não tivesse sido criado anteriormente, este diretório não seria acessível, pois por padrão, somente o diretório /home/httpd/html é acessível. Lembre-se também que depois de alterar o arquivo httpd.conf você deve recarregar o serviço httpd. Vejamos cada diretiva deste diretório separadamente.

Options: várias opções de segurança

editar

%CODE{"php3"}% <Directory "/sa/atendimento/www"> Options Indexes FollowSymLinks Includes AllowOverride All Order allow,deny Allow from all </Directory> %ENDCODE%

No exemplo da diretiva Options, utilizamos as seguintes opções:

<img src="%ATTACHURLPATH%/pag_316a.jpg" alt="pag_316a.jpg" width="286" height="116" />
Fig. 14 - Permissão de ver o conteúdo do diretório.


Indexes: permite listar diretórios

editar
  • Permite que o servidor web liste os arquivos contidos neste diretório, caso nenhum arquivo de índice for encontrado. Arquivo de índice é o nome do arquivo definido pela diretiva <nop>DirectoryIndex, geralmente o nome padrão do arquivo de índice é index.html. Para testar isto, renomeie ou remova qualquer arquivo de índice do diretório /sa/atendimento/www e em seguida acesse o diretório através do endereço http://localhost/atendimento. Uma vez que não existe um arquivo index.html, note que o diretório é listado, permitindo que todos arquivos deste diretório sejam conhecidos. Caso você deseje desabilitar esta opção por razões de segurança, utilize o sinal menos (-) antes, ou seja, utilize a opção -Indexes.

<img src="%ATTACHURLPATH%/pag_316b.jpg" alt="pag_316b.jpg" width="286" height="116" />
Fig. 15 - Utilização de link simbólico.


  • <nop>FollowSymlinks: permite percorrer links simbólicos

Permite o uso de Links Simbólicos. Isto permite que o servidor percorra outros diretórios do sistema de arquivos por meio de links simbólicos além do que foi disponibilizado. Por exemplo, execute como root:

# cd /sa/atendimento/www 
# ln -s /etc/ etc

e acesse o endereço http://localhost/atendimento/etc. Note que é possível acessar o diretório /etc do servidor através de um navegador, a partir de um link simbólico, permitindo acessar arquivos críticos no aspecto de segurança, como /etc/passwd. Caso você deseje desabilitar esta opção por motivos de segurança, utilize o sinal menos (-) antes, ou seja, utilize a opção -FollowSymlinks.

<img src="%ATTACHURLPATH%/pag_317a.jpg" alt="pag_317a.jpg" width="519" height="159" />
Fig. 16 - Processo de utilização de SSI.


Includes: permite utilizar SSI

editar

Permite o uso de SSI - Server-Side Includes. Server Side Includes são tags especiais que são incluídas dentro de arquivos HTML, e são pré-processadas pelo Servidor Web, antes de serem enviadas para o cliente. Por exemplo, crie o seguinte tag SSI e salve como teste_ssi.html:

Última modificação do arquivo:

%CODE{"php3"}% %ENDCODE%

Este exemplo lista a data da última modificação do arquivo. Os tags SSI podem executar várias tarefas, inclusive: executar programas; mostrar outros arquivos html, embutidos no atual; definir variáveis; e tomar decisões (através de if) baseados em condições. Para saber mais sobre as várias tags SSI, leia o documento oficial: http://httpd.apache.org/docs/howto/ssi.html. Caso você deseje desabilitar esta opção por motivos de segurança, utilize o sinal menos (-) antes, ou seja, utilize a opção -Includes.

%T% As linguagens PHP (http://www.php.net) e ASP (http://www.microsoft.com/technet) são considerados linguagens baseadas em Server-Side Includes, uma vez que define tags que são pré-processadas pelo Servidor Web. São linguagens com muito mais tags definidas que as tags SSI fornecidas pelo Apache.

Caso você deseje habilitar todas as opções, em vez de listá-las todas, você pode utilizar a diretiva Options com o valor All, da seguinte forma:

Options All

O contrário desta configuração seria, nenhuma opção, utilizando-se a opção None:

%CODE{"php3"}% Options None AllowOverride: configura opções de .htaccess <Directory "/sa/atendimento/www"> Options Indexes FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> %ENDCODE%

<img src="%ATTACHURLPATH%/pag_318a.jpg" alt="pag_318a.jpg" width="611" height="299" />
Fig. 17 - Ilustração do pedido de autenticação do Servidor Web para que o cliente possa acessar a página.


A diretiva <nop>AllowOverride delimita as opções definidas no arquivo definido na diretiva <nop>AuthFilename, que por padrão é .htaccess. Veja como é a utilização padrão desta diretiva:

AccessFileName .htaccess

<nop>AccessFileName define o nome do arquivo de informações de acesso à diretórios específicos. O servidor Web procura este arquivo no diretório em questão, verificando por diretivas de permissões de acesso, como autenticação de usuários através de senha, antes de liberar o acesso. Este arquivo possui opções próprias, a documentação oficial se encontra em http://httpd.apache.org/docs/howto/auth.html#basic

Este arquivo é sempre criado no diretório que se deseja definir opções particulares de segurança, por exemplo, senha de acesso para o diretório. No caso acima (All) ele permite qualquer opção definida no arquivo, que equivale a permitir qualquer opção deste arquivo. Note que para o diretório padrão, este valor é None, que significa que qualquer arquivo .htaccess em qualquer diretório a partir do padrão não tem nenhum efeito por padrão.

Vejamos um exemplo de arquivo .htaccess para configurar senha a um diretório. No nosso caso, criaremos uma senha de acesso para o diretório /sa/atendimento/www/comsenha. O arquivo .htaccess armazena as suas regras de acesso e várias informações de configuração. Para criá-lo, pode-se utilizar qualquer editor de texto. Um arquivo exemplo poderia ser este:

%CODE{"php3"}% AuthUserFile /etc/apache2/senhas AuthName "Digite sua senha para entrar no sistema" AuthType Basic

<Limit GET POST> require valid-user </Limit> %ENDCODE%

O arquivo consiste de cinco diretivas principais e seus valores correspondentes:

  • <nop>AuthUserFile - aponta a localização do banco de dados de senhas. Observe que você deve especificar o caminho completo para este arquivo, no nosso caso é /etc/httpd/conf/senha_atendimento.
  • <nop>AuthName - armazena uma string de texto definida pelo usuário para exibir na caixa de diálogo de autenticação que aparece aos usuários quando eles solicitam acesso.
  • <nop>AuthType - identifica o método de autenticação, Basic é o tipo mais usado, porém nesse caso a senha é enviada em formato texto puro com codificação em formato uuencode.
  • <nop>Limit - controla que usuários tem acesso permitido e que tipo de acesso ele podem obter (GET, POST e PUT) e a ordem em que as regras são avaliadas.
  • require - especifica que usuários podem acessar o diretório protegido por senha.

Para criar um novo arquivo de senha /etc/httpd/conf/senha_atendimento basta em utilizar os seguintes comandos:

# cd /etc/apache2/
# htpasswd -c senhas fulano

Em seguida lhe será pedido que entre com a senha do usuário fulano, e uma confirmação da senha digitada será pedida a seguir.

%T% é recomendável que você não armazene arquivos de senhas nos diretórios que eles protegem, Se armazenar, usuários autorizados serão capazes de descarregar o arquivo e executar ferramentas de quebras de senha nele.

Para saber mais sobre esta diretiva, acesse o endereço http://httpd.apache.org/docs-2.0/mod/core.html#allowoverride.

Order e Allow: clientes com permissão de acesso

%CODE{"php3"}% <Directory "/sa/atendimento/www"> Options Indexes FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> %ENDCODE%

As diretrizes:

Order allow,deny
Allow from all

Estas são utilizadas para negar ou liberar acesso de um diretório para determinados hosts. Veja este exemplo:

Order deny,allow
Deny from all
Allow from .dominio.com.br

Neste exemplo temos o parâmetro Order que define a ordem que será feito a liberação de acesso. Neste caso primeiro negará o acesso para depois liberar. Então primeiramente o acesso é negado a todos através do parâmetro Deny all e em seguida é liberado o acesso apenas para máquinas do domínio dominio.com.br.

Hierarquia de diretórios

editar

Agora vem uma boa pergunta: conforme exemplo anterior, suponha que necessitamos criar um diretório /sa/atendimento/www/docs. Se simplesmente criarmos este diretório, com:

#mkdir /sa/atendimento/www/docs

qual seria as configurações de permissão para este diretório? A resposta está na herança de configurações baseado na hierarquia de diretórios. Ou seja, o sub-diretório herda as configurações do diretório, somente podendo alterá-las com outra configuração através de outra definição de <Directory>. Veja as configurações para o diretório /sa/atendimento/www.

%CODE{"php3"}% <Directory "/sa/atendimento/www"> Options Indexes FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> %ENDCODE%

<img src="%ATTACHURLPATH%/pag_321a.jpg" alt="pag_321a.jpg" width="444" height="225" />
Fig. 18 - Representação da hierarquia de diretórios de acesso do Apache.


Caso eu deseje modificar algumas das opções para o diretório /sa/atendimento/www/docs, então eu deveria criar outra entrada <Directory>:

%CODE{"php3"}% <Directory "/sa/atendimento/www/docs"> Options -FollowSymLinks Includes AllowOverride None Order deny,allow Deny from all Allow from 10.1.0.112 </Directory> %ENDCODE%

<img src="%ATTACHURLPATH%/pag_322a.jpg" alt="pag_322a.jpg" width="440" height="194" />
Fig. 19 - Representação da hierarquia de diretórios de acesso do Apache.


Neste caso, estou retirando a opção <nop>FollowSymLinks e habilitando a opção Includes. A opção Indexes foi herdada e não foi modificada, portanto permanece. Quanto a opção <nop>AllowOverride, esta foi modificada para None, ou seja, o arquivo .htaccess não terá nenhum efeito. As opções Order/Deny/Allow foram modificadas de forma que somente o host 10.1.0.112 poderá acessar este diretório.

Outra configuração padrão do arquivo httpd.conf a ser notada é para o diretório /, veja:

%CODE{"php3"}% <Directory "/"> Options None AllowOverride None </Directory> %ENDCODE%

Ou seja, por padrão, qualquer diretório terá como padrão, qualquer opção da diretiva Options desabilitada e também com o arquivo .htaccess inativo. Note também a configuração padrão para o diretório /home/httpd/html sobrepõe estas opções padrões:

%CODE{"php3"}% <Directory "/home/httpd/html"> Options Indexes FollowSymLinks Includes AllowOverride None Order allow,deny Allow from all </Directory> %ENDCODE%

<nop>ScriptAlias: definindo diretórios para executar CGI

editar

<img src="%ATTACHURLPATH%/pag_323a.jpg" alt="pag_323a.jpg" width="596" height="212" />
Fig. 20 - Representação de execução de scripts através do Servidor Web.


Através da diretiva <nop>ScriptAlias, pode-se definir diretórios dedicados para se executar aplicativos CGI. Veja a configuração padrão:

ScriptAlias /cgi-bin/ "/home/httpd/cgi-bin/"

Porém somente esta configuração não basta, é necessário também habilitar a execução de aplicativos CGI neste diretório, através da diretiva <Directory>. Veja a entrada padrão para este diretório:

%CODE{"php3"}% <Directory "/home/httpd/cgi-bin"> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> %ENDCODE%


Note nesta entrada <Directory>, o uso da opção <nop>ExecCGI, na diretiva Options.

Segue uma boa pergunta para quem ainda não conhece: Mas afinal, o que são aplicativos CGI? Aplicativos CGI nada mais são do que programas, podendo ser em qualquer linguagem, executados pelo servidor web cujo resultado é fornecido para o cliente.

Por exemplo, crie o seguinte programa, chamado teste_cgi.sh, escrito em script bash, no seu diretório padrão de programas CGI, /home/httpd/cgi-bin:

#!/bin/bash
echo "Content-type: text/plain"
echo
echo "executando whoami:"
whoami
echo "Executando w:"
w
echo "Executando cat"
cat /etc/passwd

Em seguida, altere a permissão para 755 deste arquivo e teste a execução através de http://localhost/cgi-bin/teste.sh

Note neste exemplo, o envio do cabeçalho HTTP de resposta para o cliente, com a diretiva Content-type, que informa o conteúdo sendo enviado, juntamente com a linha em branco.

Cuidado com as permissões de escrita deste diretório, pois dentro deste diretório os arquivos podem ser executados. Portanto, imagine outros alterando os arquivos deste diretório!! Estes executáveis podem se tornar uma ameaça ao sistema. Logo, você deve preocupar com as permissões padrões do Linux para este diretório.

%T% Como foi dito, qualquer linguagem pode ser utilizada para scripts CGI. As mais utilizadas em Linux, são Perl, C e Python. Caso você interesse em aprender mais sobre CGI, acessse a seguinte url http://hoohoo.ncsa.uiuc.edu/cgi/

<VirtualHost>: definindo domínios virtuais

editar

Domínios virtuais têm a função de fazer com que um servidor Web responda por mais de um domínio, não precisando de uma máquina para cada um. Esta é uma possibilidade tipicamente explorada pelos provedores, armazenando páginas de várias empresas.

Em nosso estudo trataremos duas formas de domínios virtuais. É comum na Internet termos um site www.dominio.com.br e termos uma outra URL como www.teste.dominio.com.br, este último seria um sub-domínio que daria acesso a outra página Web diferente da primeira URL apresentada. O outro caso seria o Servidor Web responder por um domínio totalmente diferente do primeiro, ou seja, o servidor www.dominio.com.br responderia por www.dominio2.com.br.

Neste ponto de configuração do Apache, o compreendimento do DNS é fundamental, pois um domínio virtual é criado com a configuração conjunta dos dois. Primeiramente, configuraremos o arquivo httpd.conf e depois mostraremos os arquivos de configuração de DNS.

Criando Sub-domínios Virtuais

editar

Os parâmetros que serão apresentados são referentes as configurações globais necessárias para as configurações que virão posteriormente. Veja como deve estar estas configurações resumidamente:

ServerName www.sistemasabertos.com.br
DocumentRoot "/home/httpd/html"
DirectoryIndex index.html
NameVirtualHost 10.1.0.101 

<img src="%ATTACHURLPATH%/pag_326a.jpg" alt="pag_326a.jpg" width="610" height="281" />
Fig. 21 - Ilustração de um Servidor Web respondendo por um domínio e um sub-domínio.


A diretiva que ainda não conhecemos se refere a <nop>NameVirtualHost, esta diretiva reconhece quais interfaces estarão escutando por requisições para Hosts Virtuais. A partir da versão 1.3.13 o caracter especial * é reconhecido, e indica todas as interfaces do servidor.

Depois de configurado a seção global, o próximo passo é configurar a seção <nop>VirtualHost.

  1. Inicio da definição dos Virtuais Hosts

%CODE{"php3"}% <VirtualHost 10.1.0.101:80>

  1. host primario

ServerAdmin root@sistemasabertos.com.br DocumentRoot /home/httpd/html

  1. ServerName www.sistemasabertos.com.br

ErrorLog /etc/httpd/logs/error_log TransferLog /etc/httpd/logs/access_log </VirtualHost> %ENDCODE%

Esta definições são necessárias para o próprio servidor Web primário que responde por www.sistemasabertos.com.br, ou seja, este domínio virtual se refere ao domínio primário www.sistemasabertos.com.br.

<VirtualHost 10.1.0.101:80>

Esta diretiva define o início de um domínio virtual, o parâmetro 10.1.0.101:80 define o IP, dentre os relacionados em <nop>NameVirtualHost, que escutará por requisições destinadas a <nop>ServerName. O número 80 faz referência a porta de comunicação do Servidores Web, por padrão esta porta será 80, portanto o ":80" pode ser omitido.

DocumentRoot /home/httpd/html

Esta diretiva define o diretório onde deve ficar os arquivos da página deste domínio. Neste exemplo, quando o cliente digitar www.sistemasabertos.com.br ele acessará este diretório e consequentemente procurará pelo arquivo index.html.

ServerAdmin root@sistemasabertos.com.br

Define o email do Administrador deste domínio Virtual. Logo, as mensagens pertinentes a este domínio serão encaminhadas para o email root@sistemasabertos.com.br.

ServerName www.sistemasabertos.com.br

Define o Nome do Servidor do domínio Virtual, mais precisamente este será o nome da URL que o cliente deverá digitar no browser para ter acesso a página que estará armazenada no diretório definido pelo <nop>DocumentRoot desta seção <nop>VirtualHost. Neste caso esta diretiva está comentada pelo fato desta entrada ser referente ao Virtual Host Primário.

ErrorLog /etc/httpd/logs/error_log

Todos o erros para este Domínio Virtual serão reportados neste arquivo definido pela diretiva <nop>ErrorLog, este arquivo não precisa ser criado manualmente o mesmo é criado automaticamente quando é ocorrido o primeiro erro.

TransferLog /etc/httpd/logs/access_log

Todos acessos de clientes serão reportados neste arquivo, este arquivo também é criado automaticamente.

As próximas entradas definirão os novos domínios virtuais.

%CODE{"php3"}% <VirtualHost 10.1.0.101:80>

ServerAdmin root@info.sistemasabertos.com.br DocumentRoot /home/httpd/html/info ServerName www.info.sistemasabertos.com.br ErrorLog /etc/httpd/logs/info_error_log TransferLog /etc/httpd/logs/info_access_log </VirtualHost> %ENDCODE%

Neste exemplo criamos um sub-domínio do domínio sistemasabertos.com.br, o sub-domínio info.sistemasabertos.com.br. Obviamente a opção <nop>ServerName deve existir e estar descomentada, esta opção define a nova URL. Entre as mudanças importantes a serem salientada temos:

  • 1.O <nop>DocumentRoot deve definir um novo diretório, este deve ser criado, pois quando o usuário digitar www.info.sistemasabertos.com.br, ele acessará este diretório e procurará por um novo index.html que será obviamente diferente do index.html de www.sistemasabertos.com.br, pois o mesmo estará em outro diretório.
  • 2.Os arquivos de <nop>ErrorLog e <nop>TranferLog devem ser outros, isto melhora a manutenção do sistema.
  • 3.Como a máquina www.info.sistemasabertos.com.br não existe, você deve colocar uma entrada CNAME - definir um apelido - no dns. Veja o exemplo do arquivo de banco de dados do domínio sistemasabertos.com.br, este exemplo é continuação do exemplo apresentado no capítulo sobre DNS:
@       IN      SOA     lab1.sistemasabertos.com.br.        root.lab1.sistemasabertos.com.br. (
20010328002 ; serial
3600 ; refresh
900 ; retry
1209600 ; expire
43200 ; default_ttl
)
@               IN      MX      5       lab1.sistemasabertos.com.br.
@               IN      NS      lab1.sistemasabertos.com.br.
lab1            IN      A       10.1.0.101
lab2            IN      A       10.1.0.102
lab3            IN      A       10.1.0.103
lab4            IN      A       10.1.0.104
lab5            IN      A       10.1.0.105
lab6            IN      A       10.1.0.106
lab7            IN      A       10.1.0.107
www             IN      CNAME   lab1
www.info        IN      CNAME   lab1

A nova linha adicionada está em negrito. Assim a máquina lab1 responderá por www.sistemasabertos.com.br e www.info.sistemasabertos.com.br, o trabalho de carregar o cliente para página(diretório) correspondente será do Servidor Web.

Este exemplo apresentado é muito utilizado em grandes instituições, pois quando cada setor da instituição requer uma página Web você pode utilizar deste artifício. Um exemplo real é a Universidade Federal Goiás - UFG. O site principal desta instituição é www.ufg.br, assim cada faculdade tem sua própria página Web através de domínios virtuais, a Escola de Engenharia Elétrica desfruta da URL www.eee.ufg.br.

Criando um Domínio Virtual

editar

O próximo exemplo é análogo ao anterior, porém a configuração do DNS será diferente. Neste exemplo queremos que um mesmo servidor Web responda por www.sistemasabertos.com.br e, além disto, www.dominio.com.br. Veja o exemplo:

%CODE{"php3"}% <VirtualHost 10.1.0.101:80>

ServerAdmin root@dominio.com.br DocumentRoot /home/httpd/html/dominio ServerName www.dominio.com.br ErrorLog /etc/httpd/logs/dominio_error_log TransferLog /etc/httpd/logs/dominio_access_log </VirtualHost> %ENDCODE%

<img src="%ATTACHURLPATH%/pag_330a.jpg" alt="pag_330a.jpg" width="610" height="281" />
Fig. 22 - Representação de um Servidor Web respondendo por mais de um domínio.


A configuração é exatamente similar, o que o leitor deve abstrair é a configuração do DNS, pois não apresentaremos aqui. Em relação a configuração do DNS existem mais de uma forma de configuração para que isto funcione. Veja os tipos de configuração do DNS que seriam suportadas:

  • 1.Na própria máquina você deveria criar uma nova zona chamada dominio.com.br, assim você teria duas zonas definidas e deverá ter também dois arquivos de banco de dados - você deverá criá-los. Logo, sua máquina responderia por www.sistemasabertos.com.br e por www.dominio.com.br, o que é necessário para testar a configuração do Domínio Virtual criado.
  • 2.Outra forma é ter a configuração de DNS separada em dois servidores de DNS, assim cada servidor seria responsável por um domínio diferente, mas ambos teriam uma entrada para o endereço IP do Servidor Web.
  • 3.O Servidor Web pode ter duas interfaces de redes com a Internet, e assim você pode definir que uma interface de rede seja responsável pelo domínio www.sistemasabertos.com.br e a outra responsável pelo domínio www.dominio.com.br. Para dividir esta tarefa basta colocar o endereço IP referente a interface de rede na diretiva <nop>VirtualHost. Veja o exemplo:

%CODE{"php3"}% <VirtualHost 10.1.0.101:80>

  1. host primario

ServerAdmin root@sistemasabertos.com.br DocumentRoot /home/httpd/html

  1. ServerName www.sistemasabertos.com.br

ErrorLog /etc/httpd/logs/error_log TransferLog /etc/httpd/logs/access_log </VirtualHost>

<VirtualHost xxx.xxx.xxx.xxx:80> ServerAdmin root@dominio.com.br DocumentRoot /home/httpd/html/dominio ServerName www.dominio.com.br ErrorLog /etc/httpd/logs/dominio_error_log TransferLog /etc/httpd/logs/dominio_access_log </VirtualHost> %ENDCODE%


Neste exemplo a primeira entrada define que o endereço IP 10.1.0.101 é responsável pelo endereço www.sistemasabertos.com.br, o endereço xxx.xxx.xxx.xxx deverá ser o IP da outra interface que será responsável pelo domínio www.dominio.com.br.

%X% Este terceiro caso necessita de configurações de DNS, pois os nome www.sistemasabertos.com.br e www.dominio.com.br devem ser resolvidos, para isto utilize de uma das maneiras apresentadas no item 1 e 2.

editar

Terminologia utilizada

editar

Browser (navegador): Programa que possibilita a visualização de páginas HTML. O browser é o cliente na Arquitetura Cliente/Servidor do Protocolo HTTP. CERN: Centro Europeu para Pesquisa Nuclear. CGI: são programas, podendo ser em qualquer linguagem (c, perl, etc), executados pelo servidor web cujo resultado é fornecido para o cliente. DSO: Dinamic Shared Object, são módulos acrescentados ao Apache, análogos ao módulos do kernel do Linux, carregados dinamicamente, possibilitando ao Apache acréscimo de recursos, como: suporte a PHP. Home-Page: Página-Pessoal, denominação geralmente utilizada para identificar páginas HTML pertencentes a uma pessoa. HTML: <nop>HyperText Markup Language, linguagem de marcação, própria para formatação de documentos. É o padrão de conversação do protocolo HTTP. HTTP: <nop>HyperText Transfer Protocol, protocolo de comunicação utilizado pelos Servidores Web. Mime-type: tipos de dados que estão sendo manipulados pelo servidor. Como: image/gif, arquivos gif, text/html, documento html, etc. NCSA: Nacional Centre for Supercomputing Aplications, empresa fundadora do servidor que deu origem ao Apache, o httpd. PID: Process Identification, número de identificação do processo para o Sistema Operacional. RPM: Red Hat Package Manager, gerenciador de pacotes rpm, utilizado em várias distribuições de Linux que seguem o padrão Red Hat, como: Red Hat, Conectiva, Mandrake etc. SSI: Server-Side Includes, Server Side Includes são tags especiais que são incluídas dentro de arquivos HTML, e são pré-processadas pelo Servidor Web, antes de serem enviadas para o cliente. tags: Marcações de formatação utilizados em HTML. URL: Uniform Resource Locators é utilizado para acessarmos um determinado recurso em máquina específica. A URL comporta o endereço de host que pode ser seu nome ou o endereço IP, o endereço de um arquivo ou diretório deste host e o protocolo pelo qual será acessado este recurso. WWW: World Wide Web, denominação equivalente a internet, no que tange a estrutura de distribuição dos documentos.

Exercícios de revisão

editar

1. Crie um arquivo teste.txt em um servidor web e através do telnet, acesse-o através do protocolo GET. Responda as questões: - qual é o mime-type deste arquivo e qual diretiva é indicado este tipo? - como o servidor web consegue determinar qual é o tipo mime

2. Existe diferença entre <nop>DocumentRoot e <nop>ServerRoot? Explique.

3. Suponha o seguinte caso:

DocumentRoot /usr/local/apache/htdocs
ServerName www.exercicio3.com.br

O que devo fazer para acessar documentos que estão em /docs quando digitar a URL:

www.exercicio3.com.br/docs

4. Considere as opções acima e certifique-se de que o diretório /usr/local/apache/htdocs esteja com opção de indexação (Option Indexes). Remova os arquivos de exibição automática (index.html). Observe a ultima linha (identificação do servidor) com a opção <nop>UseCanonicalName On e <nop>UseCanonicalName Off quando digitado a URL localhost e 127.0.0.1.

5. O que são Domínios Virtuais?

6. Crie um diretório /sa/atendimento/cgi-bin e execute um script cgi de teste, através do endereço http://localhost/atendimento/cgi-bin/teste.sh