Download docx - Cahier Des Charges

Transcript
Page 1: Cahier Des Charges

Cahier des charges

Optimisation/Sécurité d’un serveur Web NGINX/PHP/MySQL

Cyril CADET/Habib BAKAKAS

11M1 CERI Avignon 2010/2011

Page 2: Cahier Des Charges

M1 CERI Cahier des charges 2010-2011

Contenu

1. Avant-propos................................................................................3

2. Introduction.................................................................................3

3. Partie Optimisation......................................................................3

3.1. Nginx.....................................................................................3

3.2. Les cache d’opcode...............................................................4

3.3. eAccelerator...........................................................................4

4. Serveur Web Nginx......................................................................5

5. Memcache....................................................................................5

5.1. MySQL et memcached...........................................................7

6. MySQL & Memcached..................................................................7

7. Disponibilité/Robustesse..............................................................9

7.1. Réplication Master/slave temps réel MySQL..........................9

8. ANNEXE......................................................................................11

8.1. Mise en place de NGINX+PHP-FPM......................................11

Installation.................................................................................11

Script de démarrage..................................................................12

8.2. Mise en place de eAccelerator.............................................13

Installation.................................................................................13

Configuration.............................................................................14

8.3. Mise en place de Percona Serveur.......................................16

Installation.................................................................................16

8.4. Mise en place de memcache................................................16

1

Page 3: Cahier Des Charges

M1 CERI Cahier des charges 2010-2011

1. Avant-propos

Nous participons au développement et à la mise en production d’un jeu de stratégie Web moderne (ajax/jQuery, php5/symfony/doctrine) utilisant des techniques innovantes. Plus précisément nous déterminerons l'architecture réseau (serveur web, mysql, php) permettant un fonctionnement optimal du jeu de stratégie.

Nous avons au premier semestre fait l’étude de la technologie que nous allons adoptée (grâce aux différents benchmarck). Ce rapport va montrer un descriptif sur l’optimisation de notre serveur Web, serveur PHP, serveur MySQL pour qu’il puisse supporter une charge importante. Il va également traiter de la partie robustesse en traitant la réplication MySQL ainsi que la sécurisation du serveur Web.

2. Introduction

Devant un nombre croissant de connexions, les performances des serveurs Web s'effondrent. Afin d'améliorer les temps de réponse, le premier réflexe est généralement de dissocier le serveur HTTP et la base de données. Une solution tout aussi courante consiste à augmenter le nombre de serveurs HTTP en utilisant des solutions de « load balancing ».

Si ces solutions se montrent généralement efficaces, elles restent néanmoins coûteuses en termes de matériel et d'hébergement. De plus, elles sont parfois complexes à mettre en œuvre. Pourtant d'autres solutions trop souvent méconnues existent. C’est en particulier le cas des « optimiseurs » et des systèmes de cache (« opcode » ou fichiers).

2

Page 4: Cahier Des Charges

M1 CERI Cahier des charges 2010-2011

3. Partie Optimisation

3.1. Nginx

Configuration des Vhosts

Principe de l’URL Rewriting

Le principe de la réécriture d'URL est de mettre en place un « système » sur le serveur pour qu'il sache interpréter ce nouveau format d'URL. Dans notre exemple, quand un visiteur accède à la page http://www.notre-site.com/articles/article-12-2-5.html, le serveur doit renvoyer exactement la même chose que si le visiteur avait demandé à accéder à la page http://www.notre-site.com/articles/article.php?id=12&page=2&rubrique=5.

La correspondance entre les deux schémas d'URL est alors décrite sous forme de « règles de réécriture ». Chaque règle permet de décrire un format d'URL. Dans l'exemple ci-dessus, la règle de réécriture va indiquer au serveur de prendre le premier nombre comme numéro d'article, le deuxième comme numéro de page et le troisième comme numéro de rubrique.

La technique de réécriture d'URL la plus connue est celle disponible sur les serveurs Apache, le plus souvent utilisés avec le langage PHP. Sauf mention spéciale, tous les exemples de cet article seront donc consacrés au langage PHP et au serveur Apache.

3

Page 5: Cahier Des Charges

M1 CERI Cahier des charges 2010-2011

Optimisation

