GNU/Linux >> Tutoriels Linux >  >> Cent OS

Installation de Nginx avec PHP5 (et PHP-FPM) et prise en charge de MySQL sur CentOS 6.4

Nginx (prononcez "engine x") est un serveur HTTP gratuit, open-source et hautes performances. Nginx est connu pour sa stabilité, son riche ensemble de fonctionnalités, sa configuration simple et sa faible consommation de ressources. Ce tutoriel montre comment vous pouvez installer Nginx sur un serveur CentOS 6.4 avec prise en charge PHP5 (via PHP-FPM) et MySQL.

Je n'émets aucune garantie que cela fonctionnera pour vous !

1 Remarque préliminaire

Dans ce tutoriel, j'utilise le nom d'hôte server1.example.com avec l'adresse IP 192.168.0.100. Ces paramètres peuvent différer pour vous, vous devez donc les remplacer le cas échéant.

2 Activer des dépôts supplémentaires

php-fpm n'est pas disponible depuis les dépôts officiels CentOS, mais depuis le dépôt Remi RPM qui lui-même dépend du dépôt EPEL; nous pouvons activer les deux référentiels comme suit :

rpm --import https://fedoraproject.org/static/0608B895.txt 
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
yum install yum-priorities

Modifier /etc/yum.repos.d/epel.repo...

vi /etc/yum.repos.d/epel.repo

... et ajoutez la ligne priority=10 à la section [epel] :

[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
[...]

Ensuite, faites de même pour la section [remi] dans /etc/yum.repos.d/remi.repo, plus le changement activé à 1 :

vi /etc/yum.repos.d/remi.repo
[remi]
name=Les RPM de remi pour Enterprise Linux $releasever - $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/$releasever/remi/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/remi/mirror
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
failovermethod=priority

[remi-test]
name=Les RPM de remi en test pour Enterprise Linux $releasever - $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/$releasever/test/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/test/mirror
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

3 Installer MySQL 5

Nous installons d'abord MySQL 5 comme ceci :

yum install mysql mysql-server

Ensuite, nous créons les liens de démarrage du système pour MySQL (afin que MySQL démarre automatiquement à chaque démarrage du système) et démarrons le serveur MySQL :

chkconfig --levels 235 mysqld on
/etc/init.d/mysqld start

Vérifiez maintenant que la mise en réseau est activée. Exécuter

netstat -tap | grep mysql

Il devrait afficher quelque chose comme ceci :

[[email protected] ~]# netstat -tap | grep mysql
tcp        0      0 *:mysql                     *:*                         LISTEN      1799/mysqld
[[email protected] ~]#

Si ce n'est pas le cas, modifiez /etc/my.cnf et commentez l'option skip-networking :

vi /etc/my.cnf
[...]
#skip-networking
[...]

et redémarrez votre serveur MySQL :

/etc/init.d/mysqld restart

Exécuter

mysql_secure_installation

pour définir un mot de passe pour l'utilisateur root (sinon n'importe qui peut accéder à votre base de données MySQL !) :

[[email protected] ~]# mysql_secure_installation




REMARQUE : L'EXÉCUTION DE TOUTES LES PARTIES DE CE SCRIPT EST RECOMMANDÉE POUR TOUS MySQL
      SERVEURS EN PRODUCTION ! VEUILLEZ LIRE ATTENTIVEMENT CHAQUE ÉTAPE !


Afin de se connecter à MySQL pour le sécuriser, nous aurons besoin du mot de passe
actuel pour l'utilisateur root. Si vous venez d'installer MySQL, et
vous n'avez pas défini le mot de passe root encore , le mot de passe sera vide,
vous devez donc juste appuyer sur entrée ici.

Entrez mot de passe actuel pour root (entrez pour aucun) : <-- ENTER
 OK, mot de passe utilisé avec succès , continuons ...

La définition du mot de passe root assure que personne ne peut se connecter à MySQL
utilisateur root sans l'autorisation appropriée.

Définir le mot de passe root ? [O/n] <-- ENTRER
Nouveau mot de passe : <-- votremotdepasseqlracine
Saisissez à nouveau le nouveau mot de passe : <-- votremotdepasseqlracine
Le mot de passe a été mis à jour avec succès !
Rechargement des tables de privilèges. .
 ... Succès !


Par défaut, une installation de MySQL a un utilisateur anonyme, permettant à n'importe qui
de se connecter à MySQL sans avoir avoir un compte d'utilisateur créé pour
eux. Ceci est un conçu uniquement pour les tests, et pour rendre l'installation 
un peu plus fluide. Vous devriez les supprimer avant de passer dans un 
environnement de production.

Supprimer les utilisateurs anonymes ? [O/n] <-- ENTER
 ... Succès !

Normalement, root ne devrait être autorisé à se connecter depuis 'localhost'. Cela
assure que quelqu'un ne ne peut pas deviner le mot de passe root depuis le réseau.

Interdire la connexion root à distance ? [O/n] <-- ENTER
 ... Succès !

