Dans ce nouvel épisode du guide d’installation d’un serveur Web sous Debian, nous allons voir un élément important : le serveur Web avec Apache 2 et PHP5.

 

Je vais ici décrire les étapes pour l’installation la plus courante : celle d’Apache 2 couplé à PHP 5 en module. Dans cette configuration, Apache 2 représente le serveur Web dont le travail sera principalement d’afficher les pages et PHP5 sera notre « serveur d’application » qui lui sera chargé de générer les pages dynamiques.

Dans une configuration où PHP5 est en module d’Apache, les deux éléments partageront le même processus sur le système d’exploitation : apache2 (ou httpd). Il existe d’autres configurations de type CGI ou FastCGI/PHP-FPM où PHP possède son propre processus distinct de celui d’Apache. L’installation diffère alors dans ce cas.

Une des idées répandues sur les mauvaises performances d’Apache vient d’ailleurs parfois d’une mauvaise interprétation de l’architecture, puisqu’il est ici difficile de distinguer les ressources consommées réellement par Apache, et celles consommées par l’exécution de scripts par le module PHP. Rassurez-vous, cette configuration d’Apache et de PHP est l’une des plus performantes dans le monde Linux.

Installation d’Apache 2 et PHP5

L’installation d’Apache 2 + PHP5 en module est un jeu d’enfant.

Pour Apache 2 :

apt-get install apache2.2-common

Pour PHP5 en module :

apt-get install libapache2-mod-php5

Et c’est aussi simple que ça, les dépendances utiles s’installant automatiquement.

Personnellement, j’installe systématiquement quelques modules supplémentaires pour PHP5 :

Xcache qui est un cache d’opcode qui permet d’accélérer la génération des pages PHP en gardant en cache le code PHP compilé :

apt-get install php5-xcache

GD et Imagick sont des bibliothèques permettant la manipulation des images. Ils sont souvent utilisés dans des projets PHP bien connus de type forums, CMS, galeries, etc.

apt-get install php5-gd php5-imagick

Curl est souvent utilisé pour télécharger des fichiers distants, des pages Web, pour appeler des services distants, etc.

apt-get install php5-curl

Et enfin le paquet php5-mysql pour communiquer avec MySQL :

apt-get install php5-mysql

Configuration d’Apache 2

Je ne vais pas m’étendre sur le sujet, la plus grande partie de la configuration dépendant des sites installés.

La configuration standard d’Apache est maintenant relativement correcte, je vous recommande par contre de vérifier que seuls les modules qui vous sont utiles sont activés. Personnellement, j’active le module rewrite pour la réécriture des URL, et je désactive des modules que je n’utilise pas comme mod_authz_groupfile ou mod_negotiation ou que je ne recommande pas d’un point de vue sécurité comme autoindex qui permet d’indexer automatiquement les fichiers d’un répertoire.

a2enmod rewrite
a2dismod mod_authz_groupfile autoindex mod_negotiation

Configuration de PHP5

Vous vous souvenez juste au dessus, je recommandais l’utilisation d’Xcache. Il faut donc maintenant le paramétrer.
Remplacer ou modifier le fichier /etc/php5/conf.d/xcache.ini pour qu’il contienne les lignes suivantes :

[xcache.admin]
xcache.admin.user = "${USERNAME}"
xcache.admin.pass = "${XCACHE_PASSWORD}"
 
[xcache]
xcache.shm_scheme =        "mmap"
xcache.size  =                64M
xcache.count =                 1
xcache.slots =                8K
xcache.ttl   =                 0
xcache.gc_interval =           0
xcache.var_size  =            10M
xcache.var_count =             1
xcache.var_slots =            8K
xcache.var_ttl   =             0
xcache.var_maxttl   =          0
xcache.var_gc_interval =     300
xcache.test =                Off
xcache.readonly_protection = Off
xcache.mmap_path =    "/dev/zero"
xcache.coredump_directory =   ""
xcache.cacher =               On
xcache.stat   =               On
xcache.optimizer =            On
[xcache.coverager]
xcache.coverager =          Off
xcache.coveragedump_directory = ""

Ici, ${USERNAME} doit contenir le nom de l’administrateur xcache, et ${XCACHE_PASSWORD} le mot de passe hashé en MD5. Les variables importantes sont xcache.size qui contient l’espace mémoire alloué à votre base xcache, et xcache.var_size la taille allouée pour les variables. Les variables xcache.count et xcache.var_count doivent refleter le nombre de CPU que vous avez sur votre serveur. Vous pouvez obtenir ce chiffre avec une commande du type :

cat /proc/cpuinfo | grep -c processor

Pour l’administration, il faut également ajouter l’alias qui va bien dans la configuration :

Alias /xcache-admin /usr/share/xcache/admin

La configuration de PHP est aujourd’hui largement facilitée grâce au fichier de configuration php.ini qui est bien détaillé. Celui-ci contient en effet plusieurs exemples des paramètres à adopter en fonction de l’environnement de votre machine : Développement (Development Value) ou Production (Production Value). Sur un environnement de production, vous ne devez en effet pas afficher des informations de configuration ou de débogage (erreurs rencontrées par exemple).

