Pesquisa de site

Instalando FcgiWrap e habilitando linguagens dinâmicas Perl, Ruby e Bash no Gentoo LEMP


Este tutorial está estritamente relacionado ao anterior sobre instalação LEMP no Gentoo e trata de outros problemas estendidos do servidor, como habilitar linguagens de script dinâmicas como Perl ou Bash ou Ruby através do Fcgiwrap Gateway e editar arquivos de configuração de hosts virtuais Nginx para veicular conteúdo dinâmico usando scripts .pl, .rb e .cgi.

Requisitos

  1. Pilha LEMP instalada no Gentoo – https://linux-console.net/install-lemp-in-gentoo-linux/

Passo 1: Habilite FCGIWRAP no Gentoo LEMP

Fcgiwrap faz parte da Nginx FastCGI Common Gateway Interface que processa outras linguagens de script dinâmicas, como scripts Perl ou Bash ou Ruby, funciona processando solicitações recebidas do Nginx, por meio de TCP ou Unix Sockets, de forma independente, retorna o resultado produzido ao Nginx, que, a prazo, encaminhará as respostas aos clientes finais.

1. Vamos primeiro começar instalando o processo FCcgiwrap no Gentoo Linux usando o seguinte comando.

emerge --ask www-misc/fcgiwrap

2. Por padrão o pacote Fcgiwrap não fornece nenhum script init no Gentoo para gerenciar o processo. Depois que os pacotes forem compilados e instalados, crie os seguintes scripts init que ajudam você a gerenciar o processo Fcgiwrap usando três abordagens: iniciando o processo usando Unix Domain Sockets ou usando Soquetes TCP ou usando ambos ao mesmo tempo.

Usando script de soquete TCP

Crie um arquivo init no caminho /etc/init.d/ com o seguinte conteúdo de arquivo.

nano /etc/init.d/fcgiwrap

Adicione o seguinte conteúdo do arquivo.

#!/sbin/runscript

ip="0.0.0.0"
port="12345"

start() {
ebegin "Starting fcgiwrap process..."
       /usr/sbin/fcgiwrap -s tcp:$ip:$port &
        tcp_sock=`netstat -tulpn | grep fcgiwrap`
        echo "Socket details: $tcp_sock"
eend $? "Errors were encountered while starting fcgiwrap process"
}

stop() {
ebegin "Stopping fcgiwrap process..."
                pid=`ps a | grep fcgiwrap | grep tcp | cut -d" " -f1`
kill -s 1 $pid
                tcp_sock=`netstat -tulpn | grep fcgiwrap`
                 if test $tcp_sock =  2> /dev/null ; then
                 echo "Fcgiwrap process successfully stoped"
                tcp_sock=`netstat -atulpn | grep $port`
                if test $tcp_sock =  2> /dev/null ; then
                echo "No open fcgiwrap connection found..."
                else
                echo "Wait to close fcgiwrap open connections...please verify with 'status'"
                echo -e "Socket details: \n$tcp_sock"
                 fi
                else
                echo "Fcgiwarp process is still running!"
        echo "Socket details: $tcp_sock"
        fi
eend $? "Errors were encountered while stopping fcgiwrap process..."
}

status() {
ebegin "Status fcgiwrap process..."
      tcp_sock=`netstat -atulpn | grep $port`
    if test $tcp_sock =  2> /dev/null ; then
                       echo "Fcgiwrap process not running"
                     else
                echo "Fcgiwarp process is running!"
                 echo -e "Socket details: \n$tcp_sock"
                fi
eend $? "Errors were encountered while stopping fcgiwrap process..."
}

Como você pode ver, o arquivo de script contém duas variáveis no início, respectivamente ip e port. Altere essas variáveis de acordo com suas próprias necessidades e certifique-se de que elas não se sobreponham a outros serviços em seu sistema, especialmente a variável de porta – o padrão aqui é 12345 – altere de acordo.

Usar 0.0.0.0 na variável IP permite que o processo ligue e escute em qualquer IP (acessível externamente se você não tiver um firewall), mas por razões de segurança você deve alterá-lo para ouvir apenas localmente, em 127.0.0.1, a menos que você tenha outros motivos, como configurar remotamente o gateway Fcgiwrap em um nó diferente para desempenho ou balanceamento de carga.

3. Depois que o arquivo for criado, anexe as permissões de execução e gerencie o processo daemon usando opções de início, parada ou status. A chave de status mostrará informações relevantes do soquete, como o par IP-PORT que ele escuta e se alguma conexão ativa foi inicializada. Além disso, se o processo tiver conexões ativas no estado TIME_WAIT, você não poderá reiniciá-lo até que todas as conexões TCP sejam fechadas.

chmod +x /etc/init.d/fcgiwrap
service start fcgiwrap
/etc/init.d/fcgiwrap status

Usando script de soquete Unix

Conforme apresentado anteriormente, o Fcgiwrap pode ser executado simultaneamente usando ambos os soquetes, portanto, alteraremos ligeiramente o nome do segundo script para fcgiwrap-unix-socket, para garantir que ambos possam ser iniciados e executados ao mesmo tempo.

