LEMP - Linux nginx MySQL PHP

vps, linux, lemp

Installation d’une stack LEMP sur Debian Jessie.

LEMP pour Linux Nginx MySQL PHP, est une stack server/proxy web puissante et économe en ressource. Notamment avec Nginx qui a pour particularité d’avoir une charge et une consommation mémoire particulièrement faibles. Nginx est devenu très populaire que se soit pour les site static ou dynamiques. Quelque exemples de compagnies utilisant Nginx, Facebook, Airbnb, Google, Apple, Intel, eBay, PayPal, Nike et énormement d’autre. Sa configuration est souple et assez facile à prendre en main pour un développeur par son aspect modulaire.

Environnement d’installation

Avant d’installer quoi que ce soit on va prendre soins de préciser à apt d’installer vraiment que ce que l’on n’a décidé et de ne plus accepter par défaut l’installation de paquets mis en recommandations ou en suggestions.

cette commande comme la plupart sur ce post sont a rentrer dans un terminal avec l’utilisateur root

cat >/etc/apt/apt.conf.d/60recommends <<EOF
APT::Install-Recommends "0";
APT::Install-Suggests "0";
EOF

Pour installer PHP7 on dois passer par le dépôt DotDeb qui fourni des packets plus récentes

nano /etc/apt/sources.list

## DOTDEB
deb http://dotdeb.thefox.com.fr jessie all
deb-src http://dotdeb.thefox.com.fr jessie all

ou lancer les commandes

echo "deb http://packages.dotdeb.org jessie all" > /etc/apt/sources.list.d/dotdeb.list
wget -O- https://www.dotdeb.org/dotdeb.gpg | apt-key add -
apt-get update && apt-get upgrade && apt-get clean

Passons maintenant à l’Installation de la stack LEMP.

Installation de PHP/Mysql

apt-get install mysql-server mysql-client php7.0 php7.0-common php7.0-gd php7.0-mysql php7.0-imap php7.0-cli php7.0-curl php7.0-mcrypt php7.0-imagick php7.0-sqlite3 php7.0-fpm php7.0-memcached php7.0-xmlrpc php7.0-geoip php7.0-intl php7.0-mbstring php7.0-zip php7.0-xml php7.0-json php7.0-soap

Définissez votre mot de passe root pour le server Mysql, puis se connecter à Mysql afin de poursuivre la configuration manuellement.

Configuration de MySQL

mysql -u root -p
--lister tous les utilisateurs Mysql avec leur host
SELECT user,host from mysql.user;
--lister les privileges des utilisateurs
SHOW grants for 'user'@'%';
--effacer les utilisateurs/host obsolètes
DROP USER "user"@"host";
--effacer l'utilisateur anonymous de MySQL
DELETE FROM mysql.user WHERE User='';
FLUSH PRIVILEGES;
--effacer la table test
DROP DATABASE test;
--renommer l'utilisateur root
RENAME USER root TO new_super_user;
--rendre root accessible qu en local
GRANT ALL PRIVILEGES ON *.* TO "new_super_user"@'localhost' IDENTIFIED BY 'db_passwd' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO "new_super_user"@'127.0.0.1' IDENTIFIED BY 'db_passwd' WITH GRANT OPTION;
FLUSH PRIVILEGES;
--crée un utilisateur avec des droit SU par projet ici Dolibarr
--on peut placer un code numerique sur le nom de la base
CREATE DATABASE dolibarr547;
GRANT ALL ON dolibarr547.* TO "utilisateur_dolibar"@"%.example.com" IDENTIFIED by 'user_password';
FLUSH PRIVILEGES;
--sortir de MySQL
quit

configuration terminer, il ne reste plus qu’à redémarrer le service

systemctl restart mysqld.service

Configuration de PHP7

php -v
# verifier la version de php installer

sauvegarder la config d’origine

mkdir –p /etc/php/7.0/fpm/backup && cp /etc/php/7.0/fpm/php.ini /etc/php/7.0/fpm/backup/php.ini