La configuration générale de Nginx se fait via "/etc/nginx/nginx.conf"L'information sur les directives se trouve sur wiki.nginx.org/CoreModule

SIGNATURE : pour enlever la signature du serveur, il suffit d'ajouter la ligne suivante :

server_tokens off;

PROCESSUS NGINXLe réglage des processus se fait via "worker_processes" et "worker_connections" qui définissent le paramètre "max_clients" selon la régle suivante :

max_clients = worker_processes * worker_connections

La recommandation pour "worker_processes" est de le fixer avec une valeur égale au nombre de processeurs. exemple pour une machine avec 8 coeurs :

worker_processes 8;

3.2. Les cache d’opcode

Lors de l’exécution d’un script, PHP5 procède ainsi :

- il charge l’intégralité du script- il convertit les instructions en opcodes (sorte de langage

intermédiaire entre le script et un exécutable),- il exécute les instructions. Lorsqu'un même script est appelé

plusieurs fois, ces opérations sont renouvelées. Ceci est une perte de temps évidente.

4

Page 6: Cahier Des Charges

M1 CERI Cahier des charges 2010-2011

Les solutions de cache d’opcode se proposent donc d’effectuer une mise en cache des opcodes, afin d’en garder une trace. Ceci permet à PHP5 de les exécuter directement.

3.3. eAccelerator

eAccelerator is a free open-source PHP accelerator & optimizer. It increases the performance of PHP scripts by caching them in their compiled state, so that the overhead of compiling is almost completely eliminated. It also optimizes scripts to speed up their execution. eAccelerator typically reduces server load and increases the speed of your PHP code by 1-10 times.

eAccelerator was born in December 2004 as a fork of the Turck MMCache

project. Turck MMCache was created by Dmitry Stogov and much of the eAccelerator code is still based on his work.

eAccelerator stores compiled PHP scripts in shared memory and executes code directly from it. It creates locks only for a short time, while searching for a compiled PHP script in the cache, so one script can be executed simultaneously by several engines. Files that can't fit in shared memory are cached on disk only.

The latest release, 0.9.6.1, features support for PHP 5.3 and also works with PHP 5.1 and 5.2. The previous 0.9.5 branch supports PHP 4 and all PHP 5 releases including 5.2. In older releases, the encoder will only work with PHP versions from the 4.x.x branch.

4. Serveur Web Nginx5

Page 7: Cahier Des Charges

M1 CERI Cahier des charges 2010-2011

5. Memcache

Pour de meilleures performances sur vos sites web

Memcache est un serveur de cache qui utilise la mémoire vive du serveur pour stocker ses données. Ce mode de stockage garantit des temps de lecture très inférieurs au système traditionnel cd cache de fichiers.

Memcached et eAccelerator peuvent fonctionner ensemble sans aucun problème. •Memcached met en cache les résultats et diverses variables de php. •eAccelerator optimise le code PHP. Url du site officiel : http://memcached.org/

5.1. MySQL et memcached

6. MySQL & Memcached

Memcached améliore les performances et l'évolutivité des sites Web dynamiques sous MySQL en mettant des données et des objets en mémoire cache pour soulager la charge pesant sur la base de données. Les plus grands noms du Web, comme YouTube, Facebook,

6

Page 8: Cahier Des Charges

M1 CERI Cahier des charges 2010-2011

Fotolog ou Wikipedia déploient Memcached et MySQL pour satisfaire la demande de millions d'utilisateurs visionnant chaque mois des milliards de pages.

« Memcached s'est révélé un composant crucial de l'architecture Web 2.0 de Fotolog. Il nous a permis de devenir l'une des principales destinations en ligne : nous servons des milliards de pages vues par mois depuis 2006 »Farhan « Frank » Mashraqi, Directeur des opérations commerciales et de la stratégie technique de Fotolog Inc

Memcached et MySQL permet aux entreprises :

- de mettre en place une solution de mise en cache des données évolutive et performante pour leurs applications en ligne

- de réduire le coût total de possession (TCO) des bases de données en supprimant les coûts de licences de logiciels propriétaires de mise en cache des données

- de réduire le TCO système en utilisant mieux des ressources telles que la RAM inactive ou disponible sur les systèmes existants

