FUG-BR / Grupo Brasileiro de Usuarios de FreeBSD
Instalando Lighttpd com PHP, MySQL, Virtual hosting, WebDAV, Autenticao e Userdir
Por Daniel Bristot de Oliveira   
20/06/2006
ImageO lighttpd é um servidor web leve, rápido, seguro e flexível que tem seu desenvolvimento voltado para ambientes de alta performance.

Uma de suas qualidades é o baixo consumo de memória; além disso, benchmarks mostram que ele possui um rendimento superior a vários outros servidores.


Por quê utilizá-lo?

  • Ele é compatível com sistemas Unix como os BSD, Linux, SGI IRIX, além de sistemas Windows com o CygWin.
  • Consome poucos recursos.
  • Ótimo desempenho frente a outros servidores.
  • Interface de configuração limpa e clara, facilitando administração.
  • Suporte a PHP e MySQL.
  • É livre, seguro e estável.

Características

Algumas características:

  • Virtual Host
  • Listagem virtual de diretórios
  • Re-escrita de URL, redirecionamento HTTP
  • Suporte a arquivos grandes
  • Compressão de arquivos de saída com chace transparente (redução gzip, bzip2)
  • Autenticação (basic, digest)
  • backends: plain , htpasswd, htdigest, ldap
  • Downloads rápidos e seguros
  • Server Side Includes
  • Identificação de usuários
  • FastCGI, CGI, SSI

PHP-Support:

  • Desempenho igual ou superior ao apache + mod_php4
  • Suporte a múltiplos processos do PHP via interface FastCGI e CGI
  • suporte a "Code Caches" como Turckmm, APC e eaccelarator
  • FastCGI com Balanceamento de carga (Um servidor web distribuindo cagar para vários servidores PHP)

Instalando

O lighttpd pode ser instalado via ports: a localização do lighttpd no ports é /usr/ports/www/lighttpd. Entre o no diretório e execute o comando make install

# cd /usr/ports/www/lighttpd
# make install

Após isto irá aparecer a seguinte tela no terminal.

Tela de configurao do ports lighttpd

Nela é possível escolher algumas opções de compilação para o lighttpd. Neste caso desabilitarei todas as opções.

OBS: O MySQL deste menu não se refere a ligação do MySQL com o PHP.

Após isto a instalação deverá terminar sem mais perguntas.


Configuração do Sistema Operacional

O arquivo de inicialização do lighttpd fica em /usr/local/etc/rc.d/lighttpd.sh; para ativar a inicialização do lighttpd como sistema operacional basta adicionar lighttpd_enable="YES" ao /etc/rc.conf.

Provavelmente na primeira inicialização irão acontecer alguns erros, já que na instalação o diretório base onde ficarão as páginas e os arquivos de log não foram criados. Para eliminar esses problemas, crie os seguintes diretórios e arquivos:

# mkdir /usr/local/www/data/
# touch /var/log/lighttpd.access.log
# touch /var/log/lighttpd.error.log
# chown www /var/log/lighttpd.access.log
# chown www /var/log/lighttpd.error.log

Agora o lighttpd irá iniciar normalmente.

Para testar crie um arquivo como o nome index.html em /usr/local/www/data/ e acesse via browser a sua máquina; se a página aparecer, obviamente, tudo ocorreu bem.


Configuração Básica do Lighttpd

O arquivo de configuração do lighttpd fica em /usr/local/etc/lighttpd.conf, e somente o usuário root pode editá-lo.

O arquivo de configuração no início parece ser um pouco complicado, porém com o tempo ele se torna simples e fácil de trabalhar. As linhas que iniciam com o caractere "#" são conseideradas comentários.

As atribuições de valores a diretivas são feitas da seguinte forma:

Para uma diretiva mono valorada: diretiva = "valor" Ex:

server.document-root = "/usr/local/www/data/"

Para diretivas multi valoradas: diretiva = ("valor 1", "valor 2")

OBS: são aceitas quebras de linha entre valores, como no exemplo abaixo.

Ex:

index-file.names = ( "index.php", "index.html",
"index.htm", "default.htm" )

