Nginx CGI · 4 min read · Jan 23, 2026

Servire script CGI con Nginx su Fedora 18

Servire script CGI con Nginx su Fedora 18

Versione 1.0
Autore: Falko Timme
Seguimi su Twitter

Questo tutorial mostra come puoi servire script CGI (script Perl) con nginx su Fedora 18. Anche se nginx stesso non serve CGI, ci sono diversi modi per aggirare questo. Delineerò due soluzioni: la prima è quella di proxyare le richieste per gli script CGI a Thttpd, un piccolo server web che ha supporto per CGI, mentre la seconda soluzione utilizza un wrapper CGI per servire gli script CGI.

Non rilascio alcuna garanzia che questo funzioni per te!

1 Nota preliminare

Sto usando il sito web www.example.com qui con la radice del documento /var/www/www.example.com/web/; la configurazione del vhost si trova in /etc/nginx/conf.d/www.example.com.vhost.

2 Utilizzare Thttpd

In questo capitolo descriverò come configurare nginx per proxyare le richieste per gli script CGI (estensioni .cgi o .pl) a Thttpd. Configurerò Thttpd per funzionare sulla porta 8000.

Prima installiamo Thttpd. Esiste un pacchetto Thttpd per Fedora 18, ma la pagina ThttpdCGI di nginx dice che Thttpd dovrebbe essere patchato - quindi scarichiamo il pacchetto src.rpm per Fedora 18, lo patchiamo e costruiamo un nuovo pacchetto rpm da esso.

Dobbiamo installare gli strumenti necessari per costruire un nuovo pacchetto rpm:

yum groupinstall 'Development Tools'

Installa yum-utils (il pacchetto contiene lo strumento yumdownloader che ci consente di scaricare un src.rpm):

yum install yum-utils

Successivamente scarichiamo il pacchetto Thttpd src.rpm per 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

Puoi ignorare i seguenti avvisi:

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

Ora scarichiamo la patch nella directory /root/rpmbuild/SOURCES/ e modifichiamo il file /root/rpmbuild/SPECS/thttpd.spec di conseguenza:

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

Aggiungi le righe 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 [...] |

Ora costruiamo il nostro pacchetto rpm Thttpd come segue:

rpmbuild -ba thttpd.spec

Il nostro pacchetto rpm Thttpd viene creato in /root/rpmbuild/RPMS/x86_64 ( /root/rpmbuild/RPMS/i386 se sei su un sistema i386), quindi andiamo 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]#

Installa il pacchetto Thttpd come segue:

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

Poi facciamo un backup del file originale /etc/thttpd.conf e creiamo un nuovo file come segue:

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

| # ATTENZIONE : Non sono consentite righe vuote! # Questa sezione sovrascrive i valori predefiniti # Questa sezione _documenta_ i valori predefiniti in vigore # port=80 # nosymlink # default = !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 |

Questo farà sì che Thttpd ascolti sulla porta 8000 su 127.0.0.1; la sua radice del documento è /var/www.

Crea i collegamenti di avvio del sistema per Thttpd…

systemctl enable thttpd.service

… e avvialo:

systemctl start thttpd.service

Successivamente crea /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; |

Ora apri il tuo file di configurazione del vhost…

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

… e aggiungi una sezione location /cgi-bin {} al contenitore server {}:

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

Ricarica nginx:

systemctl reload nginx.service

Poiché la radice del documento di Thttpd è /var/www, la location /cgi-bin si traduce nella directory /var/www/cgi-bin (questo è vero per tutti i tuoi vhost, il che significa che ogni vhost deve posizionare i suoi script CGI in /var/www/cgi-bin; questo è uno svantaggio per gli ambienti di hosting condiviso; la soluzione è utilizzare un wrapper CGI come descritto nel capitolo 3 invece di Thttpd).

Crea la directory…

mkdir /var/www/cgi-bin

… e poi posiziona i tuoi script CGI in essa e rendili eseguibili. A scopo di test creerò un piccolo script Perl Hello World (anziché hello_world.cgi puoi anche usare l’estensione .pl -> hello_world.pl):

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

| #!/usr/bin/perl -w # Dì a perl di inviare un'intestazione html. # Così il tuo browser riceve l'output # piuttosto che (linea di comando # sul server.) print "Content-type: text/html\n\n"; # stampa i tuoi tag html di base. # e il contenuto di essi. print "Hello World!! \n"; print "

Hello world

\n"; |

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

Apri un browser e testa lo script:

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

Se tutto va bene, dovresti ottenere il seguente output:

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.