- d'augmenter ou de réduire de façon incrémentielle la capacité de mise en cache des données, à la demande, afin de réagir rapidement à l'évolution des besoins.

La principale utilisation de Memcached : cacher les requêtes MySQL. Mais il faut savoir que Memcached ne se limite pas à MySQL.

Le principe, c’est de mettre en cache dans memcached les requêtes lourdes. Le resultat de la requête se trouvera dans memcached. Au lieu de faire un SELECT compliqué sur une base de données avec des accès disques, on fait simplement un accès à la mémoire.

7

Page 9: Cahier Des Charges

M1 CERI Cahier des charges 2010-2011

7. Disponibilité/Robustesse

7.1. Réplication Master/slave temps réel MySQL

La réplication MySQL consiste à avoir en temps réel deux bases de données MySQL identiques afin de pouvoir basculer sur un deuxième serveur en cas de défaillance du premier.

La réplication MySQL est basée sur le fait que le serveur va garder la trace de toutes les évolutions de vos bases (modifications, effacements, etc.) dans un fichier de log binaire et les esclaves vont lire les requêtes du maître dans ce fichier de log, pour pouvoir exécuter les mêmes requêtes sur leurs copies. Il est très important de comprendre que le fichier de log binaire est simplement un enregistrement des modifications depuis un point fixe dans le temps (le moment où vous activez le log binaire). Tous les esclaves que vous activez auront besoin de la copie des données qui existaient au moment du démarrage du log. Si vous démarrez vos

8

Page 10: Cahier Des Charges

M1 CERI Cahier des charges 2010-2011

esclaves sur sans qu’ils ne disposent des données identiques à celles du maître au moment du démarrage du log binaire, votre réplication va échouer.

Nous partons avec l’architecture suivante:

Deux serveurs A, et B sous Linux (réalisé sous Debian) ayant chacun une base de donnée MySQL.

IP Serveur A: 192.168.0.1

IP Serveur B: 192.168.0.2

9

Page 11: Cahier Des Charges

M1 CERI Cahier des charges 2010-2011

10

Page 12: Cahier Des Charges

M1 CERI Cahier des charges 2010-2011

8. ANNEXE

8.1. Mise en place de NGINX+PHP-FPM

Installation

# Près-requisaptitude install build-essential libpcre3-dev libssl-dev zlib1g-dev aptitude install php5-cli php5-common php5-mysql php5-suhosin php5-fpm php5-cgi php-pear php5-xcache php5-gd php5-curl

# Téléchargement des fichierswget http://sysoev.ru/nginx/nginx-0.8.54.tar.gz

# Extractiontar zxvf nginx-0.8.54.tar.gz

# Configurecd nginx-0.8.54./configure \--conf-path=/etc/nginx/nginx.conf \ --error-log-path=/var/log/nginx/error.log \--pid-path=/var/run/nginx.pid \--lock-path=/var/lock/nginx.lock \ --http-log-path=/var/log/nginx/access.log \ --with-http_dav_module \ --http-client-body-temp-path=/var/lib/nginx/body \ --with-http_ssl_module \ --http-proxy-temp-path=/var/lib/nginx/proxy \ --with-http_stub_status_module \ --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \ --with-debug \ --with-http_flv_module \

# Compilationmake

# Installationmake install

# Création des repertoires que l’on a besoinmkdir /var/lib/nginxmkdir /etc/nginx/conf.dmkdir /etc/nginx/sites-enabled

Script de démarrage

11

Page 13: Cahier Des Charges

M1 CERI Cahier des charges 2010-2011

#! /bin/sh

### BEGIN INIT INFO# Provides: nginx# Required-Start: $all# Required-Stop: $all# Default-Start: 2 3 4 5# Default-Stop: 0 1 6# Short-Description: starts the nginx web server# Description: starts nginx using start-stop-daemon### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/binDAEMON=/usr/local/nginx/sbin/nginxPID=/var/run/nginx.pidNAME=nginxDESC=nginx

test -x $DAEMON || exit 0

# Include nginx defaults if availableif [ -f /etc/default/nginx ] ; then . /etc/default/nginxfi

set -e

