Instalando um Web Server super leve no Raspberry Pi

O que é um Web Server?

Um Web Server é a aplicação responsável por servir páginas web e disponibilizá-las na internet, ou em termos mais técnicos, captar pedidos HTTP que podem ser páginas da web (em formato de documentos HTML contendo imagens, vídes, textos, etc) ou serviços/funcionalidades.

Construir um web server com o RPi significa tornarmos ele acessível para fornecer páginas HTML ou serviços (relacionados ou não as suas saídas físicas) via internet. Exemplos de projetos: sistema de vigilância via internet, casa automatizada controlado via internet, monitoração (de quase qualquer coisa) à distância. Vamos explorar todos estes projetos aqui no 5 Min Maker em breve.

Raspberry Pi 3 Web Server

Logo de largado tentei utilizar o Flask Web Server conforme sugerido no próprio site da Raspberry Pi e de forma muito rápida tinha uma página web na mão, porém as incursões com fucionalidades mais avançadas como FCGI não deram muito certo.

Rodando pela web encontrei um artigo do Jeremy Morgan que rodou uma série de testes comparando a performance de vários web servers instalados no Raspberry Pi.

O foco dos meus projetos era o tráfego de JPG até 100Mb (entre outros):

comparativo
Comparativo dos WebServer no quesito Transferência de Imagens até 100Mb (fonte: Jeremy Morgan’s blog)

Depois desse artigo fiz minha segundo tentativa com o Lighttpd e foi ‘amor no primeiro sudo’… Tenho certeza que todos tem suas vantagens e desvantagens, porém hoje iremos realizar a instalação e configuração do Lighttp – consulte mais em sua documentação online.

O que você irá precisar antes de começar?

Curiosidade: Novo Case para o RPi 3

Para esta missão, invoquei os poderes dos velhos deuses e do novo e escolhi um case para o RPi 3.

Este case foi uma experiência com impressão 3D. Escolhi o case o Thingverse, fiz o download do arquivo. Escolhi um camarada que tinha um impressora 3D listada no 3DHUB e pelo site enviei o arquivo.

Ficou tudo US$ 20, financeiramente ainda está muito caro para o que oferece como produto, porém para fins de experimentação e prototipagem é muito bom e vale a diversão do processo maker!

Instalando o Lighttpd

Para instalar o Lighttpd em seu Raspberry Pi 3, acesse o Terminal no RPi (caso tenha um monitor plugado nele) ou via SSH do seu laptop (após conectar ao RPi) e digitar:

sudo apt-get install lighttpd

Irá ser iniciado o processo de download dos pacotes e instalação, onde será perguntado se deseja prosseguir após receber a informação de quanto irá ocupar em disco esta nova instalação.

apt-get

Concluída a instalação, podemos testar nosso web server no RPi 3!

Para verificar o estado dos serviços do Lighttpd, digite de qualquer lugar:

 sudo service lighttpd status

Caso queira parar de servir:

sudo service lighttpd stop

E para iniciar:

sudo service lighttpd start

Em alguns momentos vamos precisar forçar o restart, ao invés de stop-start podemos usar:

sudo service lighttpd force-reload

Acesse qualquer o browser de qualquer equipamento em sua rede interna, digite o IP do Raspberry pi e você receberá a página de teste já servida pelo RPi!!

Para descobrir o IP do seu Raspberry Pi, digite ifconfig na linha de comando e verifique nos locais circulados abaixo:

  • etn0: caso esteja conectando via cabo
  • wlan0: caso esteja conectando via wifi

ifconfig

O IP do meu RPi é 10.0.1.9, acessando do meu celular vejo a tela padrão do lighttpd:

lighttpd-cel
Acessando do meu celular via IP 10.0.1.9 digitado no navegador Safari
lighttpd-default
Acessando do próprio Raspberry Pi digitando no browser ‘localhost’ (que tem o mesmo efeito de digitar seu próprio número de IP )

Configurando o Lighttpd

O Lighttpd é um servidor destinado a servir um único site, mesmo que este contenha várias páginas e serviços associados. Vamos alterar algumas configurações e elaborar um página própria para nosso RPi.

Vamos alterar o arquivo de configurações do lighttpd utilizando o editor ‘nano’:

sudo nano /etc/lighttpd/lighttpd.conf

E teremos as seguintes configurações:

server.modules = (
 "mod_access",
 "mod_alias",
 "mod_compress",
 "mod_redirect",
# "mod_rewrite",
)

server.document-root = "/var/www/html"
server.upload-dirs = ( "/var/cache/lighttpd/uploads" )
server.errorlog = "/var/log/lighttpd/error.log"
server.pid-file = "/var/run/lighttpd.pid"
server.username = "www-data"
server.groupname = "www-data"
server.port = 80


index-file.names = ( "index.php", "index.html", "index.lighttpd.html" )
url.access-deny = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

compress.cache-dir = "/var/cache/lighttpd/compress/"
compress.filetype = ( "application/javascript", "text/css", "text/html", "text/plain" )

# default listening port for IPv6 falls back to the IPv4 port
include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
include_shell "/usr/share/lighttpd/create-mime.assign.pl"
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"

Iremos alterar o diretório no qual ele busca pelas páginas HTML, especificamente a página ‘index.html’, que é a qual aparece no seu browser quando você digita o IP do RPi.

Para que possamos ter acesso a livre escrita (sem necessitar de sudo) as páginas do site, vamos colocar o diretório ROOT, algo dentro das pastas do nosso usuário ‘pi’. Então alteramos a linha abaixo para:

