Apache, Développement Web, PHP

Accélerer et optimiser son intallation PHP avec eAccelerator

Posté par seiyar81 le 12 février 2010 | Laisser un commentaire (0)

Quand on doit gérer un serveur Web, on doit s’occuper avant tout de la sécurité de l’installation, de sa stabilité, etc mais il ne faut pas pour autant négliger les performances. Car oui l’utilisateur final ne se préoccupe pas vraiment de savoir si le serveur risque de tomber à la moindre attaque, et si l’application est trop longue à répondre il ira voir ailleurs s’il peut ou alors va commencer à s’énerver.

J’ai déjà présenté quelques modules pour accélérer Apache, mais aujourd’hui je vais expliquer comment installer très simplement un système de cache d’opcode : eAccelerator.
Avant cela quelques explications.

Qu’est-ce que l’opcode ?

Comme vous le savez tous sûrement, PHP n’est pas un langage compilé, mais interprété. C’est à dire qu’à chaque exécution le code est parcouru puis PHP génère ce qu’on appelle l’opcode qui est en réalité un code compréhensible par la machine qui pourra donc l’exécuter.
Ce processus peut très vite devenir lourd pour la machine dès lors que l’application fait face à un nombre important de clients et les temps de réponses n’en sont que plus long.

Quelles solutions ?

C’est pourquoi on va s’intéresser aux systèmes de cache d’opcode. Ces derniers améliore grandement les performances de PHP en plaçant dans un système de cache ces fameux opcodes.
Il existe plusieurs solutions dont voici une courte liste (non exhaustive) :

  • IonCube: http://www.ioncube.com/sa_encoder.php
  • Zend Platform: http://www.zend.com/en/products/platform/
  • XCache: http://xcache.lighttpd.net/
  • APC: http://pecl.php.net/packages/APC
  • EAccelerator: http://www.eaccelerator.net/

Nous nous intéresserons ici à eAccelerator.
Attention toutefois, eAccelerator ne fonctionne pas si PHP est CGI, il est seulement utilisable avec mod_php ou PHP en FastCGI.

On commence par récupérer la dernière version :

cd /usr/src
wget http://bart.eaccelerator.net/source/0.9.6/eaccelerator-0.9.6.tar.bz2
tar -xf eaccelerator-0.9.6.tar.bz2
cd eaccelerator-0.9.6

Ensuite il nous faut compiler les sources, donc dans le dossier entrez les commandes suivantes :

phpize
./configure 
make

Si le programme phpize n’est pas trouvé, il faut le télécharger :

sudo apt-get install php5-dev

Si tout s’est bien passé, on lance l’installation :

make install

Il nous faut maintenant configurer PHP pour qu’il charge l’extension, on modifie donc le fichier /etc/php5/conf.d/eaccelerator.ini :

zend_extension="/usr/lib/php4/eaccelerator.so"
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

Enfin on créé le dossier dans lequel eAccelerator va stocker son cache :

mkdir /tmp/eaccelerator
chmod 0777 /tmp/eaccelerator

Enfin on vérifie que tout fonctionne bien :

/etc/init.d/apache2 reload
php5 -v
...
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
    with eAccelerator v0.9.6, Copyright (c) 2004-2010 eAccelerator, by eAccelerator
...

Et voilà votre installation de PHP est maintenant plus rapide et plus stable.
J’expliquerais prochainement comment mettre en place très simplement un reverse proxy afin de soulager le serveur Web.

Catégorie: Apache, Développement Web, PHP | Laisser un commentaire (0)

Les modules indispensables pour Apache 2/2

Posté par seiyar81 le 5 janvier 2010 | Laisser un commentaire (0)
Apache

Un bon moment que rien n’avait été posté sur Yriase, mais le manque de temps, le temps pris par d’autres projets (professionnels et personnels), le temps pris par les révisions, bref le temps donc !
Je profite donc de ce court répit pour finir cette partie sur les différents modules indispensables pour Apache.

Pour commencer le mod SuPHP, qui permet à Apache de se faire passer pour le propriétaire du fichier. Utile si plusieurs utilisateurs peuvent créer des fichiers sur le serveur, ou les envoyer par FTP, car ainsi nul besoin de donner les droits au groupe Apache sur les dossiers.
Attention toutefois car SuPHP ne fonctionne pas avec le module PHP5, il faut utiliser PHP5 en CGI.
On configure donc d’abord PHP en CGI :

// Télécharge les paquets
apt-get install libapache2-mod-suphp php5-cgi