nano /etc/init.d/fcgiwrap-unix-socket

Use o seguinte conteúdo de arquivo para soquete UNIX.

#!/sbin/runscript
sock_detail=`ps a | grep fcgiwrap-unix | head -1`

start() {
ebegin "Starting fcgiwrap-unix-socket process..."
        /usr/sbin/fcgiwrap -s unix:/run/fcgiwrap-unix.sock &
        sleep 2
        /bin/chown nginx:nginx /run/fcgiwrap-unix.sock
        sleep 1
        sock=`ls -al /run/fcgiwrap-unix.sock`
        echo "Socket details: $sock"
eend $? "Errors were encountered while starting fcgiwrap process"
}

stop() {
ebegin "Stopping fcgiwrap-unix-socket process..."
                pid=`ps a | grep fcgiwrap | grep unix | cut -d" " -f1`
                rm -f /run/fcgiwrap-unix.sock                 
                kill -s 1 $pid
                echo "Fcgiwrap process successfully stoped"
                #killall /usr/sbin/fcgiwrap
        sleep 1
        echo "Socket details: $sock"
eend $? "Errors were encountered while stopping fcgiwrap process..."
}

status() {
ebegin "Status fcgiwrap-unix-socket process..."
  if test -S /run/fcgiwrap-unix.sock; then
       echo "Process is started with socket: $sock_detail"
        else
        echo "Fcgiwrap process not running!"
        fi
eend $? "Errors were encountered while stopping fcgiwrap process..."
}

4. Novamente certifique-se de que este arquivo seja executável e use as mesmas opções de serviço: iniciar, parar ou status. Eu configurei o caminho padrão para este soquete no caminho do sistema /run/fcgiwrap-unix.sock. Inicie o processo e verifique-o usando a opção status ou liste o conteúdo do diretório /run e localize o soquete, ou use ps -a | comando grep fcgiwrap.

chmod +x /etc/init.d/fcgiwrap-unix-socket
service start fcgiwrap-unix-socket
/etc/init.d/fcgiwrap-unix-socket status
ps -a | grep fcgiwrap

Como mencionado anteriormente, o Fcgiwrap pode ser executado com soquetes TCP e UNIX simultaneamente, mas se você não precisar de conexões de gateway externas, atenha-se apenas ao Unix Domain Socket, porque ele usa comunicação entre processos, que é mais rápida que a comunicação por Conexões de loopback TCP e usa menos sobrecarga TCP.

Etapa 2: habilitar scripts CGI no Nginx

5. Para que o Nginx analise e execute scripts Perl ou Bash por meio da Fast Common Gateway Interface, os hosts virtuais devem ser configurados com definições Fcgiwrap no caminho raiz ou nas instruções de localização.

Um exemplo é apresentado abaixo (localhost), que ativa scripts Perl e CGI em todos os arquivos colocados no caminho raiz (/var/www/localhost/htdocs/) com .pl e extensão .cgi usando soquetes TCP Fcgiwrap para o caminho padrão do documento raiz, o segundo local usando Unix Domain Sockets, com um arquivo index.pl e o terceiro local é usar soquetes TCP com um arquivo index.cgi.

Coloque o conteúdo a seguir, ou apenas algumas partes dele, no arquivo de configuração do Host Virtual desejado para ativar scripts Perl ou Bash dinâmicos com soquetes UNIX ou TCP em locais diferentes, modificando a instrução do argumento fastcgi_pass.

nano /etc/nginx/sites-available/localhost.conf

Edite localhost.conf para ficar como no modelo abaixo.