modifier la configuration qui se trouve dans le fichier php.ini avec sed ou nano

sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 64M/g' /etc/php/7.0/fpm/php.ini
sed -i 's/;date.timezone = /date.timezone = Europe/Paris/g' /etc/php/7.0/fpm/php.ini
sed -i 's/post_max_size = 8M/post_max_size = 64M/g' /etc/php/7.0/fpm/php.ini
sed -i 's/memory_limit = 64M/memory_limit = 512M/g' /etc/php/7.0/fpm/php.ini
sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo = 0/g' /etc/php/7.0/fpm/php.ini
sed -i 's/listen = /run/php/php7.0-fpm.sock/listen = 127.0.0.1:9000/g' /etc/php/7.0/fpm/pool.d/www.conf

nano /etc/php/7.0/fpm/php.ini

L’installation et la configuration est terminer il faut redémarrer php

systemctl restart php7.0-fpm.service

Installer Nginx

apt-get install nginx nginx-common nginx-core openssl libssl1.0.2 libssl1.0.1 libssl-dev

verifier le status de nginx

service nginx status
#*nginx is running

netstat -tupln
#Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
#tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      4017/nginx -g daemo
#tcp6       0      0 :::80                   :::*                    LISTEN      4017/nginx -g daemo

Nginx sert une page sur le port 80, affichons son code source avec curl

curl localhost

cette page provient du répertoire

/usr/share/nginx/html/index.debian.html

Configurer Nginx

Nginx peut se configurer en cascade, le niveau global avec nginx.conf, le vhost avec les conf de sites-available et au niveau location dans les fichiers de configurations.

sauvegarder la config d’origine

mkdir –p /etc/nginx/backup && cp /etc/nginx/nginx.conf /etc/nginx/backup/nginx.conf

modifier la configuration global de Nginx

nano /etc/nginx/nginx.conf

user www-data;
worker_processes auto;	#ou inscrire le chiffre que renvoie grep processor /proc/cpuinfo | wc -l
worker_rlimit_nofile 20000;	#possible modification à la volé sans redémarrer nginx nginx -s reload
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 65536;	#inscrire le chiffre que renvoie ulimit -n
}

