Debian : configurer nginx pour exécuter des scripts cgi bash
Introduction
Configurer Nginx sur Debian pour exécuter des scripts CGI Bash est une tâche réalisable, mais elle nécessite quelques étapes spécifiques car Nginx ne gère pas le CGI nativement comme Apache. Il faut utiliser un interpréteur externe, généralement fcgiwrap.
1. Installer les dépendances
Vous devez installer fcgiwrap (qui permet à Nginx de communiquer avec les scripts via FastCGI) et spawn-fcgi (pour lancer le processus fcgiwrap).
sudo apt update sudo apt install fcgiwrap spawn-fcgi
2. Configurer le service fcgiwrap
Sur Debian, fcgiwrap est souvent configuré pour s'exécuter via un socket Unix. Assurez-vous que le service est activé et démarré.
sudo systemctl enable fcgiwrap.socket sudo systemctl start fcgiwrap.socket
Vérifiez que le socket existe (généralement /var/run/fcgiwrap.socket) :
ls -l /var/run/fcgiwrap.socket
Note : Si le fichier n'existe pas ou si le service échoue, redémarrez-le avec sudo systemctl restart fcgiwrap.socket.
3. Préparer le répertoire des scripts CGI
Créez un répertoire pour vos scripts (par exemple /usr/lib/cgi-bin) et assurez-vous qu'il est accessible par l'utilisateur www-data (celui qui tourne Nginx).
sudo mkdir -p /usr/lib/cgi-bin sudo chown www-data:www-data /usr/lib/cgi-bin sudo chmod 755 /usr/lib/cgi-bin
Créez un script de test pour vérifier que tout fonctionne :
sudo nano /usr/lib/cgi-bin/test.sh
Collez ce contenu :
#!/bin/bash echo "Content-type: text/html" echo "" echo "<html><body>" echo "<h1>Ceci est un script CGI Bash !</h1>" echo "<p>Date : $(date)</p>" echo "</body></html>"
Rendez le script exécutable :
sudo chmod +x /usr/lib/cgi-bin/test.sh
4. Configurer Nginx
Modifiez votre configuration de site (souvent dans /etc/nginx/sites-available/default ou un fichier spécifique dans /etc/nginx/sites-available/).
Ajoutez ou modifiez le bloc server pour inclure la gestion du CGI :
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.html index.htm; server_name _; # ... autres configurations ... # Configuration pour les scripts CGI location /cgi-bin/ { # Autorise l'exécution de scripts gzip off; # Utilise fastcgi_pass pour pointer vers le socket fcgiwrap fastcgi_pass unix:/var/run/fcgiwrap.socket; # Inclut les paramètres standards de FastCGI include fastcgi_params; # Définit le script à exécuter fastcgi_param SCRIPT_FILENAME /usr/lib/cgi-bin$fastcgi_script_name; # Important : Force l'interprétation en tant que CGI fastcgi_param SCRIPT_NAME $fastcgi_script_name; # Sécurité : Vérifie que le fichier existe avant d'exécuter try_files $uri =404; } # Pour les fichiers statiques normaux location / { try_files $uri $uri/ =404; } }
Points clés de la configuration :
- fastcgi_pass unix:/var/run/fcgiwrap.socket; : Connecte Nginx au démon fcgiwrap.
- SCRIPT_FILENAME : Indique le chemin complet du script sur le disque.
- try_files $uri =404; : Empêche Nginx d'essayer d'exécuter un fichier qui n'existe pas, évitant des erreurs 500 inutiles.
5. Tester et redémarrer Nginx
Vérifiez la syntaxe de la configuration :
sudo nginx -t
Si tout est correct, redémarrez Nginx :
sudo systemctl reload nginx
Warning
Ouvrez votre navigateur et accédez à : http://votre-ip/cgi-bin/test.sh
Vous devriez voir la page HTML générée par votre script Bash.
Dépannage courant
- Erreur 502 Bad Gateway : Souvent dû au fait que fcgiwrap n'est pas en cours d'exécution ou que le socket n'est pas accessible. Vérifiez avec systemctl status fcgiwrap.socket.
- Erreur 403 Forbidden : Problème de permissions. Assurez-vous que le script est exécutable (chmod +x) et que le propriétaire du fichier ou du dossier est bien www-data ou accessible par lui.
- Erreur 500 Internal Server Error : Vérifiez les logs d'erreur de Nginx (/var/log/nginx/error.log) et les logs de fcgiwrap. Souvent, c'est un problème de shebang (#!/bin/bash) ou de sortie manquante des en-têtes HTTP (Content-type: …).
Cette méthode est la plus robuste sous Debian pour faire tourner du CGI avec Nginx aujourd'hui.
