====== O Serviço HTTP ======
O objetivo desta aula é compreender o funcionamento básico do serviço Web, explorando suas principais possibilidades de configuração.
===== Conceitos básicos =====
A World-Wide-Web é baseada em um relacionamento cliente/servidor, no qual o cliente é um navegador, que tem como característica principal permitir a visualização de diversas mídias, além do padrão básico HTML. O servidor WWW é normalmente acessado através do protocolo HTTP, que permite o tráfego das informações desejadas através de uma conexão TCP.
O protocolo HTTP permite o transporte dos mais diversos tipos de arquivos, como textos HTML, imagens, documentos em formatos específicos, applets Java, etc. Este serviço pode ser organizado em uma arquitetura //two-tier//, onde são servidas páginas web estáticas, ou //three-tier//, onde o servidor Web busca informações de outras fontes (bancos de dados ou outros serviços) para construir as páginas solicitadas, dinamicamente.
===== URLs =====
Os recursos disponíveis na Web são acessados através de referências denominadas URLs - //Uniform Resource Locators//. Uma URL define completamente um recurso na Internet, e tem os seguintes componentes:
* protocolo: forma de comunicação usada para acessar o recurso. Pode ser FTP, HTTP, LDAP, ...
* servidor: nome da máquina que provê o serviço desejado.
* domínio: complemento do nome do servidor, especificando em que rede se encontra.
* porta: porta a conectar no servidor. Pode ser omitida se for a porta default para o serviço desejado.
* caminho: localização do recurso dentro do servidor.
* recurso: nome do recurso dentro do servidor.
Considerando as seguintes URLs de exemplo, seus componentes têm os seguintes significados:
^ URL ^ protocolo ^ servidor ^ domínio ^ porta ^ caminho ^ recurso ^
| %%http://www.uol.com.br%% | http | www | uol.com.br | default (80) | / | index.html |
| %%http://espec.ppgia.pucpr.br:4700/~maziero/teste.gif%% | http | espec | ppgia.pucpr.br | 4700 | /~maziero/ | teste.gif |
| %%ftp://ftp.pucpr.br/pub/cnpq/lattes/atencao.txt%% | ftp | ftp | pucpr.br | default (21) | /pub/cnpq/lattes/ | atencao.txt |
===== O protocolo HTTP =====
O HTTP - //HyperText Transport Protocol// (versão 1.0 definida na [[http://www.ietf.org/rfc/rfc1945.txt|RFC 1945]] e versão 1.1 na [[http://www.ietf.org/rfc/rfc2616.txt|RFC 2616]]) - é um protocolo bastante simples, com comandos em formato texto, transportado através de uma conexão TCP (default na porta 80), que tem o objetivo de enviar requisições a servidores, na forma de URLs e obter respostas na forma de conteúdos especificados pelo padrão MIME.
Um exemplo típico de solicitação em HTTP, enviada pelo navegador ao servidor Web, é indicado a seguir:
GET /teste.html HTTP/1.0
Host: 20.0.0.29:8081
Accept: text/html, text/plain, image/*, application/pdf, text/sgml, */*
Accept-Encoding: gzip, compress
Accept-Language: en
User-Agent: Lynx/2.8.5dev.7 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7
Observe que a última linha da solicitação é vazia (sem conteúdo). Ao receber uma linha vazia, o servidor compreende que a solicitação terminou e começa a preparar uma resposta. A resposta do servidor a essa solicitação, enviada de volta ao navegador, poderia ser a seguinte:
HTTP/1.1 200 OK
Date: Tue, 01 Jun 2004 01:41:08 GMT
Server: Apache/2.0.40 (Red Hat Linux)
Last-Modified: Tue, 02 Apr 2002 19:49:45 GMT
ETag: "1c5e4-35-aba6c840"
Accept-Ranges: bytes
Content-Length: 53
Connection: close
Content-Type: text/html; charset=ISO-8859-1
Funcionou !
Deve-se observar que a resposta do servidor é dividida em duas seções, separadas por uma linha vazia. A primeira seção é denominada //cabeçalho// (//header//) e contém informações do servidor sobre a URL solicitada: status da resposta, tipo e tamanho da resposta, configuração do servidor, etc. A segunda seção, denominada //corpo// (//body//), contém o recurso propriamente dito, solicitado pelo navegador.
Os principais métodos (comandos) do protocolo HTTP são:
^ Método ^ Descrição ^
| GET | busca um objeto definido por uma URL do servidor |
| PUT | indica que os dados no corpo da consulta devem ser armazenados na URL especificada |
| POST | cria um novo objeto ligado ao objeto especificado na URL. Uma URL será alocada pelo servidor e retornada ao cliente. O conteúdo do novo objeto é o corpo de dados da consulta |
| HEAD | similar ao método GET, mas retorna somente o cabeçalho da resposta do servidor |
| DELETE | solicita ao servidor a remoção da informação correspondente à URL indicada |
Os principais status de retorno de métodos HTTP, informados pelo servidor no cabeçalho da resposta, são indicados abaixo (veja a [[http://www.ietf.org/rfc/rfc2616.txt|RFC 2616]] para a lista completa):
^ Categoria ^ Descrição ^ Código ^ Descrição ^
| 1 - - | Informational | 100 | Continue |
| | | 101 | Switching protocols |
| 2 - - | Success | 200 | Ok |
| | | 201 | Created |
| | | 202 | Accepted |
| | | 203 | Non-authoritive information |
| 3 - - | Redirection | 300 | Multiple choices |
| | | 301 | Moved permanently |
| | | 302 | Moved temporarily |
| 4 - - | Client error | 400 | Bad request |
| | | 401 | Unauthorized |
| | | 402 | Payment required |
| | | 403 | Forbidden |
| | | 404 | Not found |
| | | 415 | Unsupported media type |
| | | 426 | Upgrade Required |
| 5 - - | Server error | 500 | Internal server error |
| | | 501 | Not implemented |
| | | 502 | Bad gateway |
| | | 503 | Service unavailable |
| | | 505 | HTTP version not supported |
Os tipos MIME usados para identificar o tipo do conteúdo da resposta do servidor (na linha ''Content-type'' do cabeçalho da resposta) seguem um padrão especificado nas RFCs 2045 a 2048. Alguns exemplos de tipos MIME comuns são (veja uma lista mais extensa no arquivo ''[[/etc/mime.types]]''):
^ Tipo MIME ^ Significado ^
| ''text/plain'' | arquivo de texto puro |
| ''text/html'' | arquivo de texto em formato HTML |
| ''image/gif'' | arquivo de imagem em formato GIF |
| ''image/jpeg'' | arquivo de imagem em formato JPEG |
| ''application/pdf'' | arquivo de aplicação em formato PDF |
| ''video/quicktime'' | arquivo de vídeo em formato QuickTime |
====== O servidor Apache ======
===== Funcionamento básico do servidor =====
O servidor WWW que será usado neste curso é o [[http://www.apache.org]] Apache, certamente o mais utilizado atualmente no mundo inteiro. Existem diversos outros servidores WWW para UNIX, gratuitos ou comerciais, mas nenhum tem a [[http://www.securityspace.com/s_survey/data/index.html|base instalada do Apache]], e certamente poucos têm sua flexibilidade, desempenho e segurança. Ele é gratuito e está presente em quase todas as distribuições Linux.
O servidor Apache é executado na forma de um processo //daemon// chamado ''httpd'', que geralmente é lançado durante o processo de carga (//boot//) da máquina. Ao ser lançado, o //daemon// mestre cria um conjunto de //daemons// escravos (processos filhos) para atender as requisições de páginas WWW. Isso pode ser visto na seguinte listagem de processos, obtida através do comando ''ps -aux'':
$ ps aux|grep -i http
...
root 1084 0.0 0.3 258800 15112 ? S
A estrutura em vários processos do servidor Apache tem vários objetivos:
* **Maior segurança**, pois os processos filhos executam sob a identidade de um usuário especial (normalmente ''apache'', ''httpd'' ou ''nobody''), com menos privilégios que o administrador do sistema (//root//);
* **Melhor desempenho**, pois cada processo filho pode tratar uma requisição diferente;
* **Maior robustez**, pois cada filho trata um número máximo de requisições e em seguida encerra sua execução, sendo substituido por um novo filho.
Os principais arquivos e diretórios usados pelo Apache (na distribuição Linux RedHat) são:
* ''/etc/httpd/conf/httpd.conf'' : principal arquivo de configuração
* ''/etc/mime.types'' : tipos MIME e extensões de arquivos conhecidos pelo servidor
* ''/var/log/httpd/'' : arquivos de logs de acessos e erros
* ''/var/www/'' : diretório principal das páginas locais oferecidas pelo servidor
* ''/var/www/html/'' : páginas default do servidor (index.html)
* ''/var/www/cgi-bin/'' : programas executáveis no padrão CGI
* ''/usr/lib/httpd/modules/'' : módulos dinâmicos usados pelo servidor (plugins)
* ''$HOME/public_html/'' : páginas pessoais de cada usuário
A localização dos diretórios pode ser alterada editando-se o arquivo de configuração.
É importante observar que, como os //daemons// do servidor executam sob a identidade de um usuário menos privilegiado, todos os arquivos e diretórios acessíveis aos //daemons// (páginas HTML, CGIs, imagens) devem ter permissões de acesso para terceiros (//others//).
===== Configuração básica =====
O principal arquivo de configuração do Apache é o ''/etc/httpd/conf/httpd.conf''. É um arquivo texto bastante extenso, mas muito documentado e de configuração relativamente simples. Um dos pontos mais importantes desse arquivo é a definição dos serviços acessíveis, que segue uma forma padrão. Eis o exemplo de definição do diretório raiz das páginas locais:
DocumentRoot "/var/www/html"
# Defines how this directory can be accessed by clients.
# This may also be "None", "All", or any combination of "Indexes",
# "Includes", "FollowSymLinks", "ExecCGI", or "MultiViews".
Options Indexes FollowSymLinks ExecCGI
# This controls which options the .htaccess files in directories can
# override. Can also be "All", or any combination of "Options", "FileInfo",
# "AuthConfig", and "Limit"
AllowOverride None
# Controls who can get stuff from this server.
Order allow,deny
Allow from all
===== Controle de acesso a páginas =====
O controle de acesso à páginas pelos clientes é feito com base em diretórios. Além das definições presentes no arquivo de configuração global (cláusulas ''order'', ''allow'' e ''deny'' dentro das definições dos serviços), restrições de acesso podem ser definidas em arquivos separados, para cada diretório. Para isso, deve-se criar um arquivo escondido (com nome ''.htaccess'' por default) no diretório, contendo as definições de acessibilidade para aquele diretório e seus sub-diretórios. Vejamos alguns exemplos:
Para controlar o acesso ao diretório baseado em hosts:
order deny,allow
deny from all
allow from .ppgia.pucpr.br
allow from 200.123.123.123
allow from 10.1
allow from 10.2.0.0/255.255.0.0
allow from 10.3.0.0/16
Para controlar o acesso baseado em usuários/senhas (o arquivo de usuários/senhas deve ser criado através da aplicação ''htpasswd''):
AuthUserFile /home/prof/maziero/passwords.txt
AuthName "Página dos usuários autorizados"
AuthType Basic
require valid-user
Informações mais detalhadas sobre controle de acesso no Apache podem ser encontradas [[http://httpd.apache.org/docs/2.0/howto/auth.html|aqui]].
Para ter mensagens de erro personalizadas:
ErrorDocument 404 /notfound.html
Para usar outra página default para um determinado diretório:
DirectoryIndex filename.html
É importante ressaltar que o uso dos arquivos ''.htaccess'' é regulado pela diretiva de configuração ''AllowOverride'', definida para cada diretório no arquivo de configuração principal.
Uma série de opções interessantes, incluindo o redirecionamento automático de páginas, //mirroring//, etc, podem ser efetuadas através do módulo [[http://httpd.apache.org/docs/2.0/misc/rewriteguide.html|Apache Rewriting]], cuja explanação foge ao escopo deste curso.
===== Páginas pessoais =====
O Apache considera que um recurso designado no formato "''/~usuário/caminho/recurso''" se localiza dentro do diretório pessoal (''$HOME'') do usuário indicado, em um sub-diretório de informações públicas. Por default esse diretório tem o nome "''public_html''", e deve ficar dentro do diretório "''$HOME''" do usuário.
É importante observar que os diretórios contendo páginas pessoais devem estar acessíveis aos //daemons// do Apache. Como estes executam sob a identidade de um usuário não-//root//, as permissões de acesso aos diretórios e arquivos das páginas pessoais devem autorizar o acesso a terceiros.