Debian jessie nginx z openssl 1.0.2, aby używać ALPN zamiast NPN

14

Używam Debiana Jessie na moim serwerze, a ostatnio zaktualizowałem go do nowego serwera WWW Nginx z obsługą http / 2 (Nginx 1.10). Na dzień dzisiejszy działa świetnie, a serwer WWW dostarcza treści za pomocą protokołu http2.

Czytałem, że Chrome upuszcza obsługę NPN i zezwala na ALPN dopiero po 15.5.2016. ALPN jest rozszerzeniem, które wymaga zainstalowanego openssl 1.0.2, ale na debianie jessie jest tylko openssl 1.0.1 (również na backportach debiana i innych repozytoriach, nie ma wersji openssl 1.0.2 dla tego debiana).

I jest problem - zaktualizowałem SPDY do http2 i za kilka dni będę musiał wyłączyć http2 i nie będę mógł używać SPDY, ponieważ ta wersja nignx ma tylko http2. Przeczytałem również, że ta wersja debiana utknie w openssl 1.0.1 i tylko debian stretch będzie miał openssl 1.0.2. Ale data premiery jest już prawie rok, a Chrome niedługo będzie obsługiwać, więc nie chcę tracić korzyści z protokołu http2.

Czy jest jakieś rozwiązanie, jak zainstalować openssl 1.0.2 w tym systemie, bez budowania własnej kompilacji (zła konserwacja) lub oczekiwania na repozytorium backports, aby je mieć? Nie chcę też dwóch wersji openssl w moim systemie, jeśli jedna z nich musi być połączona i obsługiwana ręcznie.

Dziękuję za wszelką pomoc.

Juraj Nemec
źródło
Możesz użyć apt pinningi użyć opensslz Debian stretch.
gf_
@gf_ Ryzyko uszkodzenia systemu jest bardzo wysokie. Wiele rzeczy zależy od OpenSSL.
Michael Hampton
@MichaelHampton Cóż, nie mogę ocenić poziomu ryzyka, wątpię, aby był bardzo wysoki. Idę z Kurtem Roeckxem, jednym z opiekunów, który próbował wejść 1.0.2w życie jessiewkrótce po zawieszeniu się (które wtedy zostało odrzucone): „Ta wersja powinna być kompatybilna z wersją 1.0.1. Nie oczekuję niczego przełamać przejście z wersji 1.0.1 na 1.0.2. ” (Byłbym bardziej świadomy libc6.)
gf_
@gf_ „Wprowadzenie” w tym kontekście wymagałoby ponownej kompilacji wszystkiego, co korzysta z OpenSSL. Nie dziwię się, że to zostało odrzucone; Debian lubi stare i stabilne. W kontekście Twojej sugestii oznacza to także pobranie każdego pakietu stretch korzystającego z OpenSSL, a to wiele rzeczy.
Michael Hampton
@MichaelHampton Jestem w pełni świadomy zasad Debiana i nie jestem też zaskoczony, że został on wtedy odrzucony (nie chciałem tego mówić ani wywoływać takiego wrażenia). Ale (być może moje sformułowanie było niepoprawne): Robi apt-get install -t stretch nginx(na wanilii Debian jessiez nginxzainstalowana) będzie ciągnąć w: nginx nginx-common nginx-full libnginx-mod-http-auth-pam libnginx-mod-http-geoip libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream libssl1.0.2. (To jest dziesięć paczek ..)
gf_

Odpowiedzi:

16

Aktualizacja 2016/08/08: nginx in jessie-backports(wersja 1.9.10-1~bpo8+3została zbudowana przeciwko openssl >= 1.0.2~. Rozpoczęcie ALPNpracy, jeśli uruchomienie jessiewymaga tylko wyłączenia pakietów jessie-backports, nie trzeba już ich wyciągać stretch.

-

Oryginalna odpowiedź: Cóż, oto moja odpowiedź, zgodnie z komentarzami: Moim zdaniem, nie ma zbyt wielu sposobów na rozwiązanie tego na dziś, 2016/05/09. Zasadniczo musisz spróbować w jakiś sposób wprowadzić nowoczesność nginxdo swojego systemu, w zestawieniu z >= openssl 1.0.2~.

Jedyne dwie opcje, które obecnie widzę: albo kompilujesz dla siebie, czego nie chcesz robić, co jest całkiem zrozumiałe, albo wyciągasz z systemu nowoczesne pakiety Debian stretch. Wiąże się to z pewnym ryzykiem, ponieważ mieszasz stabilne środowisko z innym, ale moim zdaniem ryzyko to jest dość niskie, ponieważ używasz Debian.

Więc chodźmy i wypróbujmy to:

  • Dodaj Debian stretchrepozytorium do swojego apt sources. Nie używaj /etc/apt/sources.listdo tego, ale zamiast tego użyj dedykowanego pliku, /etc/apt/sources.list.d/aby utrzymać go w czystości, osobiście używam stretch.list.

    Umieść tam te linie:

    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
    
  • Skonfiguruj apt pin, aby upewnić się, że pobierasz tylko pakiety, z Debian stretchktórych określasz. Plik, który ma być użyty do tego /etc/apt/preferences, znajduje się tam:

    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
    

    (Być może będziesz musiał zmienić pakiety i priorytety, aby dopasować je do swojego środowiska).

  • Uruchom apt-get update(przez sudo/ as root), aby zaktualizować pamięć podręczną pakietu.

  • Zainstaluj nginxz Debian stretch: apt-get install -t stretch nginx(zrób to za pomocą sudo/ as root). Zysk!

  • Jak opisałem w moich komentarzach, aby nawet zmniejszyć związane z tym ryzyko, możesz użyć czegoś takiego jak chroot lub rozwiązanie kontenerowe, takie jak LXC . Jeśli chcesz iść po chrootswojemu, musisz skonfigurować interfejs sieciowy wewnątrz: Aby to zrobić, spójrz na przykład na tego posta na blogu , który zawiera wprowadzenie network namespaces.

  • Mam nadzieję że to pomoże; jeśli masz więcej pytań, skontaktuj się ze mną. Byłbym wdzięczny za opinie i jestem zainteresowany tym, jak to idzie.

gf_
źródło
Zainstalowałem nginx dzisiaj według twojego opisu odpowiedzi i wszystko wydaje się działać świetnie! Jedyną rzeczą, którą musiałem zrobić, było usunięcie starej instalacji nginx, ponieważ miałem nginx 1.10 z repozytorium nginx i ta wersja nie jest kompatybilna z pakietem repozytoriów debian (ale zrobiłem to również, kiedy aktualizowałem z debian nginx do 1.10, więc nie było problemu). Dziękujemy za twój wysiłek i pomoc!
Juraj Nemec
@JurajNemec Świetnie! Wielkie dzięki za opinie! Czy sprawdziłeś ALPNjuż wsparcie?
gf_
Tak. Sprawdzono to za pomocą testu http2 i testu SSL Labs , oba stwierdzają, że istnieje obsługa ALPN. nginx -VDaje również informację, że wersja jest skompilowana z openssl 1.0.2+. Myślę więc, że działa poprawnie.
Juraj Nemec
@JurajNemec Świetnie, brzmi dobrze! Jeśli to możliwe, chciałbym uzyskać małą aktualizację po uruchomieniu tej konfiguracji przez jakiś czas, może cztery lub osiem tygodni. Dzięki!
gf_
@JurajNemec Wygląda na to, że Google dokonał zmiany i usunął NPN. Czy Twoja konfiguracja nadal działa zgodnie z oczekiwaniami?
gf_
11

Inną metodą jest instalacja OpenSSL 1.0.2 z jessie-backports i użycie kompilacji Ubuntu 16.04 LTS z własnego repozytorium nginx. W ten sposób korzystasz przynajmniej z pakietu OpenSSL zbudowanego dla Jessie.

Dodaj do /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

Następnie uruchomić:

apt-get update
apt-get install -t jessie-backports openssl
apt-get install nginx

To oczywiście wprowadza cię w oficjalnie nieobsługiwaną konfigurację, ale być może jest to lepsze niż brak pakietu - i zadziałało dla mnie. Ponadto korzystanie z repozytorium nginx oznacza, że ​​otrzymujesz nowe aktualizacje.

GreenReaper
źródło
Czy mógłbyś wyjaśnić / wyjaśnić, dlaczego ktoś wybrałby tę trasę? Jeśli chodzi o „Plus, użycie repozytorium nginx oznacza, że ​​otrzymujesz nowe aktualizacje.”: Dostajesz również „nowe aktualizacje”, używając opisanego powyżej sposobu.
gf_
Pakiety nginx są aktualizowane tego samego dnia co ich wydanie, ponieważ są częścią procesu wydania, a nie procesu wydania Debiana. Dołączyłem pakiety mainline, a nie pakiety stabilne, ale możesz uzyskać stabilność, usuwając / mainline z powyższych ścieżek. Który wolisz, zależy od ciebie.
GreenReaper,
Aby rozwinąć powyższe: stretch jest obecną wersją „testowania”, a zatem ma minimalne opóźnienie w zależności od tego, ile czasu zajmuje przejście od testowania ; i przy założeniu, że natychmiast staje się niestabilny - na przykład 1.10.0 został wydany 26 kwietnia , ale został przeniesiony do niestabilnej 29 kwietnia i migrował do wersji 5 maja ( patrz PTS ).
GreenReaper,
1
Jestem całkiem świadomy tych faktów, dzięki. :) Myślę, że pytanie sprowadza się do tego, czy trzeba „nowych pakietów” (tylko dlatego, że (?)), Jeśli próbujemy zapewnić stabilne usługi. AFAIK, wiele osób wybiera Debiana (i na tym polega system operacyjny), ponieważ jest stabilny. Uruchomienie nowych wersji oprogramowania wiąże się z pewnym ryzykiem. Ale w każdym razie, jak sądzę, nie ma ogólnej zasady, jak sobie z tym poradzić, ponieważ środowiska, oczekiwania i potrzeby różnią się. Poza tym: dzięki za wkład, jestem pewien, że ma wartość dla ludzi; moje wcześniejsze linie nie oznaczają żadnego przestępstwa.
gf_
1
Jak mówisz, to kwestia stopnia. Jeśli chcesz być na krawędzi, możesz codziennie kompilować kompilacje. W moim przypadku bycie przynajmniej w czołówce technologicznej to plus. Sama ALPN prawdopodobnie nie jest potrzebna dla większości stron - ale jest wysoce pożądana przez tych, którzy chcą korzystać z HTTP / 2 (szczególnie jeśli wcześniej miałeś to podczas korzystania z NPN); i ta grupa docelowa jest również bardziej zainteresowana rodzajami funkcji, które pojawiają się w głównym nginxie przed stabilnością. Zarządzam dziesięcioma węzłami pamięci podręcznej i zwykle wypróbowuję go na mniejszym, aby przetestować pod obciążeniem przed dalszym rozszerzeniem.
GreenReaper,
0

