O tutorial de hoje vamos configurar o Apache para rodar Shell Script e Python como exemplos, mas você pode testar em qualquer linguagem de programação de seu interesse. Também vamos usar de cobaia o Arch Linux, mas com mínimas adaptações é o mesmo procedimento pra qualquer Linux ou BSD, e até mesmo qualquer sistema baseado em UNIX.
Let’s go! ✌
- 1º - Atualize todo o sistema de maneira efetiva com os dois comandos abaixo
sudo pacman -Syy
sudo pacman -Syu
- 2º - Instale o Apache
sudo pacman -S apache
- 3º - Habilite o Apache para iniciar junto com o sistema e também start para já poder usá-lo:
sudo systemctl enable httpd.service
sudo systemctl start httpd.service
- Por padrão o conteúdo que acessa pelo localhost está no endereço /srv/http/ lá após instalação não haverá nada, então crie um arquivo index.html e insira um conteúdo nele para poder visualizar, use um editor de texto ou com o comando abaixo:
Lembre-se que dentro deste diretório precisa ser root ou sudo , não tente
sudo echo
echo 'Minha pagina HTML' | sudo tee /srv/http/index.html
Agora abra o navegador e acesse o endereço: http://localhost/ , você verá o conteúdo que você escreveu.
Usando um diretório alternativo sem precisa de root ou sudo
Os diretórios de usuários estão disponíveis por padrão através de http://localhost/~usuario/ e mostram o conteúdo de ~/public_html
Note que há o sinal til (~) na URL, logo digite ela também antes do seu nome de usuário, caso contrário haverá erro 404, exemplo:
Mas para criar uma visualização customizada é necessário criar o diretório, alterar as permissões e criar um arquivo html:
mkdir ~/public_html
chmod o+x ~
chmod o+x ~/public_html/
chmod o+r ~/public_html/
echo 'Teste de página WEB com diretorio do usuario' > ~/public_html/index.html
sudo systemctl restart httpd.service
Depois acesse o endereço: http://localhost/~seu_usuario/
Entendimentos básicos
O Apache possui opções e diretivas <Directory ..i> para determinar suas configurações.
O arquivo de configuração principal é /etc/httpd/conf/httpd.conf , que inclui vários outros arquivos de configuração. Ao abrir ele verifique que as linhas que estão descomentadas(sem começar com tralha #), quer dizer que já estão pré-configuradas pra você, vejamos alguns exemplos:
- ServerRoot “/etc/httpd” - Diretório raíz do Apache onde ficam os arquivos de configuração /etc/httpd/conf/ e os módulos /etc/httpd/modules/
- Listen 80 - Porta que o servidor irá exibir as páginas na Web via http, se quiser que fique acessível só pra seu computador e ninguém consiga acessar externamente altere para Listen 127.0.0.1:80
- ServerAdmin you@example.com - Este é o endereço de e-mail do administrador, que pode ser encontrado, por exemplo, em páginas de erro. Se quiser altere para o que você deseja.
- DocumentRoot “/srv/http” - Este é o diretório onde você deve colocar suas páginas da web. Você pode alterá-lo, mas não se esqueça de também alterar
<Directory "/srv/http">
para o que você mudou seu DocumentRoot , ou você provavelmente vai ter um erro 403 (falta de privilégios) quando você tenta acessar a nova raiz do documento. Não se esqueça de alterar a linha Require all denied para Require all granted , caso contrário, você receberá um erro 403 . Lembre-se de que o diretório DocumentRoot e suas pastas pai devem permitir permissão de execução para outros (pode ser configurado com chmod o+x /path/to/DocumentRoot ), caso contrário você obterá um erro 403 . - AllowOverride None - Esta diretiva nas seções <Directory> faz com que o Apache ignore completamente os arquivos .htaccess . Observe que esse é o padrão do Apache 2.4, portanto, é necessário permitir explicitamente substituições se você planeja usar arquivos .htaccess . Se você pretende usar mod_rewrite ou outras configurações em arquivos .htaccess , pode permitir quais diretivas declaradas nesse arquivo podem substituir a configuração do servidor.
- ServerSignature Off - Para ocultar informações do servidor, como as versões do Apache, linguagem, sistema operacional…
- Include conf/extra/httpd-userdir.conf - Se você não quiser que os diretórios dos usuários estejam disponíveis na web, comente essa linha. Ou se quiser alterar o nome e/ou localização do mesmo, edite o arquivo: /etc/httpd/conf/extra/httpd-userdir.conf.
- Entre outras opções e diretivas que podem ser vistas no próprio arquivo.
Habilitando Shell Web cgi
Introdução
O CGI (Common Gateway Interface) define uma maneira de um servidor da Web interagir com programas geradores de conteúdo externos, que são geralmente chamados de programas CGI ou scripts CGI. É uma maneira simples de colocar conteúdo dinâmico em seu site, usando qualquer linguagem de programação com a qual você esteja mais familiarizado.
-
1º - Procure no arquivo de configuração do Apache /etc/httpd/conf/httpd.conf a linha que possui esse conteúdo LoadModule cgid_module modules/mod_cgid.so ou algo parecido, use um editor de texto (por exemplo, no Vim /LoadModule cgid_module.* ) ou se quiser procurar diretamente pelo terminal, rode: egrep 'LoadModule cgid_module modules.*' /etc/httpd/conf/httpd.conf . Verifique que ela estará comentada (com uma tralha # na frente) , mais ou menos assim: #LoadModule cgid_module modules/mod_cgid.so , tire a tralha da frente e deixe mais ou menos assim: LoadModule cgid_module modules/mod_cgid.so
-
2º - Próximo passo é verificar se a linha correspondente ao ScriptAlias está descomentada, procure a linha ScriptAlias /cgi-bin/ "/srv/http/cgi-bin/", geralmente ela já está descomentada e pronta pra uso e também pode ser que ela esteja apontando para outro diretório, lembre-se desse diretório, pois é lá que você guardará seus scripts. Isso quer dizer que você vai guardar no diretório /srv/http/cgi-bin/ , mas acessará o conteúdo pelo endereço: http://localhost/cgi-bin/ . Se o diretório não existir, crie: sudo chmod -p /srv/http/cgi-bin/ .
-
3º - Permitir a execução de CGI utilizando a diretiva Options . Encontre as tags mais ou menos iguais a essa abaixo, na sua distro pode ser que esteja com o caminho diferente, mas esse exemplo é no Arch Linux, mas serve pra qualquer distro:
<Directory "/srv/http/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
Altere e insira a linha Options +ExecCGI antes de AllowOverride None, ficando assim:
<Directory "/srv/http/cgi-bin">
Options +ExecCGI
AllowOverride None
Options None
Require all granted
</Directory>
Não esqueça de ir salvando o arquivo a cada alteração correta feita.
- 4º - O quarto passo é adicionar a diretiva AddHandler as extensões de arquivo que você deseja que ele aceite, encontre a linha que tem a palavra Addhandler e altere como deseja, por exemplo, ela vai estar mais ou menos assim:
Essa palavra pode ser encontrada em outros lugares do arquivo, mas a única linha que não possui tralha # na frente, é justamente a que você deve alterar.
AddHandler cgi-script .cgi
Vamos supôr que você vai querer rodar no seu servidor extensões Shell Script .sh , Python .py e Perl .pl , então deixe ela assim:
AddHandler cgi-script .cgi .sh .py .pl
Além, lógico, dos arquivo com extensão .cgi que provavelmente haverá qualquer linguagem de programação, e quem irá identificar é SheBang #!/bin/linguagem que estará no arquivo.
- 5º - Criando um arquivo de teste para verificarmos se já está tudo ok, exemplo para shell script:
sudo vim /srv/http/cgi-bin/teste.sh
Dentro do arquivo coloque esse conteúdo:
Obs.: Respeite a linha em branco logo abaixo da shebang um echo vazio logo abaixo de echo "content-type: text/html" também precisa ser respeitado, caso contrário haverá erro exibido pelo apache.
Arquivo exemplo:
#!/bin/bash
echo "content-type: text/html"
echo
echo
echo "
<html> <head> <meta charset='utf-8' /> <title> CGI script </title> </head>
<body>
<h1>Algumas informações sobre a máquina que o CGI está rodando:</h1>
"
echo "<h4>uptime</h4>"
echo "<pre>$(uptime)</pre>"
echo "<h4>uname</h4>"
echo "<pre>$(uname -a)</pre>"
echo "<h4>/proc/cpuinfo</h4>"
echo "<pre>$(cat /proc/cpuinfo)</pre>"
echo "
</body>
</html>
"
Exemplo Python:
#!/usr/bin/python
print("Content-Type: text/plain;charset=utf-8")
print("")
print("Hello World!")
- 6º - Dando as permissões necessárias para o Apache ler o navegador ler o arquivo e o diretório :
sudo chmod -R a+x /srv/http/cgi-bin/
Reinicie o Apache
sudo systemctl restart httpd
- 7º - Agora abra o navegador e acesse o endereço: http://localhost/cgi-bin/teste.sh e veja o conteúdo!
Clique Aqui Para Assistir ao Vídeo
Solução de possíveis problemas
- O Apache usa um programinha chamado suexec que serve pra gerar problemas de permissão ☹ . Verifique ele está habilitado e carregado com o Apache, use o comando: apachectl -V se na saída houver a uma linha com o conteúdo: -D SUEXEC_BIN=”/usr/bin/suexec” , tente renomear ele e reiniciar o Apache e depois verifique se agora funcionou a exibição via browser:
sudo mv /usr/bin/suexec /usr/bin/suexec_tchau
sudo systemctl restart httpd
- Se aparecer mensagens como: Proibido, POST Method Not Allowed,… Verifique os logs de erro lá em /var/log/apache_ou_http/ .
- Problemas com caracteres em Hexadecimais em requições POST ou GET ? Haha, aí é seu programinha que irá resolver, esse não é um problema do Apache, no entanto, existem alguns módulos que podem lhe ajudar, mas vai por mim, é melhor você mexer a cuca e tentar resolver com sua linguagem de programação! ☻
Dicas adicionais
- Se quiser que o Apache leia seus index.sh, index.py,… encontre a palavra index.html e ao lado dela inclua os indexes que deseja, exemplo:
DirectoryIndex index.html index.sh index.py
- Você pode habilitar o TLS;
- Criar uma chave e um certificado (autoassinado) OpenSSL CSR
- Virtual Hosts /etc/hosts
- Integração com MySQL e PHP.
- Protocolo HTTPS.
Conheça nosso Treinamentos de Shell Script, Vim, Expressões Regulares e Sed
http://terminalroot.com.br/cursos
Crie Sua Promoção
http://terminalroot.com.br/promo
Acompanhe todos os vídeos da Série Shell Script Profissional
#ShellPro
Links Úteis
- http://apache.org/
- https://httpd.apache.org/docs/2.4/mod/directives.html
- http://httpd.apache.org/docs/current/howto/cgi.html
- https://wiki.gentoo.org/wiki/Apache/pt-br
- https://wiki.archlinux.org/index.php/Apache_HTTP_Server
- http://terminalroot.com.br/2015/09/habilitando-cgi-e-sh-no-apache-do.html