// Editer la configuration de php
vim /etc/php5/cgi/php.ini

// On modifie le ou les VirtualHost concernés
vim /etc/apache2/sites-enabled/000-default
Options ExecCGI

// On vérifie la configuration du module
nano /etc/apache2/mods-enabled/suphp.conf

<IfModule mod_suphp.c>
        AddHandler x-httpd-php .php .php3 .php4 .php5 .phtml
        suPHP_AddHandler x-httpd-php
        suPHP_Engine on
        # # Use a specific php config file (a dir which contains a php.ini file)
        #       suPHP_ConfigPath /etc/php4/cgi/suphp/
        # # Tells mod_suphp NOT to handle requests with the type mime-type
        #       suPHP_RemoveHandler mime-type
</IfModule>

On configure ensuite le module avec le fichier correspondant : vim /etc/suphp/suphp.conf

[global]
;Path to logfile
logfile=/var/log/suphp/suphp.log

;Loglevel
loglevel=info

;User Apache is running as
webserver_user=www-data

;Path all scripts have to be in
;docroot=/var/www
docroot=/home/sites

;Path to chroot() to before executing script
;chroot=/mychroot

; Security options
allow_file_group_writeable=false
allow_file_others_writeable=false
allow_directory_group_writeable=false
allow_directory_others_writeable=false

;Check wheter script is within DOCUMENT_ROOT
check_vhost_docroot=true

;Send minor error messages to browser
errors_to_browser=false

;PATH environment variable
env_path=/bin:/usr/bin

;Umask to set, specify in octal notation
;umask=0077
umask=0002

; Minimum UID
min_uid=1000

; Minimum GID
min_gid=1000


[handlers]
;Handler for php-scripts
x-httpd-php=php:/usr/bin/php-cgi

;Handler for CGI-scripts
x-suphp-cgi=execute:!self

Puis on active le module et on redémarre le serveur comme d’habitude :

a2enmod suphp
/etc/init.d/apache2 reload

Maintenant voici un autre module tout aussi intéressant et utile, j’ai nommé : Cband. Très pratique, et je dirais même plus indispensable si on possède un site dont ou souhaite maîtriser la bande passante. Cband nous offre la possibilité de choisir le montant de bande passante à allouer à nos VirtualHosts ainsi qu’à chaque utilisateur. Idéal pour un site de partage de vidéos par exemple ou bien si le serveur héberge plusieurs sites. Attention toutefois, Cband ne fonctionne qu’avec Apache 2.x !

On rentre dans le vif du sujet avec le classique : installation/activation du module.

apt-get install libapache2-mod-cband
a2enmod cband

On ajoute ensuite deux petites lignes à la configuration générale d’Apache (/etc/apache2/apache.conf par défaut) qui vont nous permettre d’améliorer les performances générales :

CBandScoreFlushPeriod 1
CBandRandomPulse On

Avant de redémarrer Apache, nous allons maintenant configurer nos VirtualHosts. Deux directives à connaître pour cela, CBandSpeed et CBandRemoteSpeed qui correspondent à la bande passante d’Apache et de chaque utilisateur.
Pour déclarer une règle c’est très simple, on indique d’abord le débit autorisé, ensuite le nombre de requêtes par seconde et enfin le nombre de connexion simultanées.
Imaginons donc que l’on dispose d’une connexion à 100Mbps et qu’on souhaite allouer 70Mbps à Apache avec 350 requêtes/secondes et 25 connexions simultanées :

<VirtualHost *:80>
...
<IfModule mod_cband.c>
    CBandSpeed 70Mbps 350 25 
    CBandRemoteSpeed 4096 20 4
</IfModule>
...
</VirtualHost>

Par défaut l’unité est le kbps, chaque utilsateur disposera donc de 4096 kbps de bande passante dans le cas présent.
Si vous disposez d’un serveur avec un trafic mensuel maximum par exemple sachez que vous pouvez réguler la bande passante ainsi :

<IfModule mod_cband.c>
    CBandLimit 8G                      // 8Gbps
    CBandPeriod 4W                   // 4 semaines soit environ 1 mois
    CBandPeriodSlice 1W            // Période d'une semaine
    CBandSpeed 500kbps 10 30   // Règle pour Apache
    // Règle en cas de dépassement
    CBandExceededSpeed 128kbps 5 15
    // Fichier utilisé par Cband pour enregistrer tout ça
    CBandScoreboard /var/www/dossier/secret/mondomaine.com.scoreboard
</IfModule>

