HTTP2 Nginx

Ubuntu – Activer HTTP/2 avec Nginx

Le support du protocole HTTP2 dans Nginx date de la version 1.9.5 (sortie en septembre 2015) or sur les versions d’Ubuntu antérieures à la 16.04, les versions de Nginx disponibles dans les paquets officiels sont plus anciennes. Nous allons voir dans cet article comment installer manuellement la dernière version de Nginx sur les versions 14.04, 15.04, 15.10 et 16.04 d’Ubuntu (non disponible pour les architectures ARM).

Nginx distingue deux types de versions : stable et mainline. Les paquets officiels d’Ubuntu contiennent uniquement des versions de la branche stable où seuls les bugs majeurs sont corrigés. Nginx recommande d’utiliser les versions de la branche mainline qui introduisent les nouvelles fonctionnalités et qui contiennent la totalité des bugs corrigés (mineurs et majeurs). Nous allons donc nous intéresser ici à la dernière version de la branche mainline.

1 – Mise à jour d’OpenSSL

Nginx doit être compilé avec OpenSSL 1.0.2 pour que le protocole HTTP/2 soit pris en compte par les navigateurs. Cependant, avec Ubuntu 14.04 et 15.04, la dernière version disponible d’OpenSSL est la 1.0.1f.

La version 1.0.2 inclut la spécification RFC7301 ou le support du protocole ALPN (Application-Layer Protocol Negotiation) qui est requis pour pouvoir accepter des négociations HTTP/2.
La version 1.0.1 ne permet d’utiliser que le protocole NPN (Next Protocol Negotiation) qui est maintenant déprécié.

  1. Installez tout d’abord l’outil GCC pour pouvoir compiler OpenSSL :

    sudo apt-get install gcc
  2. Téléchargez la dernière version d’OpenSSL :

    wget https://www.openssl.org/source/openssl-1.0.2g.tar.gz
  3. Récupérez la signature SHA1 du source afin de vérifier l’intégrité de l’archive :

    wget http://www.openssl.org/source/openssl-1.0.2g.tar.gz.sha1
  4. Comparez les deux signatures (celles-ci doivent être identiques) :

    sha1sum openssl-1.0.2g.tar.gz ; cat openssl-1.0.2g.tar.gz.sha1
  5. Décompressez l’archive téléchargée :

    tar -zxf openssl-1.0.2g.tar.gz
  6. Installez la dernière version d’OpenSSL :

    cd openssl-1.0.2g
    ./config --prefix=/usr/
    make
    sudo make install
  7. Vérifiez la version d’OpenSSL :

    openssl version

    La commande doit afficher sur la sortie standard :

    OpenSSL 1.0.2g  1 Mar 2016

2 – Installation de Nginx (branche mainline)

  • Si Nginx était installé sur votre système, il est nécessaire de supprimer le paquet nginx-common :

    sudo apt-get remove nginx-common
  • Créez le fichier /etc/apt/sources.list.d/nginx.list et ajoutez les lignes suivantes :

    deb http://nginx.org/packages/mainline/ubuntu/ trusty nginx
    deb-src http://nginx.org/packages/mainline/ubuntu/ trusty nginx
  • Ajoutez la clé d’authentification du paquet nginx :

    wget -q -O- http://nginx.org/keys/nginx_signing.key | sudo apt-key add -
  • Installez la dernière version de Nginx :

    sudo apt-get update
    sudo apt-get install nginx
  • Vérifiez la présence du module –with-http_v2_module en tapant la commande nginx -V :
    HTTP/2 Nginx

3 – Configuration de Nginx

Cette partie s’adresse à ceux qui possédaient une version stable déjà installée sur leur système. Pour les autres, rendez-vous au chapitre 4.

3.1 – Chargement des virtual hosts…

La configuration diffère quelque peu des versions de la branche stable et de la branche mainline. En effet, les configurations liées à Nginx des versions de la branche stable sont placées dans le dossier /etc/nginx/site-available et sont chargées dans le dossier /etc/nginx/site-enabled (liées par des liens symboliques). En revanche, les configurations liées à Nginx des versions de la branche mainline chargent uniquement les fichiers dont l’extension est .conf dans le dossier /etc/nginx/conf.d. Deux possibilités s’offrent à vous :

  1. la première consiste tout simplement à déplacer les configurations du dossier /etc/nginx/site-available vers le dossier /etc/nginx/conf.d et d’ajouter l’extension .conf à chacune de vos configurations
  2. la deuxième consiste à remplacer directement dans la configuration de Nginx l’emplacement où seront chargées les configurations de vos sites web (en partant du principe que vous gardez la mécanique des liens symboliques du dossier /etc/nginx/site-enabled pointant vers le dossier /etc/nginx/site-available) :

    user  nginx;
    worker_processes  1;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        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;
    
        sendfile        on;
        #tcp_nopush     on;
    
        keepalive_timeout  65;
    
        #gzip  on;
    
        #include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
    }

3.2 – Processus…