case "$1" in start) echo -n "Starting $DESC: " start-stop-daemon --start --quiet --pidfile $PID \ --exec $DAEMON -- $DAEMON_OPTS echo "$NAME." ;; stop) echo -n "Stopping $DESC: " start-stop-daemon --stop --quiet --pidfile $PID \ --exec $DAEMON echo "$NAME." ;; restart|force-reload) echo -n "Restarting $DESC: " start-stop-daemon --stop --quiet --pidfile $PID \ --exec $DAEMON sleep 1 start-stop-daemon --start --quiet --pidfile \ /usr/local/nginx/logs/nginx.pid --exec $DAEMON -- $DAEMON_OPTS echo "$NAME." ;; reload) echo -n "Reloading $DESC configuration: " start-stop-daemon --stop --signal HUP --quiet --pidfile $PID \ --exec $DAEMON echo "$NAME." ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop|restart|force-reload}" >&2 exit 1 ;;esac

12

Page 14: Cahier Des Charges

M1 CERI Cahier des charges 2010-2011

exit 0

# On donne les droits au script, on le configure pour le démarrage mv nginx /etc/init.d/chmod 755 /etc/init.d/nginx/usr/sbin/update-rc.d -f nginx defaults

# démarrer PHP-FPM et NGINX/etc/init.d/php5-fpm start/etc/init.d/nginx start

8.2. Mise en place de eAccelerator

Installation

# Près-requis pour utiliser phpsizesudo apt-get install php5-dev

# Téléchargement derniere versionwget http://bart.eaccelerator.net/source/0.9.6.1/eaccelerator-0.9.6.1.tar.bz2

# Extractiontar jxvf eaccelerator-0.9.6.1.tar.bz2 cd eaccelerator-0.9.6.1

# Compilationphpize./configuremake sudo make install

# dire à PHP de charger la librairie: sudo echo "; configuration for php eaccelerator module" > /etc/php5/conf.d/eaccelerator.inisudo echo "extension=eaccelerator.so" >> /etc/php5/conf.d/eaccelerator.ini

#On redémarre le serveur phpsudo /etc/init.d/php5-fpm restart

13

Page 15: Cahier Des Charges

M1 CERI Cahier des charges 2010-2011

Configuration

# Création d’un répertoire et modification des droits /var/www/cache/eaccelarator avec un chmod de 0777 pour qu'il soit disponible en lecture et écriture

mkdir /var/www/cache/eacceleratorchmod 0777 /var/www/cache/eaccelerator

# Mise en place des options dans eaccelerator.ini dans le répertoire /etc/php5/conf.d/

vim /etc/php5/conf.d/eaccelerator.iniextension="eaccelerator.so"eaccelerator.shm_size="16"eaccelerator.cache_dir="/var/www/cache/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"

Explications des différentes options disponibles :

eaccelerator.shm_size = "64"

Cette variable permet de définir la quantité de mémoire partagée à allouer à eAccelerator. Valeur par défaut : 0 qui correspond à la valeur par défaut du système d'exploitation.

eaccelerator.cache_dir ="/var/www/cache/eaccelerator"

Répertoire dans lequel sont stockées les pages "cachées" de eaccelerator, pour Windows, le chemin doit être du type "C:pathtotmp".

eaccelerator.enable = "1"

Active ou désactive eAccelerator, 1 pour activé et 0 pour désactivé. Par défaut : 1.

14

Page 16: Cahier Des Charges

M1 CERI Cahier des charges 2010-2011

eaccelerator.optimizer = "1"

Active ou désactive l'optimiseur de eAccelerator qui sert à augmenter les performances. 1 pour activé et 0 pour désactivé. Par défaut : 1.

eaccelerator.debug = "0"

Active ou désactive les logs de eAccelerator. Par défaut : 0.

eaccelerator.check_mtime = "1"

Active ou désactive le comparateur (basé sur la date) de eAccelerator. Si vous modifiez souvent vos scripts, donnez la valeur "1" à cette variable, sinon donnez-lui la valeur "0".

eaccelerator.filter = ""

Specifie les extensions de fichiers susceptible d'être mis en cache par eAccelerator. Exemple: ".php *.phtml". La négation de cette exemple est "!.php *.phtml" (notez le caractère "!" au début de l'expression. Valeur par défaut : "", en l'occurence, met en cache tous les fichiers php).