Enfin Cband offre à la manière de server-status une page pour les statistiques à laquelle il est préférable d’autoriser l’accès par IP :

<IfModule mod_cband.c>
      <Location /cband-status>
            SetHandler cband-status
            Order deny,allow
            Deny from all
            allow from xxx.xxx.xxx.xxx
      </Location>
</IfModule>

Pour finir on enregistre le tout et on redémarre Apache !

Vous connaissez tous probablement CGI ! Si non voici la définition de Wikipédia (histoire de pas raconter trop de bêtises^^) :

CGI, est une interface normalisée utilisée par les serveurs HTTP. Ce dernier, au lieu d’envoyer le contenu d’un fichier (page HTML, image…), exécute un programme puis retourne le contenu généré, comme s’il s’agissait d’un contenu de fichier. CGI est le standard industriel qui indique comment transmettre la requête du serveur HTTP au programme et comment récupérer la réponse générée.
CGI est indépendante de tout langage. Même si le langage Perl a historiquement été souvent utilisé pour en écrire, il est possible d’écrire un programme CGI en C, Python, Gambas, PHP, en script shell, en VB ou en tout autre langage de programmation.

Certains d’entre vous ont d’ailleurs sûrement déjà utilisé PHP en mode CGI, oui si vous utilisez SuPHP !
Et bien FastCGI n’est ni plus ni moins que CGI amélioré, ainsi plusieurs processus peuvent être utilisés pour traiter les requêtes contre un seul pour CGI. Le traitement des requêtes est ainsi considérablement accéléré.
De plus FastCGI est disponible pour Apache, IIS, Tomcat, lighttpd, nginx etc…

Nous allons installer la version développée par OpenMarket disponible ici http://www.fastcgi.com/.
Comme d’habitude :

cd /tmp
wget http://www.fastcgi.com/dist/mod_fastcgi-current.tar.gz
tar -xf mod_fastcgi-current.tar.gz
cd mod_fastcgi-2.4.6

// pour Apache 2
cp Makefile.AP2 Makefile
make 
make install

// Si votre dossier d'installation n'est pas /usr/local/apache2 
make top_dir=/chemin/vers/apache2
make top_dir=/chemin/vers/apache2 install

Une fois installé, il faut l’activer dans la configuration d’Apache. Ajoutez donc la ligne suivante au fichier apache2.conf :
LoadModule fastcgi_module /usr/lib/apache2/modules/mod_fastcgi.so

Vous pouvez ensuite vérifier que le module est bien activé :

// On recharge Apache
/etc/init.d/apache2 reload

// Pour voir la liste des modules chargés
apache2ctl -t -D DUMP_MODULES

Pour les différentes options de configuration que je ne maîtrise pas parfaitement vous pouvez vous référer à la documentation.

Voilà c’est tout pour cette deuxième partie, je consacrerais sûrement des articles à des modules vus plus en détails.

Catégorie: Apache | Laisser un commentaire (0)

Les modules indispensables pour Apache 1/2

Posté par seiyar81 le 27 novembre 2009 | Laisser un commentaire (0)
apache

EDIT : Un bug d’affichage (dû à une balise mal fermée :s) cachait une bonne partie de l’article.

Apache est aujourd’hui et depuis longtemps le serveur HTTP le plus utilisé dans le monde ! Loin devant IIS le serveur de Microsoft, et ses autres concurrents.

D’après Netcraft en Novembre 2009 parmi le million de sites le plus visités :
Apache 67.00%
Microsoft 17.75%
nginx 3.87%
Google 1.98%

Gratuit et open-source son succès tient sûrement à sa stabilité, au fait qu’il soit disponible pour plusieurs OS, et surtout à sa grande modularité !
En effet de très nombreux modules sont disponibles afin de lui rajouter des fonctions, d’améliorer sa sécurité, de l’optimiser etc…
Je vais donc vous présenter les modules qui, selon-moi, sont quasi-indispensables de nos jours pour un serveur Apache.

Je prend ici l’exemple d’un serveur Apache version 2.2.9 tournant sous Debian.

En premier lieu s’il n’est pas déjà installé : le module php5_module si votre serveur est destiné à héberger des pages php pour Apache.

sudo apt-get install php5
// Vous pouvez également rajouter ceci
// php5-dev php5-gd php5-mysql php5-pear 

a2enmod php5
// a2dismod pour décharger un module

/etc/init.d/apache2 restart

Ensuite on peut activer le module deflate_module qui va nous permettre de compresser sans perte soit les pages ou bien les fichiers css et javascript. Un gain de 20 à 40% est alors enregistré, toutefois au dépend des ressources système.
Le module deflate dépend du module headers.

