====== 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.