eaccelerator.shm_max = "0"

Spécifie la quantité de mémoire partagée maximale pour l'utilisation de la fonction "eaccelerator_put()". Exemple : 10240, 10K, 1M. Valeur par défaut : "0", en l'occurence, aucune limite de mémoire.

eaccelerator.shm_ttl = "0"

Quand eAccelerator a atteint sa limite de mémoire partagée, il enlèvera de cette mémoire tous les scripts qui n'ont pas été sollicités depuis "shm_ttl" seconde. Valeur par défaut : 0, en l'occurence, n'enlève aucun script de la mémoire.

eaccelerator.shm_prune_period = "0"

Quand eAccelerator a atteint sa limite de mémoire partagée, il essaiera d'enlever les scripts les plus vieux dont le code compilé a été créer il y a plus de "shm_prune_period" seconde. Valeur par défaut "0", en l'occurence, n'enleve aucun script de la mémoire.

eaccelerator.shm_only = "0"

15

Page 17: Cahier Des Charges

M1 CERI Cahier des charges 2010-2011

Active ou désactive l'utilisation du disque pour le stockage des données (n'a aucun effet sur les données relatives aux sessions et le cache du contenu, on parle ici de code compilé intermédiaire). Valeur par défaut : "0", en l'occurence, l'utilisation du disque ET de la mémoire est autorisé.

eaccelerator.compress = "1"

Active ou désactive la compression du cache du contenu. Valeur par défaut : "1", en l'occurence, les données mises en cache sont compressées.

eaccelerator.compress_level = "9"

Specifie l'indice de compression utilisé pour le stockage des données mise en cache. Valeur par défaut : "9", en l'occurence, l'indice de compression maximum.

8.3. Mise en place de Percona Serveur

Installation

# Les paquets Debian depuis Percona sont signés avec une clé. Ajout de la clé :

gpg --keyserver hkp://keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A... [some output removed] ...gpg: imported: 1

gpg -a --export CD2EFD2A | apt-key add -

#Ajout des dépôts dans : /etc/apt/sources.list :

deb http://repo.percona.com/apt lenny maindeb-src http://repo.percona.com/apt lenny main

# On fait un update: apt-get update

# Installation :apt-get install percona-server-client-5.1 percona-server-server-5.1 percona-server-common

16

Page 18: Cahier Des Charges

M1 CERI Cahier des charges 2010-2011

8.4. Mise en place de memcache

# Installationaptitude install memcached

# On lance memcached en utilisant la ligne de commande suivante :

/etc/init.d/memcached start

# Vérifier que Memcache fonctionne bien.php -r "phpinfo();" | grep memcache

# Vous devriez avoir quelque chose comme ça :memcachememcache support => enabledmemcache.allow_failover => 1 => 1memcache.chunk_size => 8192 => 8192memcache.default_port => 11211 => 11211memcache.default_timeout_ms => 1000 => 1000memcache.hash_function => crc32 => crc32memcache.hash_strategy => standard => standardmemcache.max_failover_attempts => 20 => 20Registered save handlers => files user sqlite memcache

# Autre test pour vérifier que memcache fonctionne bien :#Créer un fichier test-memcache.php avec le contenu suivant mettez-le dans /var/www et afficher le dans votre navigateur :

<?php// nouvelle objet Memcache$objMem = new Memcache;$objMem->connect('localhost', 11211) or die ('Connexion impossible!');

// retour la version du serveur Memcached$strVersion = $objMem->getVersion();echo 'Version du serveur: '.$strVersion.'';echo "<br />";

$arrValue = array('val_str' => 'ma variable', 'val_int' =>587439);

$objMem->set('montableau', $arrValue, false, 60) or die ('Impossible de sauvegarder les données');echo 'Stockage des donnees dans le cache (expire dans 60 seconds)';echo "<br />";

$arrResult = $objMem->get('montableau');echo 'Donnees venant du cache:';echo "<br />";

// affichage de la variablevar_dump($arrResult);?>

17

Page 19: Cahier Des Charges

M1 CERI Cahier des charges 2010-2011

18