Par défaut, MySQL est fourni avec une base de données nommée 'test' à laquelle n'importe qui peut
accéder. Cela est également conçu uniquement pour les tests et devrait être supprimé 
avant de passer dans un environnement de production .

Supprimer la base de données de test et y accéder ? [O/n] <-- ENTER
 - Suppression de la base de données de test...
 ... Réussite !
  - Suppression des privilèges sur la base de données de test...
 ... Réussite !

Recharger les tableaux de privilèges garantira que tout les changements apportés jusqu'à présent 
prendront effet immédiatement.

Recharger les tableaux de privilèges maintenant ? [O/n] <-- ENTER
 ... Réussi !

Nettoyage ...



Tout fait ! Si vous avez complété toutes les étapes ci-dessus, votre installation de MySQL
devrait maintenant être sécurisée.

Merci d'utiliser MySQL !


[[ e-mail protégé] ~]#

4 Installer Nginx

Nginx est disponible sous forme de package pour CentOS 6.4 (de EPEL) que nous pouvons installer comme suit :

yum install nginx

Ensuite, nous créons les liens de démarrage du système pour nginx et le démarrons :

chkconfig --levels 235 nginx on
/etc/init.d/nginx start

Tapez l'adresse IP ou le nom d'hôte de votre serveur Web dans un navigateur (par exemple, http://192.168.0.100), et vous devriez voir la page d'accueil de nginx :

5 Installer PHP5

Nous pouvons faire fonctionner PHP5 dans nginx via PHP-FPM (PHP-FPM (FastCGI Process Manager) est une implémentation alternative de PHP FastCGI avec quelques fonctionnalités supplémentaires utiles pour les sites de toute taille, en particulier les sites les plus fréquentés). Nous pouvons installer php-fpm avec php-cli et certains modules PHP5 comme php-mysql dont vous avez besoin si vous souhaitez utiliser MySQL à partir de vos scripts PHP comme suit :

yum install php-fpm php-cli php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-magickwand php-magpierss php-mbstring php-mcrypt php-mssql php-shout php-snmp php-soap php-tidy

APC est un cache d'opcode PHP gratuit et ouvert pour la mise en cache et l'optimisation du code intermédiaire PHP. Il est similaire à d'autres cacheurs d'opcodes PHP, tels que eAccelerator et Xcache. Il est fortement recommandé d'en installer un pour accélérer votre page PHP.

APC peut être installé comme suit :

yum install php-pecl-apc

Ouvrez ensuite /etc/php.ini et définissez cgi.fix_pathinfo=0 :

vi /etc/php.ini
[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...]

(Veuillez lire http://wiki.nginx.org/Pitfalls pour savoir pourquoi vous devriez faire cela.)

En plus de cela, afin d'éviter des erreurs telles que

[08-Aug-2011 18:07:08] PHP Warning: phpinfo(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Berlin' for 'CEST/2.0/DST' instead in /usr/share/nginx/html/info.php on line 2

... dans /var/log/php-fpm/www-error.log lorsque vous appelez un script PHP dans votre navigateur, vous devez définir date.timezone dans /etc/php.ini :

[...]
[Date]
; Defines the default timezone used by the date functions
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = "Europe/Berlin"
[...]

Vous pouvez trouver le fuseau horaire correct pour votre système en exécutant :

cat /etc/sysconfig/clock
[[email protected] nginx]# cat /etc/sysconfig/clock
ZONE="Europe/Berlin"
[[email protected] nginx]#

Créez ensuite les liens de démarrage du système pour php-fpm et démarrez-le :

chkconfig --levels 235 php-fpm on
/etc/init.d/php-fpm start

PHP-FPM est un processus démon (avec le script d'initialisation /etc/init.d/php-fpm) qui exécute un serveur FastCGI sur le port 9000.

6 Configuration de nginx

La configuration nginx se trouve dans /etc/nginx/nginx.conf que nous ouvrons maintenant :

vi /etc/nginx/nginx.conf

La configuration est facile à comprendre (vous pouvez en savoir plus ici :http://wiki.codemongers.com/NginxFullExample et ici :http://wiki.codemongers.com/NginxFullExample2)

Tout d'abord (ceci est facultatif), vous pouvez augmenter le nombre de processus de travail et définir le keepalive_timeout sur une valeur raisonnable :

[...]
worker_processes  4;
[...]
    keepalive_timeout  2;
[...]

Les hôtes virtuels sont définis dans les conteneurs du serveur {} dans le répertoire /etc/nginx/conf.d. Modifions le vhost par défaut (dans /etc/nginx/conf.d/default.conf) comme suit :

vi /etc/nginx/conf.d/default.conf
[...]
server {
    listen       80;
    server_name  _;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.php index.html index.htm;
    }

    error_page  404              /404.html;
    location = /404.html {
        root   /usr/share/nginx/html;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        root           /usr/share/nginx/html;
        try_files $uri =404;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    location ~ /\.ht {
        deny  all;
    }
}

nom du serveur _; en fait un vhost fourre-tout par défaut (bien sûr, vous pouvez également spécifier un nom d'hôte ici comme www.example.com).

Dans l'emplacement/partie, j'ai ajouté index.php à la ligne d'index. racine /usr/share/nginx/html ; signifie que la racine du document est le répertoire /usr/share/nginx/html.

La partie importante pour PHP est la strophe location ~ \.php$ {}. Décommentez-le pour l'activer. Remplacez la ligne racine par la racine du document du site Web (par exemple, root /usr/share/nginx/html;). Veuillez noter que j'ai ajouté la ligne try_files $uri =404; pour empêcher les exploits zero-day (voir http://wiki.nginx.org/Pitfalls#Passing_Uncontrolled_Requests_to_PHP et http://forum.nginx.org/read.php?2,88845,page=3). Assurez-vous de changer la ligne fastcgi_param en fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name ; car sinon l'interpréteur PHP ne trouvera pas le script PHP que vous appelez dans votre navigateur ($document_root se traduit par /usr/share/nginx/html car c'est ce que nous avons défini comme racine de notre document).

PHP-FPM écoute sur le port 9000 sur 127.0.0.1 par défaut, nous disons donc à nginx de se connecter à 127.0.0.1:9000 avec la ligne fastcgi_pass 127.0.0.1:9000;. Il est également possible de faire en sorte que PHP-FPM utilise un socket Unix - je le décrirai au chapitre 7.

Enregistrez maintenant le fichier et rechargez nginx :

/etc/init.d/nginx reload

Créez maintenant le fichier PHP suivant dans la racine du document /usr/share/nginx/html...

vi /usr/share/nginx/html/info.php
<?php
phpinfo();
?>

Maintenant, nous appelons ce fichier dans un navigateur (par exemple http://192.168.0.100/info.php) :

Comme vous le voyez, PHP5 fonctionne, et il fonctionne via FPM/FastCGI, comme indiqué dans la ligne API du serveur. Si vous faites défiler plus bas, vous verrez tous les modules déjà activés dans PHP5, y compris le module MySQL :

7 Faire en sorte que PHP-FPM utilise un socket Unix

Par défaut, PHP-FPM écoute sur le port 9000 sur 127.0.0.1. Il est également possible de faire en sorte que PHP-FPM utilise un socket Unix qui évite la surcharge TCP. Pour cela, ouvrez /etc/php-fpm.d/www.conf...

vi /etc/php-fpm.d/www.conf

... et faites en sorte que la ligne d'écoute ressemble à ceci :

[...]
;listen = 127.0.0.1:9000
listen = /tmp/php5-fpm.sock
[...]

Rechargez ensuite PHP-FPM :

/etc/init.d/php-fpm reload

Passez ensuite par votre configuration nginx et tous vos vhosts et changez la ligne fastcgi_pass 127.0.0.1:9000; à fastcgi_pass unix:/tmp/php5-fpm.sock;, par ex. comme ceci :

vi /etc/nginx/conf.d/default.conf
[...]
    location ~ \.php$ {
        root           /usr/share/nginx/html;
        try_files $uri =404;
        fastcgi_pass   unix:/tmp/php5-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
[...]

Enfin rechargez nginx :

/etc/init.d/nginx reload

  • nginx :http://nginx.org/
  • Wiki de nginx :http://wiki.nginx.org/
  • PHP :http://www.php.net/
  • PHP-FPM :http://php-fpm.org/
  • MySQL :http://www.mysql.com/
  • CentOS :http://www.centos.org/

À propos de l'auteur

Falko Timme est le propriétaire de Timme Hosting (hébergement web nginx ultra-rapide). Il est le mainteneur principal de HowtoForge (depuis 2005) et l'un des principaux développeurs d'ISPConfig (depuis 2000). Il a également contribué au livre O'Reilly "Linux System Administration".


Cent OS
  1. Comment installer Laravel 5.x avec Nginx et PHP-FPM 7.1 sur CentOS 7

  2. Installation de Nginx avec PHP5 (et PHP-FPM) et le support MySQL (LEMP) sur Ubuntu 14.04 LTS

  3. Installation de Lighttpd avec PHP5 (PHP-FPM) et prise en charge de MySQL sur Ubuntu 14.04LTS

  4. Installation d'Apache2 avec prise en charge de PHP5 et MySQL sur OpenSUSE 13.1 (LAMP)

  5. Installation de Lighttpd avec prise en charge de PHP5 et MySQL sur Ubuntu 10.04

Installation de Lighttpd avec PHP5 (PHP-FPM) et MySQL sur Debian 8 (Jessie)

Installation d'Apache2 avec prise en charge de PHP5 et MySQL sur CentOS 6.2 (LAMP)

Installation d'Apache2 avec prise en charge de PHP5 et MySQL sur CentOS 6.3 (LAMP)

Installation d'Apache2 avec prise en charge de PHP5 et MySQL sur CentOS 6.4 (LAMP)

Installation de Nginx avec PHP5 (et PHP-FPM) et prise en charge de MySQL sur Fedora 19

Installation d'Apache2 avec prise en charge de PHP5 et MySQL sur Fedora 20 (LAMP)