server {
                                listen 80;
                                server_name localhost;

access_log /var/log/nginx/localhost_access_log main;
error_log /var/log/nginx/localhost_error_log info;

               root /var/www/localhost/htdocs/;
                location / {
                autoindex on;
                index index.html index.htm index.php;
                                }

## PHP –FPM Gateway ###
                            location ~ \.php$ {
                            try_files $uri =404;
                            include /etc/nginx/fastcgi.conf;
                            fastcgi_pass 127.0.0.1:9001;
				}

## Fcgiwrap Gateway on all files under root with TCP Sockets###
location ~ \.(pl|cgi|rb)$ {
                fastcgi_index index.cgi index.pl;
                include /etc/nginx/fastcgi.conf;
fastcgi_pass 127.0.0.1:12345;    
                                }                                                                                                                             

## Fcgiwrap Gateway on all files under root second folder with index.pl using UNIX Sockets###
location /second {
                                index index.pl; 
root /var/www/localhost/htdocs/;
                                location ~ \.(pl|cgi|rb)$ {
                                include /etc/nginx/fastcgi.conf;
                                fastcgi_pass unix:/run/fcgiwrap-unix.sock;      
                                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                                             }                                                                                                            
                                                }

## Fcgiwrap Gateway on all files under root third folder with index.cgi using TCP Sockets###
location /third {
                                index index.cgi;               
                                location ~ \.(pl|cgi|rb)$ {
                                include /etc/nginx/fastcgi.conf;
                                 fastcgi_pass 127.0.0.1:12345;       
                                }                                                                                             
  }

6. Depois de terminar de editar o Nginx localhost.conf ou seu arquivo de configuração específico do Virtual Host, vá para o caminho raiz do documento padrão do seu site e crie essas duas pastas para refletir sua localização declaração e crie arquivos de índice para cada local com sua extensão específica.

cd /var/www/localhost/htdocs
mkdir second third

Crie o arquivo index.pl no segundo local com o seguinte conteúdo.

nano /var/www/localhost/htdocs/second/index.pl

Adicione este conteúdo para obter variáveis de ambiente.

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print <<HTML;
                <html>
                <head><title>Perl Index</title></head>
                <body>
                                <div align=center><h1>A Perl CGI index on second location with env variables</h1></div>
                </body>
HTML
print "Content-type: text/html\n\n"; foreach my $keys (sort keys %ENV) { print "$keys =
$ENV{$keys}<br/>\n";
}
exit;

Em seguida, crie o arquivo index.cgi no terceiro local com o seguinte conteúdo.

nano /var/www/localhost/htdocs/third/index.cgi

Adicione este conteúdo para obter variáveis de ambiente.

#!/bin/bash
echo Content-type: text/html
echo ""
cat << EOF
<HTML>
<HEAD><TITLE>Bash script</TITLE></HEAD>
<BODY><PRE>
<div align=center><h1>A BASH CGI index on third location with env variables</h1></div>
EOF
env
cat << EOF
</BODY>
</HTML>
EOF

7. Ao terminar a edição, torne ambos os arquivos executáveis, reinicie o servidor Nginx e certifique-se de que ambos os soquetes Fcgiwrap estejam em execução.

chmod +x /var/www/localhost/htdocs/second/index.pl
chmod +x /var/www/localhost/htdocs/third/index.cgi
service nginx restart
service fcgiwrap start
service fcgiwrap-unix-socket start

Em seguida, redirecione seu navegador local para o seguinte URL.

http://localhost 

http://localhost/second/ 

http://localhost/third/

O resultado deve aparecer conforme as imagens abaixo.

8. Se tudo estiver no lugar e configurado corretamente, habilite ambos os daemons Fcgiwrap para iniciar automaticamente, após a reinicialização, emitindo os seguintes comandos (caso você tenha configurado o Nginx para usar ambos os soquetes CGI).

rc-update add fcgiwrap default
rc-update add fcgiwrap-unix-socket default

Etapa 3: Ative o suporte Ruby no Fcgiwrap

9. Se você precisar executar scripts Ruby dinâmicos no Nginx FCGI, você deve instalar o interpretador Ruby no Gentoo com o seguinte comando.

emerge --ask ruby

10. Após o pacote ter sido compilado e instalado, vá para Nginx sites-available e edite o arquivo localhost.conf anexando as seguintes instruções antes última chave “ } ”, que ativa o suporte para executar scripts Ruby em um quarto local no caminho raiz do documento padrão servido pelo host local Nginx.

nano /etc/nginx/sites-available/localhost.conf

Use as seguintes diretivas Nginx.

## Fcgiwrap Gateway on all files under root fourth folder with index.rb under TCP Sockets###
                location /fourth {
                                index index.rb;
                                location ~ \.rb$ {
                                include /etc/nginx/fastcgi.conf;
                                fastcgi_pass 127.0.0.1:12345;       
                                                }                                                                                                             
                               }             
## Last curly bracket which closes Nginx server definitions ##
}

11. Agora, para testar a configuração, crie o quarto diretório no caminho /var/www/localhost/htdocs, crie um script de índice Ruby executável com .rb extensão e adicione o seguinte conteúdo.

mkdir /var/www/localhost/htdocs/fourth
nano /var/www/localhost/htdocs/fourth/index.rb

Exemplo Ruby index.rb.

#!/usr/bin/ruby
puts "HTTP/1.0 200 OK"
puts "Content-type: text/html\n\n"
puts "<html><HEAD><TITLE>Ruby script</TITLE></HEAD>"
puts "<BODY><PRE>"
puts "<div align=center><h1>A Ruby CGI index on fourth location with env variables</h1></div>"
system('env')

12. Depois de adicionar permissões de execução ao arquivo, reinicie o daemon Nginx para aplicar as configurações.

chmod +x /var/www/localhost/htdocs/fourth/index.rb
service nginx restart

Abra seu navegador e navegue até a URL http://localhost/fourth/, que deverá apresentar o seguinte conteúdo.

Por enquanto é isso, você configurou o Nginx para servir scripts dinâmicos Perl, Ruby e Bash no FastCGI Gateway, mas esteja ciente de que executar esse tipo de script interpretado no Nginx CGI Gateway pode ser perigoso e impor sérios riscos de segurança ao seu servidor porque eles executado usando shells ativos em seu sistema, mas pode expandir a barreira estática imposta pelo HTML estático, adicionando funcionalidade dinâmica ao seu site.