Ce document s'adresse à des personnes ayant déjà une bonne connaissance d'apache, des cgi et de l'administration d'un système. Avoir déjà compiler son propre serveur apache et php est un pré requis.
On se concentre ici sur les produits que sont apache et php, il ne s'agit en aucun cas d'une procédure complète d'installation d'un serveur mutualisé. A vous d'adapter en fonction de votre environnement.
Mon PC perso se comporte, lorsqu'il est allumé, comme un serveur WEB, serveur de Mail, et Firewall/Routeur. Je le rends accéssible depuis Internet via le DNS dynamique (dyndns.com).
J'ai décidé récemment de faire un produit permettant d'activer et de configurer simplement un firewall autour d'iptables (Netfilter). J'ai doté ce produit d'un petite interface de management (surtout des statistiques, le paramétrage étant réservé à root) via une interface HTTP.
Là j'ai rencontré 2 soucis, je ne voulais pas utilisée une URL de type ~firewall, ET je ne voulais que l'utilisateur par défaut des sites en développement ait accès au données du firewall.
De plus, je voulais doter mon PC d'une interface Web Mail (squirrelmail) accessible depuis une url du type mail.mon_domaine.dyndns.com.
Après quelques recherches sur le net, il apparaît qu'il faille faire 3 choses
Autant le paramétrage des hôtes virtuels sous apache est directement accessible via le fichier de configuration du serveur http, autant l'activation et la configuration du module suexec ne peut se faire que via la compilation. Ainsi l'équipe de développement d'apache envisage sereinement la mise en oeuvre de ce module en respectant quelques consignes de mise en oeuvre.
Utilisant un domaine dynamique fourni par dyndns.com, en mode statique (j'ai une ip fixe), j'ai juste activé les 'wildcard' sur mon compte (option 'Enable Wildcard'). Cela fonctionne aussi avec un service en IP dynamique.
Ensuite un petit man hosts pour définir les alias pour la résolution des noms en local, pris automatiquement en compte par la masquerade DNS pour le réseau privé local.
Fidèle à ma pratique, j'utilise toujours les .SlackBuild fournit dans les sources des packages pour recompiler les produits Slackware.
L'activation de SUEXEC, qui va permettre au démons apache d'effectuer le changement d'utilisateur avant de lancer le script CGI. En réalité un processus apache va lancer le programme suexec qui effectue le changement d'utilisateur et qui lance ensuite le script CGI.
Avant de continuer vous devez décider de comment sera architecturé votre serveur...
Architecturer son serveur
La compilation
Préparation de la compilation
télécharger tous les fichier contenu dans les sources d'apache depuis la zone source de la Slackware (cluster N).
Modification du apache.SlackBuild
# vi apache.SlackBuild
Modification de la variable TMP (début du script)
TMP=$CWD/../TMPAjout des options suexec pour apache
--enable-suexec \ --suexec-caller=www_user \ --suexec-uidmin=uid_min \ --suexec-gidmin=gid_min \ --suexec-safepath=/bin:/usr/bin:/usr/local/bin \ --suexec-userdir=www_userdir \ --suexec-umask=022 \ --suexec-docroot=www_home
Lancement de la compilation
# ./apache.SlackBuild
Installation du nouveau package
# apachectl stop
# cd ../TMP
# upgradepkg --reinstall apache-*.tgz
# apachectl start
La solution que j'ai trouvé pour PHP consiste à ne plus utiliser le module apache php, mais à lancer les scripts PHP en mode CGI.
Important : l'option --enable-discard-path est incompatible avec --enable-force-cgi-redirect.
Pour réaliser la compilation et l'installation, se reporter à ce document : Installer php4 et php5 sur une Slackware Linux
Il faut faudra néanmoins réaliser les adaptations suivantes :
# vi php/crabs_php.SlackBuild
modifier le prefix d'installation
./configure --prefix=/usr/php4 \
modifier le sysconfdir
--sysconfdir=/usr/php4/etc
supprimer la ligne --enable-discard-path
Commenter les lignes de compilation du module
# php_configure --disable-static --with-apxs=/usr/sbin/apxs
# make -j3
# make install INSTALL_ROOT=$PKG
# make distclean
# PHP likes to install Pear with some strange permissions.
# chmod 755 $PKG/usr/bin/pear
On fera une installation directe
# Make the standalone interpreter:
php_configure --enable-force-cgi-redirect --enable-fastcgi --enable-pcntl --enab
le-sigchild
make -j3
exit
make install-cli INSTALL_ROOT=$PKG
Lancer la compilation
# ./crabs_compil.sh
Puis en tant que root
# cd php
# make install
# cd ../php-5.*
# make install
Afin que cela fonctionne correctement, il faut commenter les lignes faisant référence à php comme module dans le httpd.conf :
#LoadModule php4_module libexec/apache/libphp4.so
#AddModule mod_php4.c
#AddType application/x-httpd-php .php
Et ajouter les redirections php vers cgi
AddHandler php4-cgi .php
AddHandler php5-cgi .php5
Action php4-cgi /cgi-bin/php4.cgi
Action php5-cgi /cgi-bin/php5.cgi
Modifier le UserDir en fonction de votre paramétrage suexec
UserDir www_userdir
Puis copier les différents interpréteurs PHP vers votre dossier cgi-bin.
Ensuite, il faut créer les dossiers etc pour chaque interpreteur PHP et y copier vos php.ini
# mkdir /usr/php4/etc /usr/php5/etc
On termine en redemarrant apache
# apachectl restart
Dès maintenant, une url de type ~user, permet de faire le changement automatique d'uid pour les cgi et les scripts php (si vous avez autorisé le lancement des cgi pour vos utilisateurs).
Tout ce passe dans le fichier de configuration d'apache.
Activer le mécanisme des hôtes virtuels basés sur les noms
décommenter la ligne suivante
NameVirtualHost *:80
Préciser le 'hôte' par défaut
<VirtualHost *:80>
ServerName localhost
DocumentRoot votre_DocumentRoot
</VirtualHost>
Tous les ajouts des virtuals hosts se feront après ces lignes.
Dans ce cas-là, il n'y aura pas de changement d'utilisateur. A vous de paramétrer votre service DNS, je donne l'info en utilisation DnsMasq.
Gestion du DNS : ajout d'alias au nom du serveur
# vi /etc/hosts
ip_réseau_local nom_normal nouveau_nom nouveau_nom.votre.domaine
Fichier de configuration d'apache : ajout des lignes
# vi httpd.conf
<VirtualHost *:80> ServerName nouveau_nom ServerAlias nouveau_nom nouveau_nom.domaine DocumentRoot DocumentRoot_de_ce_serveur </VirtualHost>
Pour l'exemple, le nouveau domaine est géré par un utilisateur différent de l'utilisateur faisant tourner apache. L'exemple repose sur l'utilisation de DynDNS et DnsMasq. Dans la réalité, il faut gérer au niveau DNS une redirection du nouveau domaine vers l'adresse IP de votre serveur.
Gestion du DNS : ajout d'alias pour le nouveau serveur
# vi /etc/hosts
ip_réseau_local nom_normal user nouveau_domaine
Fichier de configuration d'apache : ajout des lignes
# vi httpd.conf
<VirtualHost *:80> ServerName user ServerAlias user nouveau_domaine DocumentRoot /home/www_userdir Action php4-cgi /cgi-bin/user/php4.cgi Action php5-cgi /cgi-bin/user/php5.cgi User user Group group </VirtualHost>
user et group sont respectivement le username et le groupname de l'utilisateur.
home est le home de votre utilisateur. Ce répertoire doit être un sous-dossier de www_home.
Copier les interpréteurs php pour qu'ils fonctionnent avec le méchanisme suexec
cgi-bin correspond à votre dossier mis en ScriptAlias dans la configuration d'apache
# mkdir cgi-bin/user
# cp /usr/php4/bin/php cgi-bin/user/php4.cgi
# cp /usr/php5/bin/php cgi-bin/user/php5.cgi
# chown -R user:group cgi-bin/user
# chmod -R u+rwx cgi-bin/user
Sachant que suexec interdit l'utilisation de lien symbolique, on peut écrire des 'wrapper' pour php4.cgi et php5.cgi. La performance déjà dégradée de PHP par l'utilisation du mode CGI n'en sera pas améliorée, mais il permettra d'économiser presque 10Mo par utilisateur.
Sur mon serveur de développement, j'autorise l'utilisation de tous les cgi pour les utilisateurs, faut-voir s'il n'est pas possible de n'autoriser que les php*.cgi.
Exemple de 'wrapper' pour php4.cgi
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
char* php4_cgi = "/usr/php4/bin/php" ;
int main( int argc, char**argv )
{
char buff [2048] ;
extern int errno ;
execl( php4_cgi, php4_cgi, NULL ) ;
snprintf(buff,sizeof( buff ),"execl(%s):%s\n",php4_cgi,strerror(errno));
write( 2, buff, strlen( buff ) ) ;
exit(100) ;
}
Renseignez-vous sur les brevets logiciels en Europe :
NoSoftWarePatents.com (en français)
Les images représentant des sociétes, des associations ou des marques restent associées, par un lien, à ces sociétés, associations ou marques. Elles ne signifie en rien que ces sociétés, associations ou marques soutiennent ce site.
Sauf précisions contraire, le contenu de ce site est mis à disposition sous un contrat Creative Commons.
Les informations fournies le sont sans aucune garantie. L'auteur ne pourra être tenu responsable de leurs utilisations.
De par l'utilisation du HTML 4.01 Strict et des CSS 2.1, le monde de crabs sera correctement vu avec les navigateurs respectant ces normes, Mozilla ou FireFox par exemple.
| Site : | Le Monde de Crabs |
| Titre : | DNS dynamique, Apache, virtual host et suexec |
| Date du document : | 16/10/2005 |
| Auteur : | Christophe Cazajus |
| Mail : | crabs(mettre le @)crabs-world.com ou utiliser ce formulaire de contact |
| Mots-clé : | crabs, monde, francais, francophone, français, apache, suexec, virtual host, cgi, dynamic dns, dns dynamique, dyndns.com |
| Description : | configurer un serveur perso de développement afin que celui-ci se comporte comme un serveur mutualisé. |
| Validation : | html, csshtml, ccs |

Le calendrier et les scores du Stade Toulousain sont accessibles sur cette page : Le monde de crabs et le Stade Toulousain.