server.document-root = "/home/pi/www"

E por diversão, vamos alterar também a porta para 8080. Desta forma obrigando quem consulta a digitar IP:PORTA (ex: 10.0.1.9:8080) – Veja esta material sobre portas

server.port = 8080

Note que o Web Server irá acessar todos os conteúdos necessários para o provimento via HTTP utilizando de seu próprio username e password. Eles estão configurados também neste arquivo

server.username = "www-data"
server.groupname = "www-data"

Caso seja necessário acessos diferenciados para o Web Server, é este usuário que deverá ganhar os acessos devidos para a operação requerida.

Após as alterações acima, para acessar nossa página inicial do Web Server, devemos digitar (no meu exemplo de IP 10.0.1.9) no browser:

10.0.1.9:8080

Se tudo estiver correto deveremos neste momento receber uma página em branco com a informação “404 – Not Found”, pois ainda não fizemos nossa página, nem existe o diretório configurado.

Hello World

Vamos criar o diretório para acomodar nossa ‘index.html’ de acordo com nossa configuração prévia do ROOT do nosso web server. No terminal digite (estando no diretório /home/pi, normalmente indicado pelo ‘~‘ no cursos ‘pi@raspberry: ~$’).

mkdir www

Ou caso você esteja no PIXEL, pode criar a pasta através do ‘Gerenciador de Arquivos’ > ‘Criar Pasta’. Assegure de criar abaixo do diretório ‘home/pi’.

Agora vamos criar uma página HTML simples para ser nosso ‘index.html’. Via terminal iremos até o diretório que recém criamos e abriremos o ‘nano’ para construir nossa página (assumindo que você ainda esteja em /home/pi)

cd www

sudo nano index.html

Este último comando irá criar a index.html, pois o editor entende que quando o arquivo mencionado não existe você pretende criá-lo.

Nossa página será:

RPI3 WWW


Hello World

Bem vindos a nossa ‘index.html’ customizada

Para gravar (ou sair) no ‘nano’ digite:

  • CTRL+X : será questionado se deseja ou não salvar (S/N ou Y/N caso inglês)
  • Verifique o nome do arquivo ou altere e tecle ENTER

Agora acessando nossa página via qualquer browser (10.0.1.9:8080), receberemos a página:

helloworld
Web Server configurado e pronto para o combate!

Segue o link para aprender como criar HTML melhores.


Habilitando Módulos Fast CGI

Apesar de não utilizarmos neste capítulo, já preparando para futuras interações de páginas dinâmicas web com programas residentes  no RPi (ex: controlar uma luz via internet), vamos habilitar e configurar as interfaces CGI e Fast CGI (ou FCGI)

Para nossos projetos iremos utilizar a interface Fast CGI e vamos deixá-la habilitada:

sudo lighttpd-enable-mod fastcgi

Verifique se retornou um OK de FastCGI habilitada.

Agora faremos o reboot do Lighttpd, não irá resetar o RPi e dura menos de 1 segundo:

sudo service lighttpd force-reload

Precisamos configurar para interpretar arquivos PYTHON quando necessário.

Os arquivos de configuração para FCGI estarão no diretório

cd /etc/lighttpd/conf-enabled

Confirme listando os arquivos neste diretório:

ls -la

Deveremos ter listados:

  • 10-fastcgi.conf
  • 90-javascript-alias.conf

Editamos o arquivo de configuração do FastCGI

sudo nano 10-fastcgi.conf

Adicionando as linhas ao final, PYTHON será interpretado pelo servidor como FCGI.

server.modules += ( "mod_fastcgi" )
fastcgi.server = ( ".py" => ( "python-fcgi" => (
                              "socket" => "/tmp/fastcgi.python.socket",
                              "bin-path" => "/home/pi/www/cgi-bin/fcgi.py",
                              "check-local" => "disable",
                              "max-procs" => 1))
)

Na diretiva ‘BIN-PATH’ será o diretório (pode ser alterado para estar de acordo com seu diretório) onde colocaremos os arquivos de FCGI.

/home/pi/www/cgi-bin

Neste exemplo indiquei o arquivo ‘fcgi.py’ como sendo o FCGI default (caso o lighttpd não encontre nenhum) e iremos criá-lo vazio. Porém antes vamos criar o diretório CGI-BIN para armazenar nossos programas interfaces FCGI.

cd /home/pi/www

mkdir cgi-bin

Criado o diretório, criaremos o arquivo ‘fcgi.py’:

cd cgi-bin

sudo nano fcgi.py

Neste momento o arquivo possuirá apenas uma linha indicando que este arquivo (a se tornar um shell script) será compilado (quando chamado) pelo Python residendo (em usr/bin) no Raspbian do nosso Raspberry Pi.

!# /usr/bin/python

Devemos agora transformar o arquivo em executável e garantir o acesso necessário para sua execucação, através do comando:

sudo chmod 755 fcgi.py

Ok para o momento.

Vamos deixar também configurada a interface CGI, que opera um pouco diferente da FCGI – para saber mais sobre estas interfaces consultei um blog bem bacana do Klaus Laube – massa!

Edição para o conf do CGI

sudo nano /etc/lighttpd/conf-enabled/10-cgi.conf
server.modules += ( "mod_cgi" )
alias.url += ( "/cgi-bin/" => "/home/pi/www/cgi-bin")
$HTTP["url"] =~ "^/cgi-bin/" { cgi.assign = ( "" => "" ) }

DC

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

w

Conectando a %s