Vamos observar algumas das diretivas mais importantes do lighttpd.conf:

Diretiva server.modules:
Esta diretiva define os módulos que estão ativos durante a execução do lighttpd. Esta diretiva contém uma série de linhas comentadas; para habilitar algum módulo basta descomentar a linha referente ao mesmo. Lembre-se de habilitar apenas os módulos que você irá utilizar.

Diretiva server.document-root.
Define o caminho para o diretório inicial, que por padrão é /usr/local/www/data/. Altere-o como quiser. Uma boa dica é /var/www/HOSTNAME, onde HOSTNAME é o nome do seu domínio.

Diretiva server.errorlog
Define o arquivo de log de erros.

Diretiva accesslog.filename
Define o arquivo de log de acesso.

Diretiva index-file.names
Define o nome dos arquivos de index que o servidor deve procurar. A ordem em que eles estão dispostos influencia na escolha.

Diretiva server.username
Define o UID que o servidor irá executar.

Diretiva server.groupname
Define o GID que o servidor irá executar.


Integrando com o PHP e MySQL

A integração do PHP e MySQL é feita através do FastCGI, apenas uma coisa que deve-se ter em mente, é que o MySQL não está ligado ao servidor Web mas sim ao PHP. Primeiramente iremos instalar o PHP, Partimos do pre-suposto que você já tem o MySQL instalado, caso não tenha, siga o exemplo de instalação do MySQL a partir do meu tutorial do Postfix.


Instalando o PHP

O PHP será instalado via ports, para isto entre no diretório /usr/ports/lang/phpX, onde X é a versão do php, atualmente 4 ou 5, e execute o seguinte comando.

# make config

Aparecerá a seguinte tela.

php_cgi.jpg

Habilite as mesmas opções e instale o PHP com o seguinte comando.
# make install

O PHP está instalado. agora vamos integrar com o MySQL

Um módulo do php irá fazer a ligação entre o MySQL e o PHP, ele está disponível no ports. Para instalar execute os seguintes comandos.

# cd /usr/ports/databases/phpX-mysql # (onde X é a versão do PHP)
# make install

Configurando o lighttpd com o PHP

Na diretiva server.modules, descomente a linha referente ao "mod_fastcgi". e adicione as linhas abaixo em algum lugar no arquivo de configuração.

fastcgi.server             = ( ".php" =>
( "localhost" =>
(
"socket" => "/tmp/php-fastcgi.socket",
"bin-path" => "/usr/local/bin/php",
"min-procs" => 3,
"max-procs" => 5,
"idle-timeout" => 20,
"max-load-per-proc" => 10,
)
)
)

Onde:

socket é onde ficará os sockets de comunicação entre o lighttpd e o PHP.
bin-path é onde está localizado o executável do PHP.
min-procs Número mínimo de processos do PHP que ficarão esperando trabalho.
max-procs Número máximo de processos do PHP que ficarão esperando trabalho.
idle-timeout Tempo que um processo do PHP ficará vivo sem trabalho, após este tempo ele morre
max-load-per-proc média de carga máxima em um processo antes de um novo processo ser lançado.

As opções referentes ao número de processos tem uma grande influência no desempenho do servidor, faça testes e ache os melhores valores par a seu sistema. Se sob muita carga seu servidor acusar erro "500 internal server error" aumente o número de processos do PHP.

Para testar se tudo está certo, crie um arquivo chamo info.php, no document-root de se servidor, com o seguinte conteúdo

<?php
phpinfo();
?>

Caso abrir a página de informações do PHP tudo deu certo.


Configurando Userdir

Habilite o módulo mod_userdir descomentando a sua linha na diretiva server.modules, e insira as seguintes linhas no arquivo de configuração.

userdir.path = "public_html"
userdir.basepath = "/home/"

O caminho do diretório do usuário é formado por: "userdir.basepath"/"Usuário"/"userdir.path". Para o usuário daniel, o caminho de seu diretório seria /home/danie/public_html.


Virtual Host

Virtual host é um meio de um servidor web ser capaz de servir páginas para diversos domínios.

