Apache est le serveur Web le plus utilisé sur la planète. Né en 1995, Apache HTTPD est aujourd'hui massivement utilisé pour supporter des applications PHP.
Cependant, peu de développeurs connaissent vraiment cette machine aussi complexe que robuste qui supporte leur langage fétiche : PHP.
Il n'est pas rare de voir des codes PHP exécutant des actions qu'Apache sait gérer en une seule ligne, de manière beaucoup plus efficace.
Nous parlerons donc généralités, HTTP, Cache, Proxing et nous passerons en revue les différentes manière de coupler Apache à PHP (mod_php, CGI et FCGI, mais aussi mpm_peruser, mpm_itk, suexec, suphp).
2. Hébergement Conseil
Formation Solutions
16/11/09 ALTER WAY GROUP 2
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 2
3. Who is talking ?
Julien Pauli
Expert certifié PHP& Zend Framework
Formateur – Consultant - groupe AlterWay
"ZendFramework, bien développer en PHP" :
Eyrolles
Contributeur ZendFramework - PHP - Apache
http://julien-pauli.developpez.com
LAMP stack user
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 3
4. Ordre du jour
A patchy server : historique
1995 à nos jours
Modules Apache
Fonctionnement interne
Liaisons PHP et Apache
CGI - mod_php - others
Apache-PHP et HTTP
Apache en puissance
Autorisations, compressions, cache ...
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 4
5. Sondage
Qui utilise Apache ?
Depuis combien de temps ?
depuis toujours ?
depuis peu ?
Quelle version ?
1.x
2.x
Utilisez-vous un autre serveur Web ?
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 5
6. Non, pas pour aujourd'hui :
Apache !=
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 6
7. Apache, c'est quoi ?
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 7
8. Apache, c'est avant tout...
Le nom d'une fondation, l'ASF
Apache Software Foundation : équivalent "association" en France
Investisseurs privés (Google, Microsoft, IBM)
But non lucratif
~300 membres (contributeurs)
Fondée en 1999 (10ans)
Une licence : Apache Licence
Une adresse : http://www.apache.org/
Des tonnes de projets :
HTTPD, couchdb, tomcat, geronimo, jakarta, struts,
spamassassin,
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 8
9. Historique du web
1990, Sir Tim Berners Lee invente le www
http://info.cern.ch/default-fr.html
1993, premier serveur Web : NCSA httpd
http://hoohoo.ncsa.illinois.edu/docs/info/Features.html
1995 : Apache 1 : fork de NCSA httpd
"A Patchy httpd Server" : une suite de patchs sur NCSA
httpd
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 9
10. Historique Apache
1995 : Apache 1
Bases : fonctionnement très proche d'UNIX
2003 : Apache 2
Cross-Platform (Multi Processing Modules)
Apache Portable Runtime (APR, APR-Util)
IPV6 et support des threads Linux
2005 : Apache 2.2
Supports de bases de données
Amélioration du cache et de l'authentification
Filtres
Proxy et proxy load balancing
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 10
12. Une structure modulaire
Un core (écrit en C)
mod_core , mpm, http_core ...
Des modules d'extension (écrits en C)
mod_rewrite, mod_deflate, .... mod_php
Compilables statiquement ou dynamiquement (mod_so)
Très fléxible
Beaucoup de modules dans la nature (~600 ,
probablement plus)
http://modules.apache.org/search.php?query=true
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 12
13. Fonctionnement d'Apache
Les modules sont connectés via des "hooks"
(évènements)
PHP est générateur de contenu
Mapping URI vers fichier sur le disque
Authentification
Permissions
Type du fichier
Traitement (génération de contenu)
Réponse au client
Stockage des erreurs (log)
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 13
14. Lier PHP et Apache
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 14
15. Liaison Apache - PHP
Différentes liaisons :
module : mod_php
– Cas le plus courant
– liaison forte (crashs, droits)
CGI
– Peu performant à haute charge
– Indépendant d'Apache (crashs)
– Tourne avec ses droits
FastCGI
– CGI : donc même spécifications
– Mais FastCGI gère un pool de processus et une file
d'attente
Bien plus performant que CGI
Autre module - per_user, itk, suexec, suphp
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 15
16. Liaison Apache - PHP : module
mod_php
Fournit un handler (générateur de contenu) à Apache
Définit des directives
php_value Définit une valeur de php.ini
php_admin_value Définit une valeur de php.ini (hors .htaccess)
php_flag Définit une valeur bool. de php.ini
php_admin_flag Définit une valeur bool. de php.ini (hors .htaccess)
PHPINIDir Localise le fichier php.ini à utiliser
Définit des types MIMEs reconnus par le handler
application/x-httpd-php
application/x-httpd-php-source
text/html
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 16
17. mod_php : activation
Chargement module PHP via mod_so
LoadModule php5_module modules/libphp5.so
Déclenchement du gestionnaire PHP
AddType application/x-httpd-php .php Forçage du type (1)
OU
<FilesMatch .php$>
SetHandler application/x-httpd-php Déclenchement du handler
</FilesMatch>
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 17
19. PHP en module, c'est aussi :
Des directives dans php.ini
engine
child_terminate
last_modified
xbithack
Et des fonctions PHP parfois bien utiles
apache_getenv()
apache_request_headers()
apache_response_headers()
apache_lookup_uri()
...
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 19
20. PHP en CGI
Un process PHP est crée par requête
Peut vite devenir pénalisant
Le CGI tourne avec les droits apache (suExec évite celà)
php53-src> ./configure
Compilation
php52-src> ./configure --enable-force-cgi-redirect
--enable-discard-path
ScriptAlias /cgi
path/to/php/cgi
Activation <Directory /var/www>
addHandler php .php
Action php /cgi/php-cgi
</Directory>
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 20
21. PHP en CGI
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 21
22. PHP en FastCGI
Pas de support natif de FCGI sur Apache 2.2 jusqu'à
septembre 2009
mod_fastcgi ou mod_fcgid existent
mod_fcgid plus récent et plus performant
mod_fcgid intégré dans Apache 2.3 (à venir)
– http://httpd.apache.org/mod_fcgid
Process PHP détachés d'Apache
Connexions persistantes plus efficaces
Isolation mémoire (crashs)
Communication par sockets
Contrôle fin sur la création des process
PHP-FPM (http://php-fpm.org)
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 22
26. php.ini par défaut
Si rien n'est précisé, la recherche s'effectue dans cet ordre :
1. Le dossier du binaire Apache (httpd)
2. Le DocumentRoot /!
3. Windows : Le registre puis le PATH système
4. le dossier renseigné via l'option de configuration
--with-config-file-path ou --with-config-file-scan-dir
Il n'est pas conseillé de laisser le système choisir le php.ini
PHP sait démarrer sans aucun fichier php.ini
--with-config-file-scan-dir pratique pour éclater sa conf
php.ini actuellement utilisé ? => php_ini_loaded_file() (PHP 5.2.4)
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 26
27. Développer en PHP avec Apache
tous les jours
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 27
28. HTTP
GET
Récupération d'une ressource (cachable)
POST
Création ou maj. d'une ressource via un script de traitement
PUT
Dépôt de données brutes, création ou mise à jour d'une ressource
DELETE (coule de source)
OPTIONS
Liste des méthodes supportées par le serveur web
TRACE
Traçage d'informations (rebonds de proxies)
HEAD
Informations sur une ressource
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 28
29. Apache et HTTP
Apache sait tout gérer nativement sauf DELETE
OPTIONS / HTTP/1.1
Host: localhost
HTTP/1.1 200 OK
Date: Fri, 18 Sep 2009 19:50:25 GMT
Server: Apache/2.2.13 (Unix) PHP/5.2.11
Allow: GET,HEAD,POST,OPTIONS,TRACE,PUT
Content-Length: 0
Content-Type: httpd/unix-directory
Apache reconnaît PUT
Mais a besoin d'aide pour l'utiliser
Traitement via programme externe (PHP ?)
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 29
30. Apache : méthode PUT
Script => activer la méthode PUT (entre autre...)
Script PUT /put.php
put.php
<?php
$file = basename($_SERVER['PATH_TRANSLATED']);
$code = file_exists($file) ? 204 : 201;
$uri = "http://".$_SERVER['SERVER_NAME'].$_SERVER['PATH_INFO'];
$return = file_put_contents($file, file_get_contents("php://input"));
$header = $return === false ? null : "Location: $url";
header($header, true, $code);
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 30
31. Apache : méthode PUT
Script PUT /put.php
PUT /foo HTTP/1.1 HTTP/1.1 201 Created
host: afup Date: Fri, 18 Sep 2009 20:09:48 GMT
Content-type: text/plain Server: Apache/2.2.13 (Unix) PHP/5.2.11
Content-Lenght: 14 X-Powered-By: PHP/5.2.11
Location: http://afup/foo
hello from foo
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 31
32. Apache : Limit
<Limit> : limite l'accès par méthodes HTTP
Concerne GET(HEAD), POST, PUT, DELETE, OPTIONS
Pour TRACE => TraceEnable
DocumentRoot /var/www POST /some/path/file.txt HTTP/1.1
<Directory /var/www> Host: afup
<Limit POST PUT>
order allow,deny
Deny from all
</Limit>
Order allow, deny
Allow from all
</Directory> HTTP/1.1 403 Forbidden
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 32
33. Apache : .htaccess
.htaccess, tout le monde connait
Permet d'ajouter des directives à la volée, par répertoire
Peut être renommé (directive AccessFileName)
Ralentit Apache !
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 33
34. .htaccess autorisé ?
AllowOverride ->directives que .htaccess sera autorisé à modifier
N'est valide que dans un conteneur <Directory>
<Directory />
AllowOverride none ignore .htaccess dans tous les dossiers
</Directory> Autorise .htaccess dans le dossier /var/www
Il ne pourra rajouter que des options pour les droits
<Directory /var/www>
AllowOverride limit
</Directory>
Par défaut AllowOverride = All
Enlever AllowOverride sur / -> économies de ressources (défaut)
Il est toujours mieux de ne pas utiliser .htaccess
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 34
35. PHP ou Apache ?
PHP
Générer du contenu (sic!)
Gérer les en-têtes de ce contenu
Apache
Gérer HTTP
Gérer les couches basses (TCP, processus)
Gérer ... ce que PHP ne gère pas
Mapping URI vers fichier sur le disque
Authentification
Permissions
Type du fichier
Génération de contenu (PHP)
Réponse au client
Stockage des erreurs (log)
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 35
36. Apache : quelques exemples
Touche pas à mes images !
SetEnvIfNoCase Referer "^http://mysite.com/" good
SetEnvIfNoCase Referer "^$" good
SetEnvIfNoCase ^User-Agent$ .*(badbot|spider|attacker) !good
<FilesMatch ".(png|jpg|jpeg|gif|bmp|swf|flv)$">
Order Deny,Allow
Deny from all
Allow from env=good
ErrorDocument 403 "Voleur de bande passante"
</FilesMatch>
Proposer la boite de dialogue "sauver sous" :
AddType application/octet-stream .pdf .avi .mp4
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 36
37. Autorisations
Autorise certaines IP, identification (RFC2617)
"Ce site est en construction" :
<Directory /var/www>
AuthType basic
AuthName "Ce site est en construction"
AuthUserFile /.htpasswd
Require valid-user
Order Deny,Allow
Deny from all
Allow from 1.2.3.4/16 // mon parc
Allow from googlebot.com // Google vient
Satisfy Any
</Directory>
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 37
38. Apache : gestion du cache
mod_expires sait envoyer les en-têtes de cache
HTTP ?: http://julien-pauli.developpez.com/tutoriels/web/http/
mod_headers : contrôle manuel des en-têtes
ExpiresActive On GET /page HTTP/1.1
ExpiresByType image/* "access plus 1 month" Host: afup
ExpireDefault "modification plus 2 hours"
HTTP/1.x 200 OK
Date: Fri, 18 Sep 2009 18:44:18 GMT
Server: Apache/2.2.13 (Unix) PHP/5.2.11
Cache-Control: max-age=7200
Expires: Sat, 19 Sep 2009 18:44:18 GMT
Content-Length: 0
Content-Type: text/html; charset=ISO-8859-1
Content-Language: fr
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 38
39. Apache : gestion du cache
ExpireDefault concerne aussi le contenu servi par PHP
sessions PHP? cache invalidé
Réglages dans php.ini ou avec session_cache_limiter()
HTTP/1.x 200 OK
Date: Fri, 18 Sep 2009 18:48:13 GMT
Server: Apache/2.2.13 (Unix) PHP/5.2.11
<?php Expires: Thu, 19 Nov 1981 08:52:00 GMT
session_start() Cache-Control: no-store, no-cache, must-
revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 3
Content-Type: text/html; charset=ISO-8859-1
Content-Language: fr
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 39
40. Apache : compression
mod_deflate
Compresse / décompresse à la volée
Economisez de la bande passante / du temps de transfert
AddOutputFilterByType DEFLATE text/* image/*
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 40
41. Les modules "exotiques"
mod_bw
Limitez la bande passante (dans les 2 sens)
mod_jsmin
Minifiez vos js ou css à la volée avec un cache
mod_tidy
Nettoyez votre (x)Html à la volée en sortie
mod_concat
1 seule requête qui concatène le résultat de X requêtes
mod_qos - mod_slotlimit
Contrôler finement la qualité de service
mod_hitlog
Ajoutez un contenu à toutes vos pages ("include")
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 41
42. Merci,
Question ?
http://julien-pauli.developpez.com
16 novembre 2009 ALTERWAY - Apache pour développeur PHP 42