Académique Documents
Professionnel Documents
Culture Documents
br/~maziero/ensino/svc/http/
Serviço HTTP
O objetivo desta aula é compreender o funcionamento básico de um servidor 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
browser, 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.
Os recursos disponíveis na Internet são acessados através de referências denominadas URLs -
Universal Reference Locators. Uma URL define completamente um serviço 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.
Vejamos como são estruturadas as seguintes URLs de exemplo:
http://www.ppgia.pucpr.br:80/~maziero/index.html
ftp://ftp.ppgia.pucpr.br/pub/cnpq/lattes/ATENCAO.txt
O protocolo HTTP
O HTTP - HyperText Transport Protocol (versão 1.0 em RFC1945 e versão 1.1 em RFC2616) - é
um protocolo textual bastante simples, 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 "http://" e obter
respostas na forma de conteúdos especificados pelo padrão MIME. Um exemplo típico de
solicitação em HTTP é:
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
<html>
<body>
<h1>Funcionou !</h1>
</body>
</html>
Método
Descrição
PUT indica que os dados no corpo da consulta devem ser armazenados na URL
especificada.
Cria um novo objeto ligado ao objeto especificado na URL. Uma URL será alocada
POST 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 Requests that the server delete the information corresponding to the given URL
Os principais status de retorno de métodos HTTP são (veja a RFC 2616 para a lista completa):
202 Accepted
203 Non-authoritive information
226 IM used
3** Redirection 300 Multiple choices
Tipo MIME
Significado
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"
<Directory "/var/www/html">
AllowOverride None
Order allow,deny
Allow from all
</Directory>
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 aqui.
Para ter mensagens de erro personalizadas:
ErrorDocument 404 /notfound.html
<HEAD>
<TITLE>Este é o título desta página</TITLE>
</HEAD>
<BODY>
</BODY>
</HTML>
Programas CGI
O método mais antigo e simples para prover informação dinâmica na WWW é o uso do mecanismo
de programas CGI - Common Gateway Interface. . A tecnologia CGI permite a construção sob
demanda de páginas WWW com conteúdo variável. Ela se baseia na solicitação de execução de um
programa ou script no servidor, que irá gerar uma saída compreensível para o browser no lado do
cliente. Um programa CGI é um arquivo instalado no servidor que, ao ser acessado por um cliente,
é executado e devolve ao cliente o resultado de sua execução.
A configuração default do servidor Apache somente permite a execução de CGIs presentes no
diretório
/var/www/cgi-bin. Essa configuração deve ser alterada caso se deseje habilitar a execução de
CGIs em
outros diretórios, como por exemplo os diretórios $HOME dos usuários. Todavia isso deve ser feito
com
cuidado, para não criar brechas na segurança do sistema.
Um exemplo bastante simples de programa CGI (escrito em shell) está aqui:
#!/bin/sh
Aqui temos outro exemplo mais elaborado, gerando como saída uma página em HTML:
#!/bin/sh
echo "<HTML>"
echo "<HEAD>"
echo "<TITLE>Uma página simples em CGI shell</TITLE>"
echo "</HEAD>"
echo "<BODY>"
echo "<UL>"
echo "<LI>Bem-vindo, usuário em $REMOTE_ADDR</LI>"
echo "<LI>Você está usando o browser $HTTP_USER_AGENT</LI>"
echo "<LI>Este servidor executa em $SERVER_SOFTWARE</LI>"
echo "</UL>"
echo "Esta abordagem somente deve ser usada em páginas muito simples."
echo "</BODY>"
echo "</HTML>"
É possível a criação de CGIs simples com scripts shell, ou mesmo com programas C/C++, mas
essas
linguagens não se prestam à construção de CGIs que devam retornar código HTML, pois a
construção do
mesmo via script shell ou programa C é penosa e pouco eficiente. Para tal objetivo costumam ser
usadas
linguagens apropriadas para tratamento de strings, como Perl ou Python.
Eis um exemplo de programa CGI em Perl. Ele gera uma tabela com informações dos discos locais
do servidor no instante da consulta:
#!/usr/bin/perl
# cabecalho HTTP
print "Content-type: text/html\n\n";
<BODY>
<H1>Situação dos discos locais</H1>
";
# abertura de tabela
print "<TABLE COLS=5 BORDER=2>\n" ;
# fechamento de tabela
print "</TABLE>\n";
Resumindo, programas CGI são códigos executáveis lançados pelo servidor WWW como processos
separados, cujo resultado da execução (saídas geradas em stdout) são enviadas de volta ao browser.
Páginas ativas
Outra forma de gerar conteúdo dinâmico na Web é através do uso de páginas ativas. Neste caso, o
documento HTML contém tags especiais definindo instruções executáveis. Essas instruções são
executadas pelo servidor WWW no momento da consulta, e o resultado é devolvido ao browser.
Atualmente as linguagens para páginas ativas em uso mais freqüentes são:
• PHP: de domínio públio, executa em qualquer plataforma.
• ASP: proprietária, executa sobre plataformas Windows NT.
• JSP: baseada em Java, pode executar na maioria dos ambientes.
A discussão sobre as qualidades e defeitos dessas linguagens foge ao escopo desta aula. Além das
duas linguagens acima, existem outras possibilidades, como Embedded Perl, Python, etc.
Um exemplo simples de página em PHP seria o seguinte:
<HTML>
<BODY>
<?
echo "Ola usuario em $REMOTE_ADDR, tudo bem ?" ;
?>
</BODY>
</HTML>
O código indicado em azul é identificado por tags especiais (<? e ?>) e executado pelo servidor ao
carregar a página. O resultado da execução, sem o código, é retornado ao browser do cliente.
Vejamos outro exemplo mais complexo, no qual uma imagem é gerada dinamicamente:
<?
// Exemplo de criação de imagem
$x = rand (0,60) ;
$y = rand (0,60) ;
ImageRectangle ($im, $x, $y, $x+40, $y+40, $red);
$x = rand (0,60) ;
$y = rand (0,60) ;
ImageRectangle ($im, $x, $y, $x+40, $y+40, $green);
$x = rand (0,60) ;
$y = rand (0,60) ;
ImageRectangle ($im, $x, $y, $x+40, $y+40, $blue);
<html>
<head>
<title>PHP Exemplos - Gráficos</title>
</head>
<body bgcolor = "#FFFFFF">
</body>
</html>
Ao invés de gerar imagens, o código PHP poderia buscar informações em um servidor de bancos de
dados. Dessa forma, o código PHP pode ser considerado o "middle-tier" de um sistema de
informação, que mantém a lógica do negócio. Um exemplo desse funcionamento pode ser
observado no script PHP abaixo:
<HTML>
<BODY>
<?
// variáveis usadas na conexão ao DBMS
$host = "espec.ppgia.pucpr.br";
$user = "xxxxx";
$pwd = "xxxxx";
$base = "cadastro";
$table = "usuarios";
<table border=1>
<tr bgcolor="#AAAAAA">
<td>Nome</td> <td>Endereço</td> <td>Cidade</td> <td>Estado</td>
<td>E-mail</td> </tr>
<tr>
<td> <? echo $reg["nome"] ?> </td> <td> <? echo $reg["ender"] ?> </td>
<td> <? echo $reg["cidade"] ?> </td> <td> <? echo $reg["estado"] ?> </td>
<td> <? echo $reg["email"] ?> </td>
</tr>
<? endfor;
?>
</table>
<? endif;
?>
</BODY>
</HTML>
Atualizado em 31/05/2004.