O lighttpd ofereçe três modulos para habilitar esta característica. mod_evhost, mod_mysql_vhost e mod_simple_vhost. Neste artigo trataremos a utilização do modulo mod_simple_vhost.

Este é o método mais simples para a criação de hosts virtuais, ele exige a configuração de apenas três diretivas. simple-vhost.server-root

Caminho para o diretório raiz de cada host virtual.

simple-vhost.default-host

O host virtual padrão

simple-vhost.document-root

Diretório que contém a página inicial sobre o diretório do host virtual

O caminho para o diretório raiz do servidor virtual é formado por:

simple-vhost.server-root + Hostname + document-root

Exemplo:

simple-vhost.server-root = "/var/www/"
simple-vhost.default-host = "www.examplo.org"
simple-vhost.document-root = "pages"

O caminho para o index do host vitual dominio.net seria:

/var/www/dominio.net/pages/

Para a ativação de um domínio virtual, basta o diretório formado pelas diretivas existir.

Caso o caminho do dominio solicitado não exister, o endereço definido em simple-vhost.default-host será exibido, neste caso www.examplo.org.


Uso de condicionais

Em alguns casos o caminho pode não ser o obtido apartir das configurações do módulo simple-vhost. Esta situação pode ser resolvilda com a utilização de condicionais, como no caso abaixo, quando solicitado o dominio dbristot.info o conteúdo do deiretório /var/www/userdir/daniel será exibido.

$HTTP["host"] == "dbristot.info" {
server.document-root = "/var/www/userdir/daniel"
}

Isto é útil para fazer alias de hosts virtuais. Como por exemplo, para que dominio.net e www.dominio.net obtenham o mesmo caminho.

$HTTP["host"] == "www.dominio.net" {
server.document-root = "/var/www/dominio.net/pages/"
}

WebDAV

O webDAV é um método para troca de arquivos via protocolo HTTP1.1

Para habilitar o módulo do WebDAV basta adicionar mod_webdav na lista de móbulos.

Existem duas diretívas de configuração para o WebDAV.

webdav.activate

Habilita ou desabilita o WebDAV para um diretório.
Padrão: disable (desabilitado)

webdav.is-readonly

Acesso somente leitura
Padrão: writable (gravável)

Exemplo: Para habilitar o WebDAV como somete-leitura para os diretórios que tenham o nome 'dav'.

$HTTP["url"] =~ "^/dav($|/)" {
webdav.activate = "enable"
webdav.is-readonly = "enable"
}

Autenticação

O módulo mod_auth é responsável pela autenticação no Lighttpd.

O lighttpd suporta os dois métodos de autenticação definidos na RFC 2617:

basic

O mérodo basic transfere o nome de usuário e senha em texto puro pela rede, apenas os codifica em base64.

digest

O método digest envia apenas uma valor md5; assim tornando-o mais seguro que o basic.

Dependendo do método o lighttpd oferece diferentes meios para armazenamento de senhas.

Para o método basic:

plain
Armazena as senhas em formato texto puro
htpasswd
Armazena as senhas em formato md5, porém nescessita do htpasswd, disponivel no Apache
htdigest
Armazena as senhas em formato md5, nescessita apenas de um script.
ldap
Utiliza base de dados Ldap

Para o métodoor digest:

plain
htdigest

Aquí utilizaremos o método digest com htdigest para armazenamento de senhas.


Gerando base de dados de usuário

Será necessário o script abaixo para a criação do arquivo de senha.

#!/bin/sh
user=$1
realm=$2
pass=$3

hash=`echo -n "$user:$realm:$pass" | md5 | cut -b -32`

echo "$user:$realm:$hash"

Salve o script com o nome htdigest.sh. Para utiliza-lo entre com os parametros Usuário Descrição Senha e desvie a saída para o arquivo de senha, como abaixo:

# ./htdigest.sh usuario Local senha >> /usr/local/etc/htdigest

Verificando...
# cat /usr/local/etc/htdigest
daniel:Download:3a99e549592d6163659b6b0e5d0a8b0f
usuario:Local:6b063763659086818e455206bcc95e7e

