Nginx CGI · 4 min read · Jan 23, 2026

Servindo Scripts CGI Com Nginx No Fedora 18

Servindo Scripts CGI Com Nginx No Fedora 18

Versão 1.0
Autor: Falko Timme
Siga-me no Twitter

Este tutorial mostra como você pode servir scripts CGI (scripts Perl) com nginx no Fedora 18. Embora o nginx em si não sirva CGI, existem várias maneiras de contornar isso. Vou descrever duas soluções: a primeira é fazer proxy de solicitações para scripts CGI para o Thttpd, um pequeno servidor web que tem suporte a CGI, enquanto a segunda solução usa um wrapper CGI para servir scripts CGI.

Não dou nenhuma garantia de que isso funcionará para você!

1 Nota Preliminar

Estou usando o site www.example.com aqui com o diretório raiz /var/www/www.example.com/web/; a configuração do vhost está localizada em /etc/nginx/conf.d/www.example.com.vhost.

2 Usando Thttpd

Neste capítulo, vou descrever como configurar o nginx para fazer proxy de solicitações para scripts CGI (extensões .cgi ou .pl) para o Thttpd. Vou configurar o Thttpd para rodar na porta 8000.

Primeiro, instalamos o Thttpd. Existe um pacote Thttpd para Fedora 18, mas a página ThttpdCGI do nginx diz que o Thttpd deve ser corrigido - portanto, baixamos o pacote src.rpm para Fedora 18, aplicamos o patch e construímos um novo pacote rpm a partir dele.

Precisamos instalar as ferramentas necessárias para construir um novo pacote rpm:

yum groupinstall 'Development Tools'

Instale o yum-utils (o pacote contém a ferramenta yumdownloader que nos permite baixar um src.rpm):

yum install yum-utils

Em seguida, baixamos o pacote Thttpd src.rpm para Fedora 18:

cd /usr/src  
yumdownloader --source thttpd
ls -l
[root@server1 src]# ls -l  
total 164  
drwxr-xr-x. 2 root root   4096 Feb  3  2012 debug  
drwxr-xr-x. 3 root root   4096 Jun  4 18:21 kernels  
-rw-r--r--  1 root root 155690 Mar 28 03:21 thttpd-2.25b-28.fc18.src.rpm  
[root@server1 src]#
rpm -ivh thttpd-2.25b-28.fc18.src.rpm

Você pode ignorar os seguintes avisos:

[root@server1 src]# rpm -ivh thttpd-2.25b-28.fc18.src.rpm  
   1:thttpd             warning: user mockbuild does not exist - using root  
warnings: group mockbuild does not exist - using root  
warnings: user mockbuild does not exist - using root  
warnings: group mockbuild does not exist - using root  
warnings: user mockbuild does not exist - using root  
warnings: group mockbuild does not exist - using root  
warnings: user mockbuild does not exist - using root  
warnings: group mockbuild does not exist - using root  
warnings: user mockbuild does not exist - using root  
warnings: group mockbuild does not exist - using root  
warnings: user mockbuild does not exist - using root  
warnings: group mockbuild does not exist - using root  
warnings: user mockbuild does not exist - using root  
warnings: group mockbuild does not exist - using root  
warnings: user mockbuild does not exist - using root  
warnings: group mockbuild does not exist - using root  
########################################### [100%]  
[root@server1 src]#

Agora baixamos o patch para o diretório /root/rpmbuild/SOURCES/ e modificamos o arquivo /root/rpmbuild/SPECS/thttpd.spec de acordo:

cd /root/rpmbuild/SOURCES/  
wget -O thttpd-2.25b-ipreal.patch http://www.danielclemente.com/amarok/ip_real.txt  
cd /root/rpmbuild/SPECS/  
vi thttpd.spec

Adicione as linhas Patch3: thttpd-2.25b-ipreal.patch e %patch3 -p1 -b .ipreal:

