CGI Nginx · 5 min read · Jan 23, 2026
Servir des scripts CGI avec Nginx sur Fedora 18
Servir des scripts CGI avec Nginx sur Fedora 18
Version 1.0
Auteur : Falko Timme
Suivez-moi sur Twitter
Ce tutoriel montre comment vous pouvez servir des scripts CGI (scripts Perl) avec nginx sur Fedora 18. Bien que nginx lui-même ne serve pas de CGI, il existe plusieurs façons de contourner cela. Je vais esquisser deux solutions : la première consiste à proxy les requêtes pour les scripts CGI vers Thttpd, un petit serveur web qui prend en charge CGI, tandis que la deuxième solution utilise un wrapper CGI pour servir des scripts CGI.
Je ne donne aucune garantie que cela fonctionnera pour vous !
1 Remarque préliminaire
J’utilise le site web www.example.com ici avec le document root /var/www/www.example.com/web/ ; la configuration vhost est située dans /etc/nginx/conf.d/www.example.com.vhost.
2 Utilisation de Thttpd
Dans ce chapitre, je vais décrire comment configurer nginx pour proxy les requêtes pour les scripts CGI (extensions .cgi ou .pl) vers Thttpd. Je vais configurer Thttpd pour qu’il fonctionne sur le port 8000.
Tout d’abord, nous installons Thttpd. Il existe un paquet Thttpd pour Fedora 18, mais la page ThttpdCGI de nginx indique que Thttpd doit être patché - par conséquent, nous téléchargeons le paquet src.rpm pour Fedora 18, le patchons et construisons un nouveau paquet rpm à partir de celui-ci.
Nous devons installer les outils nécessaires pour construire un nouveau paquet rpm :
yum groupinstall 'Development Tools'Installez yum-utils (le paquet contient l’outil yumdownloader qui nous permet de télécharger un src.rpm) :
yum install yum-utilsEnsuite, nous téléchargeons le paquet Thttpd src.rpm pour 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.rpmVous pouvez ignorer les avertissements suivants :
[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]#Maintenant, nous téléchargeons le patch dans le répertoire /root/rpmbuild/SOURCES/ et modifions le fichier /root/rpmbuild/SPECS/thttpd.spec en conséquence :
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.specAjoutez les lignes Patch3: thttpd-2.25b-ipreal.patch et %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 [...] |
Maintenant, nous construisons notre paquet rpm Thttpd comme suit :
rpmbuild -ba thttpd.specNotre paquet rpm Thttpd est créé dans /root/rpmbuild/RPMS/x86_64 (/root/rpmbuild/RPMS/i386 si vous êtes sur un système i386), donc nous y allons :
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]#Installez le paquet Thttpd comme suit :
rpm -ivh thttpd-2.25b-28.fc18.x86_64.rpmEnsuite, nous faisons une sauvegarde du fichier original /etc/thttpd.conf et en créons un nouveau comme suit :
mv /etc/thttpd.conf /etc/thttpd.conf_orig
vi /etc/thttpd.conf| # ATTENTION : Aucune ligne vide n'est autorisée ! # Cette section remplace les valeurs par défaut # Cette section _documente_ les valeurs par défaut en vigueur # port=80 # nosymlink # par défaut = !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 |
Cela fera écouter Thttpd sur le port 8000 sur 127.0.0.1 ; son document root est /var/www.
Créez les liens de démarrage système pour Thttpd…
systemctl enable thttpd.service… et démarrez-le :
systemctl start thttpd.serviceEnsuite, créez /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; |
Maintenant, ouvrez votre fichier de configuration vhost…
vi /etc/nginx/conf.d/www.example.com.vhost… et ajoutez une section location /cgi-bin {} au conteneur server {} :
| server { [...] location /cgi-bin { include proxy.conf; proxy_pass http://127.0.0.1:8000; } [...] } |
Rechargez nginx :
systemctl reload nginx.serviceParce que le document root de Thttpd est /var/www, la location /cgi-bin se traduit par le répertoire /var/www/cgi-bin (c’est vrai pour tous vos vhosts, ce qui signifie que chaque vhost doit placer ses scripts CGI dans /var/www/cgi-bin ; c’est un inconvénient pour les environnements d’hébergement partagé ; la solution consiste à utiliser un wrapper CGI comme décrit dans le chapitre 3 au lieu de Thttpd).
Créez le répertoire…
mkdir /var/www/cgi-bin… puis placez vos scripts CGI dedans et rendez-les exécutables. À des fins de test, je vais créer un petit script Perl Hello World (au lieu de hello_world.cgi, vous pouvez également utiliser l’extension .pl -> hello_world.pl) :
vi /var/www/cgi-bin/hello_world.cgi| #!/usr/bin/perl -w # Dites à perl d'envoyer un en-tête html. # Ainsi, votre navigateur obtient la sortie # plutôt que |Hello world
\n";
chmod 755 /var/www/cgi-bin/hello_world.cgiOuvrez un navigateur et testez le script :
http://www.example.com/cgi-bin/hello_world.cgiSi tout se passe bien, vous devriez obtenir la sortie suivante :

Recevez de nouveaux articles dans votre boîte de réception.
Aucun spam. Désabonnez-vous à tout moment.