Configurando o lighttpd para autenticação

Descomente a linha referente ao módulo "mod_auth".

Diretívas de configuração: auth.debug

Define o mode debug. 0 para desativo, 1 para log de usuário, e 2 para debug. default=0

auth.backend

Define o método de altenticação.

auth.backend.<MÉTODO DE ALTENTICAÇÃO>.userfile

Define o caminho para o arquivo de senhas. Altere o <MÉTODO DE ALTENTICAÇÃO> pelo método utilizado, por exemplo htdigest.

Para a autenticação ter efeito precisamos de

auth.require               = ( <lado esquedo da url> =>
(
"method" => "digest"/"basic",
"realm" => <realm>,
"require" => "usuário=<username>|valid-user"
)
)
Por exemplo:
auth.debug = 0
auth.backend = "htdigest"
auth.backend.htdigest.userfile = "/usr/local/etc/htdigest"

auth.require = ( "/dav" =>
(
"method" => "digest",
"realm" => "Pasta da Web",
"require" => "valid-user"
),
)

Atenção com o abrir e feixar de chaves, as veses isto causa erros estranhos.


Comentrios
Excelente contribuicao Daniel
Por xffa em 20/06/2006 17:35:58
Muito bom, este e um servidor que merece mesmo ser conhecido, pois muitas vezes substitui, com vantagems, outros web servers.
Excelente
Por Este endereo de e-mail est sendo protegido de spam, voc precisa de Javascript habilitado para v-lo em 20/06/2006 20:05:09
Achei esta como alternativa do Apache, MUITO interessante. Andei fazendo alguns testes com Guilherme Rosrio, e achamos muito simples, leve, e totalmente customizvel, realmente, vale a pena d uma olhada. O artigo ento, est espetacular. 
 
Valeu :)
Obrigado
Por Este endereo de e-mail est sendo protegido de spam, voc precisa de Javascript habilitado para v-lo em 20/06/2006 20:49:20
Muito Obrigado pelos comentrios. Isto motiva a criar mais artigos.
Por Este endereo de e-mail est sendo protegido de spam, voc precisa de Javascript habilitado para v-lo em 24/06/2006 14:12:59
Parabns pelo artigo, est muito bem escrito!  
Abrao!
Servidor de Imagens
Por Paulo Acosta em 13/07/2006 17:49:23
J usou alguma vez o tHTTPd !? qual acha mais leve para servir apenas imagens !?
VYbHxLqmmqNItLj
Por Lindsay em 19/02/2012 14:27:30
dqEJJgVFqOU
Por Tinevimbo em 24/10/2012 00:31:56
Hi Monji,Thanks for explaining this litlte gem.I have a quick question though. I have a main domain with a number of add-on domains and my hosting provider uses cPanel. So my .htaccess file contain a number of entries, like this:RewriteEngine onRewriteCond %{HTTP_HOST} ^drunkenthumbs.co.uk$ [OR]RewriteCond %{HTTP_HOST} ^www.drunkenthumbs.co.uk$RewriteRule ^/?$ http\:\/\/drunkenthumbs\.com [R=301,L]RewriteCond %{HTTP_HOST} ^autocentrechorley.com$ [OR]RewriteCond %{HTTP_HOST} ^www.autocentrechorley.com$RewriteRule ^/?$ http\:\/\/autocentrechorley\.co\.uk [R=301,L]As you can see, the format is slightly different to what you have, should I change it to reflect yours, or leave it as is (just removing the extra line I don't need)? Also, do I need the statement RewriteBase / once for each domain, or just once at the top of the file?Thank you.Richard.
Time-out autenticao
Por Andr Lessa em 02/04/2014 14:37:49
Gostaria de saber se tem como colocar um "time-out", ou seja, depois de certo tempo acessando o servidor ele pedir novamente a senha autenticao? 
 
Grato 
Andr Lessa


Comente!*
Nome:
E-mail
Homepage
Ttulo:
Comentrio:

Cdigo:* Code

ltima Atualizao ( 25/08/2006 )