Menu

Serveur web nginx, hhvm et http2

1 novembre 2016 - Internet, Linux, Optimiser
Serveur web nginx, hhvm et http2

 


I.   Présentation

 

Pour ce serveur web nous allons utiliser le couple nginx, hhvm et ajouter le support du http2. Tout ça sur la distribution Debian 8 jessie.

Nginx: Serveur web plus performant qu’Apache (accepte bien plus de requêtes par secondes).

HHVM: HipHop Virtual Machine de Facebook  est une machine virtuelle open source conçue pour exécuter des programmes écrits en PHP et en Hack (langage proche du PHP utilisé sur la quasi-totalité du site de Facebook).

Http2: nouvelle version du protocole http (sortie en 2015). Http2 permet la compression des headers des requêtes et des réponses. Cette optimisation permet de réduire la bande passante lorsque les headers (tels que des cookies) sont similaires. De plus le multiplexage des requêtes au serveur est utilisé, cela permet de faire passer de multiples informations via un seul tuyau de transmission.

 


II.   Ajout des sources

 

Commençons par ajouter les sources qui nous permettrons de télécharger les dernières version de nginx et hhvm.

 

HHVM:
Création du fichier contenant les sources de hhvm:

nano /etc/apt/sources.list.d/hhvm.list

 

Le remplir avec:

deb http://dl.hhvm.com/debian jessie main

 

Maintenant nous allons télécharger et charger la clé gpg:

cd /tmp/
wget http://dl.hhvm.com/conf/hhvm.gpg.key
apt-key add hhvm.gpg.key
rm hhvm.gpg.key

 

NGINX:

De même on créé le fichier des sources:

nano /etc/apt/sources.list.d/nginx.list

 

On met:

deb http://nginx.org/packages/mainline/debian/ jessie nginx
deb-src http://nginx.org/packages/mainline/debian/ jessie nginx

 

Puis on télécharge et on ajoute la clé gpg:

cd /tmp
wget http://nginx.org/keys/nginx_signing.key && apt-key add nginx_signing.key
rm nginx_signing.key

 


III.   Installation de Nginx

 

Pour l’installation comme d’habitude on effectue un listage des paquets présent dans les sources:

apt-get update

 

Puis on installe nginx:

apt-get install nginx

 

A l’heure ou j’écris ces lignes nginx est à la version 1.11.4-1. Il faut vérifier que la version est au dessus ou égale à la 1.9 pour bénéficier du support du http2.

 


IV.   Installation de HHVM

 

On fait de même pour HHVM.

Si vous avez bien suivi pas besoin de faire un apt-get update, on peut passer directement à l’installation:

apt-get install hhvm

 

Si vous avez une erreur spécifiant qu’il manque des dépendances, vérifier que le fichier suivant contient bien les bonnes sources pour debian:

nano /etc/apt/sources.list

 

deb http://security.debian.org/ jessie/updates main contrib non-free
deb-src http://security.debian.org/ jessie/updates main contrib non-free
deb http://ftp.debian.org/debian/ jessie-updates main contrib non-free
deb-src http://ftp.debian.org/debian/ jessie-updates main contrib non-free
deb http://ftp.debian.org/debian/ jessie main contrib non-free
deb-src http://ftp.debian.org/debian/ jessie main contrib non-free

 

On suit les recommandations de la part des devs de HHVM:

Pour lancer HHVM au boot:

update-rc.d hhvm defaults

 


V.   Configuration Nginx

 

On va vérifier que le serveur web nginx est opérationnel en se rendant tout simplement sur l’adresse ip dans le navigateur:

http://ip_du_serveur

La page d’accueil de nginx devrait s’afficher.
Actuellement le support php n’est pas configuré dans Nginx. C’est pourquoi nous allons créé un fichier de configuration pour notre nouveau site web:

 

On renomme tout d’abord le fichier par défaut:

cd /etc/nginx/conf.d/
mv default.conf default.conf.BAK

 

Puis on créé le notre:

nano test.config

 

Et nous mettons ceci dedans:

server {
listen 80 ;
root /usr/share/nginx/html/;
index index.php index.html index.htm;
access_log /var/log/nginx/test-access.log;
error_log /var/log/nginx/test-error.log;
server_name test;
include /etc/nginx/hhvm.conf;
location / {
try_files $uri $uri/ /index.php?$args;
}
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;# Compatibilité Navigateur ancien
#ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_protocols TLSv1.2;
# Compatibilité Navigateur ancien
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
ssl_prefer_server_ciphers on;# On active le SSL Stapling avec les DNS de Google
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=86400;
resolver_timeout 10;# Decocher si forcer le https mais pas de cache Varnish
add_header Strict-Transport-Security max-age=15768000;server_name test;access_log /var/log/nginx/test-ssl-access.log;
error_log /var/log/nginx/test-ssl-error.log;
root /usr/share/nginx/html/;
index index.php;
include /etc/nginx/hhvm.conf;
}

 

A noter que: return 301 https://$server_name$request_uri; ne fonctionnera pas en l’état si le serveur est en local la variable $server_name reprend le nom du serveur spéficié avec la directive server_name test;

En local vous pouvez mettre l’ip de votre serveur. par exemple: return 301 https://192.168.1.6$request_uri;

 

Nous ne vérifions pas tout de suite la configuration de nginx car elle sera en echec en effet il nous manque la génération des clés SSL, pour cela:

 

On créé le repertoire qui accueillera les clés:

mkdir /etc/nginx/ssl/
cd /etc/nginx/ssl/

 

Puis on les génèrent:

openssl genrsa -des3 -out secure.key 2048
openssl req -new -key secure.key -out server.csr
openssl rsa -in secure.key -out server.key
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
rm secure.key server.csr
openssl dhparam -out dhparam.pem 2048

 

On vérifie notre configuration Nginx:

nginx -t

qui nous reponds:

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

 

Nous pouvons redemarrer Nginx:

/etc/init.d/nginx restart

 

Nous allons créer un fichier de test pour vérifier que le php est fonctionnel:

nano /usr/share/nginx/html/test.php

 

Et nous mettons:

<?php
phpinfo();
?>

 

Nous allons sur notre navigateur:

http://ip_du_serveur/test.php

 

D’une part on vérifie que le serveur web est fonctionnel, d’autre part que la redirection vers le HTTPS l’est aussi et enfin la prise en compte du php

 


VI.   Configuration HHVM

 

Nous pouvons passer à la configuration de HHVM.

Dans le fichier suivant:

nano /etc/hhvm/php.ini

 

Nous mettons:

; php options
session.save_handler = files
session.save_path = /var/lib/hhvm/sessions
session.gc_maxlifetime = 1440
hhvm.php7.all = 1
; hhvm specific
hhvm.log.level = Warning
hhvm.log.always_log_unhandled_exceptions = true
hhvm.log.runtime_error_reporting_level = 8191
hhvm.mysql.typed_results = false
; Tuning avec 'hhvm.'
hhvm.enable_short_tags = false
hhvm.server.max_post_size = 8M
hhvm.server.upload.upload_max_file_size = 8M
hhvm.enable_zend_compat = true
;Tuning sans 'hhvm.'
mysqli.allow_persistent = Off
default_socket_timeout = 30
default_charset = « UTF-8 »
date.timezone = Europe/Paris

 

Il nous reste plus qu’à redémarrer HHVM:

/etc/init.d/hhvm restart

 

 


Étiquettes : , ,

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *