J'utilise debian jessie sur mon serveur et j'ai récemment mis à niveau vers un nouveau serveur web nginx avec prise en charge http/2 (nginx 1.10). Comme aujourd'hui, cela fonctionne très bien et le serveur Web fournit du contenu avec le protocole http2.
J'ai lu que Chrome supprime le support NPN et n'autorise ALPN qu'après le 15.5.2016. ALPN est une extension qui requiert openssl 1.0.2 installé, mais sur debian jessie est uniquement openssl 1.0.1 (également sur les backports debian et autres référentiels, il n'y a pas de version openssl 1.0.2 pour ce debian).
Et il y a le problème - j'ai mis à niveau de SPDY vers http2 et dans quelques jours, je devrai désactiver http2 et ne pourra pas utiliser SPDY car cette version de nignx n'a que http2. J'ai également lu que cette version de debian restera avec openssl 1.0.1 et que seul debian stretch aura openssl 1.0.2. Mais pour la date de sortie, il y a presque un an et chrome abandonnera bientôt le support, donc je ne veux pas perdre l'avantage du protocole http2.
Existe-t-il une solution, comment installer openssl 1.0.2 sur ce système, sans construire sa propre build (mauvaise maintenance) ou attendre que le dépôt backports l'ait? Je ne veux pas non plus que deux versions de openssl soient installées sur mon système si l'une d'elles doit être liée et maintenue manuellement.
Merci pour toute aide.
Mise à jour 2016/08/08: nginx
dans jessie-backports
(version 1.9.10-1~bpo8+3
a été construit contre openssl >= 1.0.2~
. Pour que ALPN
fonctionne maintenant si vous exécutez jessie
, les packages de jessie-backports
, plus besoin de retirer les paquets de stretch
.
-
Réponse originale: Eh bien, voici ma réponse, selon les commentaires: À mon avis, il n'y a pas beaucoup de façons de résoudre ce problème à partir d'aujourd'hui , 2016/05/09. Fondamentalement, vous devez essayer en quelque sorte pour obtenir un nginx
moderne dans votre système, compilé avec >= openssl 1.0.2~
.
Les deux seules options que je vois actuellement: soit vous compilez vous-même, ce que vous ne voulez pas faire, ce qui est tout à fait compréhensible, soit vous extrayez des packages modernes à partir de Debian stretch
dans votre système. Cela implique certains risques, car vous mélangez un environnement stable avec un autre, mais à mon avis, ces risques sont assez faibles, parce que vous utilisez Debian
.
Alors, allons-y et essayons ceci:
Ajouter le Debian stretch
référentiel dans votre apt sources
. N'utilisez pas /etc/apt/sources.list
pour cela, mais utilisez plutôt un fichier dédié dans /etc/apt/sources.list.d/
pour le garder propre, personnellement j'utilise stretch.list
.
Mettez ces lignes à l'intérieur:
deb http://httpredir.debian.org/debian/ stretch main contrib non-free
deb-src http://httpredir.debian.org/debian/ stretch main contrib non-free
deb http://security.debian.org/ stretch/updates main contrib non-free
deb-src http://security.debian.org/ stretch/updates main contrib non-free
# stretch-updates, previously known as 'volatile'
deb http://httpredir.debian.org/debian/ stretch-updates main contrib non-free
deb-src http://httpredir.debian.org/debian/ stretch-updates main contrib non-free
Configurez apt pinning pour vous assurer de ne retirer que les packages de Debian stretch
que vous spécifiez. Le fichier à utiliser est /etc/apt/preferences
, à l'intérieur, mettez:
Package: *
Pin: release n=jessie
Pin-Priority: 900
Package: *
Pin: release a=jessie-backports
Pin-Priority: 500
Package: *
Pin: release n=stretch
Pin-Priority: 100
(Vous devrez peut-être modifier les suites et les priorités en fonction de votre environnement.)
Courir apt-get update
(via Sudo
/as root
) pour mettre à jour le cache du package.
Installez nginx
à partir de Debian stretch
: apt-get install -t stretch nginx
(faites cela via Sudo
/comme root
). Profit!
Comme je l'ai décrit dans mes commentaires, pour réduire encore les risques impliqués, vous pouvez utiliser quelque chose comme un chroot ou une solution de conteneur comme LXC . Dans le cas où vous souhaitez suivre la voie chroot
, vous devez mettre en place une interface réseau à l'intérieur: Pour ce faire, jetez un œil sur ce blogpost par exemple , qui donne une introduction à network namespaces
.
J'espère que cela t'aides; au cas où vous auriez plus de questions, n'hésitez pas à me contacter. J'apprécierais les commentaires et je suis intéressé par la façon dont cela se passe.
Une autre méthode consiste à installer OpenSSL 1.0.2 à partir de jessie-backports et à utiliser les versions Ubuntu 16.04 LTS à partir de le propre référentiel de nginx. De cette façon, vous utilisez au moins un package OpenSSL conçu pour Jessie.
Ajouter à /etc/apt/sources.list
:
# jessie-backports, from stretch-level but with no dependencies
deb http://httpredir.debian.org/debian/ jessie-backports main contrib non-free
deb-src http://httpredir.debian.org/debian/ jessie-backports main contrib non-free
# Nginx repository - use Ubuntu 16.04 LTS Xenial to get packages compiled with OpenSSL 1.0.2
deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ xenial nginx
Exécutez ensuite:
apt-get update
apt-get install -t jessie-backports openssl
apt-get install nginx
Cela vous place évidemment dans une configuration officiellement non prise en charge, mais c'est peut-être mieux que de ne pas avoir de paquet du tout - et cela a fonctionné pour moi. De plus, l'utilisation du repo de nginx signifie que vous obtenez de nouvelles mises à jour.
Une autre solution consiste à utiliser BoringSSL à la place, ce qui ne nuit pas à l'environnement OpenSSL. Voici les détails auxquels se référer, https://www.admon.org/hardwares/enable-http2-support-for-nginx-on-debian-jessie
Pour moi, le moyen le plus simple de résoudre ce problème était d'utiliser une autre image Nginx Docker, voir version officielle de Nginx sur Docker Hub . La version Docker Nginx par défaut utilise Debian Jessie, ce qui ne résoudra pas votre problème, mais ils offrent également une version alternative basée sur Alpine Linux . Ses dernières versions utilisent OpenSSL 1.0.2!
Cette solution suppose donc que vous Docker installé et que vous exécutez Nginx sur Alpine Linux
au lieu de Debian Jessie
.
Pour démarrer votre conteneur Nginx:
Sudo docker run --name nginx-container -p 80:80 -p 443:443 -v /path/to/your/nginx/directory/:/etc/nginx/ /path/to/your/files/to/serve/:/usr/share/nginx/html/ -d nginx:1.11-Alpine
Brève explication pour démarrer avec Docker:
docker run
: télécharge l'image Docker (dans ce cas nginx:1.11-Alpine
) si vous ne l'avez pas encore et démarre un conteneur Docker basé sur cette image--name nginx-container
: donne un nom au conteneur Docker (vous pouvez afficher tous les conteneurs Docker en cours d'exécution à l'aide de Sudo docker ps
Ou utiliser Sudo docker ps -a
pour afficher également les conteneurs arrêtés)-p 80:80 -p 443:443
: lie les ports 80 et 443 de votre machine hôte aux ports 80 et 443 respectivement dans le conteneur Docker-v /path/to/your/nginx/directory/:/etc/nginx/
: monte le répertoire sur votre système hôte qui contient votre configuration Nginx dans le /etc/nginx/
répertoire dans le conteneur Docker/path/to/your/files/to/serve/:/usr/share/nginx/html/
: monte un répertoire sur votre système hôte qui contient les fichiers que Nginx doit servir-d
: démarre le conteneur en arrière-plan (vous pouvez arrêter le conteneur à l'aide de docker stop nginx-container
)nginx:1.11-Alpine
: utilisez cette image pour démarrer votre conteneur à partir de (les les images officielles de Nginx Docker sont listées ici )Aussi utile:
Sudo docker exec nginx-container <command>
pour exécuter une commande dans le conteneur, par exemple Sudo docker exec nginx-container nginx -s reload
pour recharger Nginx après avoir modifié les fichiers de configuration sur le système hôteSudo docker exec -it nginx-container bash
pour entrer un shell bash dans le conteneur afin que vous puissiez y travailler directement (non recommandé, mais parfois utile)Une autre méthode consiste à utiliser jessie-backports puis à reconstruire facilement nginx
ajouter à /etc/apt/sources.list backports
deb http://ftp.debian.org/debian jessie-backports main
puis exécutez en tant que root
apt-get update
apt-get install -t jessie-backports openssl
puis reconstruisez nginx. Suivez les instructions sur https://wiki.debian.org/BuildingAPackage
Dans ma situation, j'ai utilisé le référentiel apt Dotdeb. Les instructions de ce site Web donne une option pour ajouter un référentiel qui vous permet d'installer Nginx avec un support HTTP2 "complet". La version actuelle est 1.14, ce qui est un mineur derrière la dernière version, vous ne serez donc pas trop loin (le backport actuel est 1.10).