Un parcours du fichier /etc/php5/apache2/php.ini est tout de même vivement conseillé, au moins pour prendre connaissance des principaux paramètres et vérifier que la configuration en place est bien celle adaptée à votre environnement. Il faut par exemple vérifier des paramètres comme display_errors, error_reporting, log_errors, register_globals, register_argc_argv, expose_php, allow_url_fopen, etc.

display_errors indique si PHP doit afficher ou non les erreurs. Sur un environnement de production, il peut être dangereux d’afficher les messages d’erreur et il est donc conseillé de désactiver cette fonction.

display_errors = Off

error_reporting indique le niveau d’erreur à afficher dans les logs (erreurs, warnings, informations). En production, il est en conseillé de n’afficher que les erreurs et warnings pour éviter de polluer les logs.

error_reporting = E_ALL & ~E_DEPRECATED

log_errors indique si les messages d’erreur doivent être inscrits dans un fichier. Comme on ne les affiche pas sur un environnement de production, il faut au moins les enregistrer dans les fichiers de logs.

log_errors = On

register_globals indique si les variables de type GET, POST, cookies doivent être enregistrées automatiquement en tant que variables globales. Ce paramétrage est dangereux pour la sécurité et est donc positionné à Off par défaut depuis PHP 4.2. Vous pouvez consulter cet article pour en savoir plus.

register_globals = Off

register_argc_argv permet de définir automatiquement les paramètres $argv et $argc qui contiennent les arguments passés au script et leur nombre. C’est utile pour les scripts lancés en ligne de commande. Cette option consommant des ressources, elle doit être désactivée en production.

register_argc_argv = Off

expose_php indique si PHP doit indiquer sa version dans les entêtes du serveur Web, ça ne sert pas à grand chose et c’est une information qui peut être utile à un attaquant pour exploiter les failles de votre serveur.

expose_php = Off

Certains paramètres pouvant influer sur les performances peuvent aussi être modifiés :

  • max_execution_time qui correspond au temps maximum que peut prendre l’exécution d’un script,
  • max_input_time qui correspond à la durée maximale pour recevoir les données d’entrée,
  • memory_limit qui correspond à la limite mémoire que peut consommer un script.

En plus de ces vérifications, je vous conseille de paramétrer les variables qui suivent :
date.timezone : ce paramétrage est indispensable sinon gare aux messages d’erreur en boucle dans les logs.

date.timezone = Europe/Paris

upload_max_filesize indique la taille maximale des fichiers qui peuvent être envoyés. Ce paramétrage est typiquement utile si les internautes peuvent envoyer des fichiers sur votre site ou si l’administration du site intègre la publication d’images ou de fichiers comme par exemple le gestionnaire de media de WordPress.
Exemple :

upload_max_filesize = 8M

post_max_size indique la taille maximale des données qui pourront être envoyées via des requêtes POST. Cette option affecte également les fichiers chargés. Pour charger de gros fichiers, cette valeur doit être plus grande que la valeur de upload_max_filesize. La limite par défaut est souvent trop basse pour certaines applications, si c’est le cas il suffit de modifier cette valeur :

post_max_size = 8M

Une petite page de test ?

Pour tester rapidement votre serveur, vous pouvez par exemple créer un fichier phpinfo.php dans /var/www : /var/www/phpinfo.php

<?php phpinfo(); ?>

Et on redémarre Apache pour prendre en compte les modifications :

/etc/init.d/apache2 restart

Vous pouvez alors tester l’accès à votre page à l’adresse http://votredomaine/phpinfo.php

La prochaine fois nous verrons l’installation de MySQL qui sera bien utile pour accompagner notre petit serveur Web.

Navigation<< NTP – Synchroniser l’heure de son système avec un serveur de tempsInstallation de nginx – le serveur Web hautes performances >>

 


 