Inną metodą jest użycie jessie-backports, a następnie łatwa odbudowa nginx

dodaj do backportów /etc/apt/sources.list

deb http://ftp.debian.org/debian jessie-backports main

a następnie uruchom jako root

apt-get update
apt-get install -t jessie-backports openssl

a następnie odbuduj nginx. Postępuj zgodnie z instrukcjami na https://wiki.debian.org/BuildingAPackage

StanleyD
źródło
„[...] Albo skompilujesz się dla siebie, czego nie chcesz robić [...]”
gf_
0

Dla mnie najprostszym sposobem, aby to naprawić, było użycie innego obrazu Dginer Nginx, zobacz oficjalną wersję Nginx na Docker Hub . Domyślna kompilacja Docker Nginx korzysta z Debian Jessie, więc nie rozwiąże problemu, ale oferuje także alternatywną kompilację opartą na systemie Alpine Linux . Najnowsze wersje używają OpenSSL 1.0.2!

To rozwiązanie zakłada zatem, że zainstalowałeś Docker i nie przeszkadza ci uruchamianie Nginx Alpine Linuxzamiast Debian Jessie.

Aby uruchomić swój kontener 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

Krótkie wyjaśnienie na początek w Docker:

  • docker run: pobiera obraz Dockera (w tym przypadku nginx:1.11-alpine), jeśli jeszcze go nie masz i uruchamia kontener Docker na podstawie tego obrazu
  • --name nginx-container: nadaje nazwę kontenerowi Docker (możesz wyświetlić wszystkie działające kontenery Docker za pomocą sudo docker pslub użyć, sudo docker ps -aaby wyświetlić również zatrzymane kontenery)
  • -p 80:80 -p 443:443: wiąże porty 80 i 443 na hoście z odpowiednio portami 80 i 443 w kontenerze Docker
  • -v /path/to/your/nginx/directory/:/etc/nginx/: montuje katalog w systemie hosta, który zawiera konfigurację Nginx, do /etc/nginx/katalogu w kontenerze Docker
  • /path/to/your/files/to/serve/:/usr/share/nginx/html/: montuje katalog w systemie hosta, który zawiera pliki, które Nginx ma udostępnić
  • -d: uruchamia kontener w tle (można go zatrzymać za pomocą docker stop nginx-container)
  • nginx:1.11-alpine: użyj tego obrazu, aby rozpocząć kontener ( oficjalne obrazy doków Nginx są wymienione tutaj )

Przydatne również:

  • użyj, sudo docker exec nginx-container <command>aby uruchomić polecenie w kontenerze, na przykład, sudo docker exec nginx-container nginx -s reloadaby ponownie załadować Nginx po zmianie plików konfiguracyjnych w systemie hosta
  • Lub użyj, sudo docker exec -it nginx-container bashaby wprowadzić powłokę bash do kontenera, abyś mógł tam pracować bezpośrednio (niezalecane, ale czasem przydatne)
Sicco
źródło
0

W mojej sytuacji korzystałem z repozytorium apt Dotdeb. Instrukcje na tej stronie dają opcję dodania repozytorium, które pozwala zainstalować Nginx z „pełną” obsługą HTTP2. Obecna wersja to 1.14, co jest jedną drobną różnicą w stosunku do ostatniego wydania, więc nie będziesz zbyt daleko w tyle (obecne backport to 1.10).

HarmenB
źródło