http {
        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        # LOG SETTINGS
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';

        access_log /var/log/nginx/access.log main;
        error_log /var/log/nginx/error.log;

        # BASIC SETTINGS
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 35;
        keepalive_disable msie6;
        keepalive_requests 100;
        server_tokens off;
        server_names_hash_bucket_size 64;
        types_hash_max_size 2048;
        charset_types
          text/css
          text/plain
          text/vnd.wap.wml
          application/javascript
          application/json
          application/rss+xml
          application/xml;

        # SSL SETTINGS
        include /etc/nginx/snippets/ssl-config.conf;	#block déporter

        # RESOLVER SETTINGS
        include /etc/nginx/snippets/resolver-config.conf;	#block déporter

        # GZIP SETTINGS
        include /etc/nginx/snippets/gzip-config.conf;	#block déporter

        # VIRTUAL HOST CONFIGS
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

SSL SETTINGS

Le block ssl-config.conf peut être commenté. Ce block contient un lien vers notre certificat Diffie-Hellman de 4096 bits pour chiffrer les échanges de clés, ainsi que toute notre configuration SSL.

voire le fichier sur github

mkdir -p /etc/nginx/ssl
openssl dhparam -out /etc/nginx/ssl/dhparam4096.pem 4096

nano /etc/nginx/snippets/ssl-config.conf
## ou copier le depuis github
cd /etc/nginx/snippets && { curl -O https://raw.githubusercontent.com/RobyRemzy/LinuxFiles/master/etc/nginx/snippets/ssl-config.conf ; cd -; }

RESOLVER SETTINGS

voire le fichier sur github

nano /etc/nginx/snippets/resolver-config.conf
## ou copier le depuis github
cd /etc/nginx/snippets && { curl -O https://raw.githubusercontent.com/RobyRemzy/LinuxFiles/master/etc/nginx/snippets/resolver-config.conf ; cd -; }

GZIP SETTINGS

Le block gzip-config.conf peut être commenté. Ce block contient toute notre configuration Gzip, on veille juste à compresser tous les fichiers de plus de 256Ko avec gzip_min_length 256 et on utilise gzip_comp_level 5 qui possède un très bon rapport sur la plupart des configuration.

voire le fichier sur github

nano /etc/nginx/snippets/gzip-config.conf
## ou copier le depuis github
cd /etc/nginx/snippets && { curl -O https://raw.githubusercontent.com/RobyRemzy/LinuxFiles/master/etc/nginx/snippets/gzip-config.conf ; cd -; }

Ajouter un block serveur

L’équivalent du VirtualHost sous Apache

mkdir –p /etc/nginx/sites-available/backup && cp /etc/nginx/sites-available/default /etc/nginx/sites-available/backup/default
#
nano /etc/nginx/sites-available/default

Notre configuration par défaut sera très basic, pour un futur enrichissement plus approprier.

server {
    listen 80 default_server;

    # LETSENCRYPT SETTINGS
    #include snippets/letsencrypt.conf;

    #listen 443 ssl default_server;
    #listen [::]:443 ssl default_server;
    #ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem;
    #ssl_certificate_key /etc/letsencrypt/live/domain.tld/privkey.pem;

    #include snippets/cors-config.conf

    root /usr/share/nginx/html/domain.tld;
    index index.html index.html; #index.php

    #server_name _;
    server_name domain.tld;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        #include snippets/fastcgi-php.conf;
    }

    location ~ /(\.ht|\.git|\.svn|some|folders|here) {
        #allow 127.0.0.1;
        #allow your.dev.ip;
        #allow localhost;
        deny  all;
    }
}

LETSENCRYPT SETTINGS
voire le fichier sur github

nano /etc/nginx/snippets/letsencrypt-config.conf
## ou copier le depuis github
cd /etc/nginx/snippets && { curl -O https://raw.githubusercontent.com/RobyRemzy/LinuxFiles/master/etc/nginx/snippets/letsencrypt-config.conf ; cd -; }

sudo mkdir -p /var/www/letsencrypt/.well-known/acme-challenge

CORS SETTINGS
voire le fichier sur github

## ou copier le depuis github
cd /etc/nginx/snippets && { curl -O https://raw.githubusercontent.com/RobyRemzy/LinuxFiles/master/etc/nginx/snippets/cors-config.conf ; cd -; }

FASTCGI SETTINGS
voire le fichier sur github

## ou copier le depuis github
cd /etc/nginx/snippets && { curl -O https://raw.githubusercontent.com/RobyRemzy/LinuxFiles/master/etc/nginx/snippets/fastcgi-php.conf ; cd -; }

Activation

La configuration du block serveur peut varier vu qu’nginx est modulaire. La config ne sera pas la même pour un site statique ou en php. Une fois configurer on peut valide la configuration du site et faire un lien symbolique vers le dossier actif.

ln -s /etc/nginx/sites-available/domain.tld /etc/nginx/sites-enabled/

et envoyer le dossier contenant notre site vers le dossier actif.

ln -s /var/www/html/domain.tld /usr/share/nginx/html/

vérifier la configuration d’nginx

nginx -t
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful

Tant que la configuration n’a pas une syntaxe et un test ok, il faut rechercher les erreurs possible et les fixés avant de relancer nginx avec la commande

service nginx restart

Lorsque vous vous rendez sur votre site , vous pouvez consulter les log.
exemple avec tail, qui vous donnera l’état live des requêtes.

tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log

Bonne configuration!

Share
48.844965; 2.4358856
vps, linux, lemp

© 2017 Jekyll hack mostly crafted on my couch while having a nice cup of tea