| [...] Patch0: thttpd-2.25b-CVE-2005-3124.patch Patch1: thttpd-2.25b-fixes.patch Patch2: thttpd-2.25b-getline.patch Patch3: thttpd-2.25b-ipreal.patch [...] %prep %setup -q %patch0 -p1 -b .CVE-2005-3124 %patch1 -p1 -b .fixes %patch2 -p1 -b .getline %patch3 -p1 -b .ipreal [...] |

Agora construímos nosso pacote rpm do Thttpd da seguinte forma:

rpmbuild -ba thttpd.spec

Nosso pacote rpm do Thttpd é criado em /root/rpmbuild/RPMS/x86_64 (/root/rpmbuild/RPMS/i386 se você estiver em um sistema i386), então vamos até lá:

cd /root/rpmbuild/RPMS/x86_64  
ls -l
[root@server1 x86_64]# ls -l  
total 224  
-rw-r--r-- 1 root root  69881 Sep  3 23:17 thttpd-2.25b-28.fc18.x86_64.rpm  
-rw-r--r-- 1 root root 151685 Sep  3 23:17 thttpd-debuginfo-2.25b-28.fc18.x86_64.rpm  
[root@server1 x86_64]#

Instale o pacote Thttpd da seguinte forma:

rpm -ivh thttpd-2.25b-28.fc18.x86_64.rpm

Em seguida, fazemos um backup do arquivo original /etc/thttpd.conf e criamos um novo da seguinte forma:

mv /etc/thttpd.conf /etc/thttpd.conf_orig  
vi /etc/thttpd.conf

| # CUIDADO: Nenhuma linha vazia é permitida! # Esta seção substitui os padrões # Esta seção _documenta_ os padrões em vigor # port=80 # nosymlink # padrão = !chroot # novhost # nocgipat # nothrottles # host=0.0.0.0 # charset=iso-8859-1 host=127.0.0.1 port=8000 user=thttpd logfile=/var/log/thttpd.log pidfile=/var/run/thttpd.pid dir=/var/www cgipat=.cgi|.pl |

Isso fará com que o Thttpd escute na porta 8000 em 127.0.0.1; seu diretório raiz é /var/www.

Crie os links de inicialização do sistema para o Thttpd…

systemctl enable thttpd.service

… e inicie-o:

systemctl start thttpd.service

Em seguida, crie /etc/nginx/proxy.conf:

vi /etc/nginx/proxy.conf

| proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; |

Agora abra seu arquivo de configuração do vhost…

vi /etc/nginx/conf.d/www.example.com.vhost

… e adicione uma seção location /cgi-bin {} ao contêiner server {}:

| server { [...] location /cgi-bin { include proxy.conf; proxy_pass http://127.0.0.1:8000; } [...] } |

Recarregue o nginx:

systemctl reload nginx.service

Como o diretório raiz do Thttpd é /var/www, a localização /cgi-bin se traduz no diretório /var/www/cgi-bin (isso é verdade para todos os seus vhosts, o que significa que cada vhost deve colocar seus scripts CGI em /var/www/cgi-bin; essa é uma desvantagem para ambientes de hospedagem compartilhada; a solução é usar um wrapper CGI como descrito no capítulo 3 em vez do Thttpd).

Crie o diretório…

mkdir /var/www/cgi-bin

… e depois coloque seus scripts CGI nele e torne-os executáveis. Para fins de teste, vou criar um pequeno script Perl Hello World (em vez de hello_world.cgi você também pode usar a extensão .pl -> hello_world.pl):

vi /var/www/cgi-bin/hello_world.cgi

| #!/usr/bin/perl -w # Diga ao perl para enviar um cabeçalho html. # Assim, seu navegador recebe a saída # em vez de (linha de comando # no servidor.) print "Content-type: text/html\n\n"; # imprima suas tags html básicas. # e o conteúdo delas. print "Hello World!! \n"; print "

Hello world

\n"; |

chmod 755 /var/www/cgi-bin/hello_world.cgi

Abra um navegador e teste o script:

http://www.example.com/cgi-bin/hello_world.cgi

Se tudo correr bem, você deve obter a seguinte saída:

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.