// On active les deux modules
a2enmod headers
a2enmod deflate

Vous pouvez ensuite placer cette configuration dans vos Virtual Host ou vos Directory.

   SetOutputFilter DEFLATE

   # example of how to compress ONLY html, plain text and xml
   # AddOutputFilterByType DEFLATE text/plain text/html text/xml

   # Don't compress binaries
   SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|iso|tar|bz2|sit|rar)$ no-gzip dont-vary

   # Don't compress images
   SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|jpg|ico|png)$  no-gzip dont-vary

   # Don't compress PDFs
   SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary

   # Don't compress flash files (only relevant if you host your own videos)
   SetEnvIfNoCase Request_URI \.flv$ no-gzip dont-vary

   # Netscape 4.X has some problems
   BrowserMatch ^Mozilla/4 gzip-only-text/html

   # Netscape 4.06-4.08 have some more problems
   BrowserMatch ^Mozilla/4\.0[678] no-gzip

   # MSIE masquerades as Netscape, but it is fine
   BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

   # Make sure proxies don't deliver the wrong content
   Header append Vary User-Agent env=!dont-vary

   # Setup custom deflate log
   DeflateFilterNote Input instr
   DeflateFilterNote Output outstr
   DeflateFilterNote Ratio ratio
   LogFormat '"%r" %{outstr}n/%{instr}n %{ratio}n%%' DEFLATE
   CustomLog /var/log/apache2/deflate_log DEFLATE

   # Add file types
   AddOutputFilterByType DEFLATE text/php text/HTML text/txt text/css text/javascript

Affichez quelques pages via votre navigateur et vous verrez que les types de fichiers concernés sont bien compressés.

Un autre module qui va nous permettre de réduire la bande passante utilisée par le serveur : expires_module. Ce module permet de contrôler l’en-tête HTTP Expires. Ainsi lorsqu’une ressource est demandée au serveur et qu’elle est disponible dans le cache du client il ne la demandera pas au serveur à moins que la date ai expirée.

Une configuration classique :

  
       ExpiresActive on 
       ExpiresByType image/jpg "access 1 month"
       ExpiresByType image/gif "access 1 month"
       ExpiresByType image/png "access 1 month"
       ExpiresByType application/x-shockwave-flash "access 1 month"
       ExpiresByType text/html "access 1 day"
       ExpiresDefault "access 2 days" 
  

Les images de types jpg, gif et png ont une date d’expiration d’un mois, les pages html d’un jour et tous les autres types de ressources 2 jours.
Les types MIME sont listés dans le fichier /etc/mime.types.

Maintenant un module qui va contrôler les requêtes effectuées et bannir les IP qui abusent : mod_evasive.

L’installation :

// Choississez le dossier d'installation
cd dossier_installation
wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz
tar-zxvf mod_evasive_1.10.1.tar.gz 
cd mod_evasive
// Compilation du module
apxs2 -cia mod_evasive20.c

// Activation, change selon l'emplacement et l'organisation de vos fichiers de configuration
cd /usr/local/conf/
vim httpd.conf
// Ajoutez ceci
LoadModule evasive20_module   modules/mod_evasive20.so

Un exemple de configuration :


        DOSHashTableSize 3097

        # Nbre d'affichage de la même page par IP
        DOSPageCount 10

        # Nbre d'affichage du même site par IP
        DOSSiteCount 50

        # Interval d'affichage de la même page par IP
        DOSPageInterval 1

        # Interval d'affichage du même site par IP
        DOSSiteInterval 1

        # Durée du blocus (exprimé en secondes)
        DOSBlockingPeriod 5

        # Notification par adresse email pour être prévenu
        DOSEmailNotify mail@domain.com

        # Nouveau dossier pour y placer le logs du module
        DOSLogDir "/var/log/apache2/evasive/"

        # Utlisation d'iptables pour bannier l'IP qui tente de saturer le serveur
        DOSSystemCommand "/sbin/iptables -I INPUT -s %s -j DROP"

        # Liste blanche permettant à une IP d'effecuer un nombre illimité de requètes
        DOSWhiteList 127.0.0.1

Et un petit /etc/init.d/apache2 restart pour redémarrer le serveur.

Dans la prochaine partie j’ajouterai d’autres modules et complèterai peut-être la configuration des modules de cet article.

Bonne configuration.

Catégorie: Apache, Internet, Linux | Laisser un commentaire (0)