12 réponses pour "Installation d’Apache 2 et PHP5"

  1. Nicolargo  Surfe sur Mozilla Firefox Mozilla Firefox 4.0b12pre avec Linux Linux
    11 février 2011 @ 15:41
    1

    Une optimisation possible est d’utiliser le module externe PHP FPM (PHP FastCGI) qui s’occupera de l’exécution des scripts PHP dans un processus indépendant d’Apache. C’est mieux niveau sécurité mais également niveau performance.

    J’ai détaillé l’installation avec un serveur Web Nginx mais la procédure est grosso modo la même pour Apache:

    http://blog.nicolargo.com/2011/01/installation-et-test-de-nginx-sous-ubuntu.html

    A+

  2. magik_cypress  Surfe sur Mozilla Mozilla 1.9.2.13 avec Ubuntu Linux Ubuntu Linux
    11 février 2011 @ 15:56
    2

    Superbe ! Je recommanderai d’installer suPHP dans le cas d’une mutualisation des comptes web.

  3. Papy  Surfe surUnknown browser
    11 février 2011 @ 16:09
    3

    Ca arrive après ;)
    J’utilise NGinx + Php-FPM pour le blog, et plus du tout Apache.

    Par contre pour les perfs Apache en FCGI ou mod_php ca se discute. Tout le monde ne s’accorde pas sur le sujet.
    L’avantage d’utiliser du CGI/FCGI pour Apache est de pouvoir passer du module prefork à worker et donc d’une gestion multi-process a une gestion multi-thread. En pratique prefork est souvent plus performant (avec mod_php) mais aussi plus consommateur de ressources. Pour Worker, il faut aussi que tous les modules soient compatibles.

  4. Greg  Surfe sur Mozilla Firefox Mozilla Firefox 3.6.13 avec Windows Windows XP
    11 février 2011 @ 16:09
    4

    Heu sérieusement, pourquoi xcache et pas apc ? Je préfère (et je ne suis vraiment pas le seul) apc de très loin…

    « Xcache qui est un cache d’opcode qui permet d’accélérer la génération des pages PHP en gardant en cache les pages PHP compilées : » … Non, c’est le code php qui est gardé en cache, pas les pages généré.

    Il faut aussi activer d’autre mod pour apache quelque soit la conf : deflate, header, expire …

  5. Papy  Surfe sur Safari Safari 6531.22.7 avec iOS iOS 4.1
    11 février 2011 @ 16:33
    5

    @Greg – Je ne vois rien contre l’utilisation d’APC je te rassure. C’est juste que j’utilisais xcache historiquement, et au moment de faire mon choix j’avais eu des problèmes pour utiliser le cache d’objets de WordPress avec les autres.

    Merci pour la correction sur la phrase (qui ne voulait rien dire ;) )

    Sinon OK pour les mods d’Apache, rewrite est le seul qui n’est pas activé par défaut et que j’utilise systématiquement. Pour déflate je crois que ça peut poser problème avec de vieux navigateurs genre IE6, c’est pour ça que je ne l’ai pas mis.

  6. hyc  Surfe sur Google Chrome Google Chrome 9.0.597.94 avec Windows Windows XP
    12 février 2011 @ 4:45
    6

    Juste une petite question concernant justement la partie du code php mise en cache. Je voudrais savoir si ce qui est mis en cache est finalement le fichier php tel quel, ou bien si c’est après interpretation. En fait, voici plutot ce que j’aimerais obtenir:

    je possède un code php que j’ai ‘crypté’ (ascii, base64 etc..). ce code est fonctionnel dans son état. ce qui veut dire qu’à son execution, apache va à un moment donné le décrypter, en l’executant. je voudrais savoir si ce code décrypté était mis en cache et donc récupérable ou non.

    je n’utilise peut être pas les termes exactes, je m’en excuse au préalable.

    merci d’avance !

  7. Aikadil  Surfe sur Mozilla Firefox Mozilla Firefox 3.6.13 avec Ubuntu Linux Ubuntu Linux
    12 février 2011 @ 14:52
    7

    Non sérieusement… Save The Web refuser IE6 sur vos sites webs…

  8. Papy  Surfe sur Mozilla Firefox Mozilla Firefox 4.0b11 avec Mac OS X Mac OS X 10
    12 février 2011 @ 22:59
    8

    @hyc – l’opcode est caché en mémoire, donc pas si facilement récupérable et surtout c’est du code plus proche du code « machine » donc je ne suis pas sûr qu’on puisse comprendre grande chose à ce code là.
    http://www.journaldunet.com/developpeur/tutoriel/php/040209php_systemes_cache1a.shtml

    @Aikadil – je te rassure, c’était à l’époque où j’utilisais Apache, une époque bien lointaine maintenant ^^
    Suffit de jeter un coup d’œil au site sous IE6… c’est moche ;)

  9. Minipipo1  Surfe sur Mozilla Firefox Mozilla Firefox 3.6.13 avec Ubuntu Linux Ubuntu Linux
    16 février 2011 @ 12:48
    9

    Ah, une petite erreur : la dernière commande pour redémarrer Apache n’est pas :
    # /etc/init.d/apache restart
    mais :
    # /etc/init.d/apache2 restart
    ;-)

  10. Papy  Surfe sur Mozilla Firefox Mozilla Firefox 4.0b11 avec Mac OS X Mac OS X 10
    16 février 2011 @ 13:40
    10

    @Minipipo1 – merci, c’est corrigé.

  11. hycday  Surfe sur Google Chrome Google Chrome 9.0.597.98 avec Windows Windows XP
    22 février 2011 @ 19:48
    11

    Merci Papy pour ce guide très complet!
    J’ai une petite question, simple curiosité:
    je cherche un guide (pourquoi pas dans la continuité de celui-ci) afin de monter un serveur RTMP (RED5 etc..) mais je ne trouve rien de vraiment complet ou adressé aux novices. Penses tu qu’un jour viendra où tu t’y pencheras ou non ?

    Merci d’avance !

    HYC

  12. sparkplug  Surfe sur Mozilla Firefox Mozilla Firefox 4.0 avec Windows Windows 7
    28 avril 2011 @ 8:03
    12

    Il manque la partie sur le serveur Mysql non ?

"Tuez les tous, PapyGeek reconnaîtra les siens." +