Les processus Nginx des versions de la branche mainline sont lancés sous l’utilisateur nginx. Cependant Ubuntu utilise l’utilisateur www-data dans les versions de la branche stable. Cette différence d’utilisateur peut engendrer des problèmes de permissions lors de l’accès à vos ressources web. Il peut être nécessaire de modifier l’utilisateur dans le fichier de configuration /etc/nginx/nginx.conf de Nginx :

#user  nginx;
user  www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


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

    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;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

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

Redémarrez Nginx :

sudo service restart nginx

4 – Configuration des Vhosts

  • Ajoutez la directive http2 dans le fichier de configuration de votre virtual host :

    server {
           listen                   80;
           listen                   [::]:80;
           return                   301 https://$host$request_uri;
    }
    
    server {
        listen                      443 ssl http2;
        listen                      [::]:443 ssl http2;
        server_name                 www.mondomaine.fr;
    
        root                        /usr/share/nginx/html;
        index                       index.html index.htm;
    
    ...
    
    }
  • Rechargez la configuration Nginx :

    sudo service reload nginx

1 – Installation de Nginx (branche mainline)

  • Si Nginx était installé sur votre système, il est nécessaire de supprimer le paquet nginx-common :

    sudo apt-get remove nginx-common
  • Créez le fichier /etc/apt/sources.list.d/nginx.list et ajoutez les lignes suivantes :

    deb http://nginx.org/packages/mainline/ubuntu/ wily nginx
    deb-src http://nginx.org/packages/mainline/ubuntu/ wily nginx
  • Ajoutez la clé d’authentification du paquet nginx :

    wget -q -O- http://nginx.org/keys/nginx_signing.key | sudo apt-key add -
  • Installez la dernière version de Nginx :

    sudo apt-get update
    sudo apt-get install nginx
  • Vérifiez la présence du module –with-http_v2_module en tapant la commande nginx -V :

    HTTP/2 Nginx

2 – Configuration de Nginx

Cette partie s’adresse à ceux qui possédaient une version stable déjà installée sur leur système. Pour les autres, rendez-vous au chapitre 3.

2.1 – Chargement des virtual hosts…

La configuration diffère quelque peu des versions de la branche stable et de la branche mainline. En effet, les configurations liées à Nginx des versions de la branche stable sont placées dans le dossier /etc/nginx/site-available et sont chargées dans le dossier /etc/nginx/site-enabled (liées par des liens symboliques). En revanche, les configurations liées à Nginx des versions de la branche mainline chargent uniquement les fichiers dont l’extension est .conf dans le dossier /etc/nginx/conf.d. Deux possibilités s’offrent à vous :

  1. la première consiste tout simplement à déplacer les configurations du dossier /etc/nginx/site-available vers le dossier /etc/nginx/conf.d et d’ajouter l’extension .conf à chacune de vos configurations
  2. la deuxième consiste à remplacer directement dans la configuration de Nginx l’emplacement où seront chargées les configurations de vos sites web (en partant du principe que vous gardez la mécanique des liens symboliques du dossier /etc/nginx/site-enabled pointant vers le dossier /etc/nginx/site-available) :

    user  nginx;
    worker_processes  1;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        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;
    
        sendfile        on;
        #tcp_nopush     on;
    
        keepalive_timeout  65;
    
        #gzip  on;
    
        #include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
    }

2.2 – Processus…

Les processus Nginx des versions de la branche mainline sont lancés sous l’utilisateur nginx. Cependant Ubuntu utilise l’utilisateur www-data dans les versions de la branche stable. Cette différence d’utilisateur peut engendrer des problèmes de permissions lors de l’accès à vos ressources web. Il peut être nécessaire de modifier l’utilisateur dans le fichier de configuration /etc/nginx/nginx.conf de Nginx :

#user  nginx;
user  www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


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

    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;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

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

Redémarrez Nginx :

sudo service restart nginx

3 – Configuration des Vhosts

  • Ajoutez la directive http2 dans le fichier de configuration de votre virtual host :

    server {
           listen                   80;
           listen                   [::]:80;
           return                   301 https://$host$request_uri;
    }
    
    server {
        listen                      443 ssl http2;
        listen                      [::]:443 ssl http2;
        server_name                 www.mondomaine.fr;
    
        root                        /usr/share/nginx/html;
        index                       index.html index.htm;
    
    ...
    
    }
  • Rechargez la configuration Nginx :

    sudo service reload nginx

Ubuntu 16.04 dispose de la version 1.9.11 de Nginx dans ses paquets officiels et celle-ci supporte le HTTP/2. Il est simplement nécessaire de l’activer dans votre virtual host.

  • Ajoutez la directive http2 dans le fichier de configuration de votre virtual host :

    server {
           listen                   80;
           listen                   [::]:80;
           return                   301 https://$host$request_uri;
    }
    
    server {
        listen                      443 ssl http2;
        listen                      [::]:443 ssl http2;
        server_name                 www.mondomaine.fr;
    
        root                        /usr/share/nginx/html;
        index                       index.html index.htm;
    
    ...
    
    }
  • Rechargez la configuration Nginx :

    sudo service reload nginx


0 réponses

Laisser un commentaire

Participez-vous à la discussion?
N'hésitez pas à contribuer!

Laisser un commentaire

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