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-utilsSuccessivamente scarichiamo il pacchetto Thttpd src.rpm per Fedora 18:
cd /usr/src
yumdownloader --source thttpdls -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.rpmPuoi 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.specAggiungi 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.specIl 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.rpmPoi 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.serviceSuccessivamente 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.servicePoiché 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 |Hello world
\n";
chmod 755 /var/www/cgi-bin/hello_world.cgiApri un browser e testa lo script:
http://www.example.com/cgi-bin/hello_world.cgiSe tutto va bene, dovresti ottenere il seguente output:

Ricevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.