Debian jessie nginx с openssl 1.0.2 для использования ALPN, а не NPN


14

Я использую Debian Jessie на моем сервере и недавно обновлен до нового веб-сервера nginx с поддержкой http / 2 (nginx 1.10). Как и сегодня, он отлично работает, и веб-сервер доставляет контент по протоколу http2.

Я читал, что Chrome сбрасывает поддержку NPN и разрешает ALPN только после 15.5.2016. ALPN - это расширение, для которого требуется установленный openssl 1.0.2, но в Debian jessie - это только openssl 1.0.1 (также для обратных портов debian и других репозиториев, для этого Debian нет версии openssl 1.0.2).

И есть проблема - я перешел с SPDY на http2 и через несколько дней мне придется отключить http2 и не могу использовать SPDY, потому что в этой версии nignx есть только http2. Я также читал, что эта версия Debian будет зависать от openssl 1.0.1, и только Debian Stretch будет иметь OpenSSL 1.0.2. Но до даты релиза почти год, и Chrome скоро прекратит поддержку, поэтому я не хочу терять преимущество протокола http2.

Есть ли какое-либо решение, как установить openssl 1.0.2 в этой системе, не создавая собственную сборку (плохое обслуживание) или не ожидая, пока будет установлен репозиторий backports? Мне также не нужны две версии openssl в моей системе, если одна из них должна быть связана и поддерживаться вручную.

Спасибо за любую помощь.


Вы можете использовать apt pinningи использовать opensslиз Debian stretch.
gf_

@gf_ При очень высоком риске взлома вашей системы. Многое зависит от OpenSSL.
Майкл Хэмптон

@MichaelHampton Ну, я не могу судить об уровне риска, я сомневаюсь, что он очень высок. Я иду с Куртом Рексом, одним из сопровождающих, который пытался получить1.0.2 в jessieтолько вскоре после замораживания (который был отклонен тогда). «Эта версия должна быть совместима с версией 1.0.1 я ничего не жду сломать движение от 1.0.1 до 1.0.2. " (Я бы больше об этом знал libc6.)
gf_

@gf_ "Получение информации" в этом контексте потребует перекомпиляции всего, что использует OpenSSL. Я не удивлен, что это было отклонено; Debian любит старый и стабильный. В контексте вашего предложения это также означает, что вы можете загружать все пакеты, которые используют OpenSSL, и это очень много.
Майкл Хэмптон

@MichaelHampton Я хорошо осведомлен о политиках Debian, и меня тоже не удивляет, что тогда это было отвергнуто (я не хотел этого говорить или создавать такое впечатление). Но: (может быть , моя формулировка неверна): Ведение apt-get install -t stretch nginx(на ваниль Debian jessieс nginxустановлен) будет тянуть в: 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. (Это десять пакетов ..)
gf_

Ответы:


16

Обновление 2016/08/08: nginx in jessie-backports(версия 1.9.10-1~bpo8+3была построена против openssl >= 1.0.2~. Приступая к ALPNработе сейчас, если для запуска jessieпросто требуются пакеты jessie-backports, больше не нужно извлекать пакеты из stretch.

-

Оригинальный ответ: Ну, вот мой ответ, согласно комментариям: На мой взгляд, на сегодня не так много способов решить эту проблему, 2016/05/09. По сути, вы должны как-то попытаться внедрить современность nginxв вашу систему, скомпилированную против >= openssl 1.0.2~.

Единственные два варианта, которые я вижу в настоящее время: либо вы компилируете для себя, чего вы не хотите делать, что вполне понятно, либо вы загружаете современные пакеты из Debian stretchвашей системы. Это связано с некоторыми рисками, потому что вы смешиваете стабильную среду с другой, но, на мой взгляд, эти риски довольно низки, потому что вы используете Debian.

Итак, давайте попробуем это:

  • Добавьте Debian stretchрепозиторий в свой apt sources. Не используйте /etc/apt/sources.listдля этого, но вместо этого используйте выделенный файл внутри, /etc/apt/sources.list.d/чтобы сохранить его в чистоте, лично я использую stretch.list.

    Поместите эти строки внутрь:

    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
    
  • Настройка точного закрепления чтобы убедиться, что вы извлекаете только те пакеты, из Debian stretchкоторых вы указываете. Файл, используемый для этого /etc/apt/preferences, находится там:

    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
    

    (Возможно, вам придется изменить наборы и приоритеты в соответствии с вашей средой.)

  • Запустить apt-get update(черезsudo / as root), чтобы обновить кеш пакета.

  • Установить nginxс Debian stretch: apt-get install -t stretch nginx(сделать это черезsudo / как root). Прибыль!

  • Как я описал в своих комментариях, чтобы снизить риски, вы можете использовать что-то вроде chroot или контейнерного решения, такого как LXC . Если вы хотите пойти по этому chrootпути, вам нужно настроить сетевой интерфейс внутри: для этого взгляните на этот пост, например , , который содержит введение network namespaces.

  • Надеюсь это поможет; если у вас есть еще вопросы, не стесняйтесь связаться со мной. Буду признателен за отзыв, и мне интересно, как оно идет.


Я установил nginx сегодня по вашему описанию ответа, и все, кажется, работает отлично! Единственное, что мне нужно было сделать дополнительно, это удалить старую установку nginx, потому что у меня был nginx 1.10 из репозитория nginx, и эта версия несовместима с пакетом репозиториев debian (но я делал это также при обновлении с Debian nginx). до 1.10, так что проблем не было). Спасибо за ваши усилия и помощь!
Юрай Немец

@JurajNemec Отлично! Большое спасибо за отзыв! Вы уже проверили ALPNподдержку?
gf_

Да. Проверено с помощью http2 test и SSL Labs test , оба утверждают, что есть поддержка ALPN. Также nginx -Vдает информацию, что версия скомпилирована с openssl 1.0.2+. Поэтому я думаю, что это работает правильно.
Юрай Немец

@JurajNemec Отлично, звучит хорошо! Если это возможно для вас, мне было бы интересно получить небольшое обновление после того, как вы запустили эту настройку некоторое время, может быть, четыре или восемь недель. Благодарность!
gf_

@JurajNemec Кажется, Google сделал переключатель и удалил NPN. Ваша установка все еще работает как ожидалось?
gf_

11

Другой способ - установить OpenSSL 1.0.2 из jessie-backports и использовать сборки Ubuntu 16.04 LTS из собственного репозитория nginx. Таким образом, вы хотя бы используете пакет OpenSSL, созданный для Джесси.

Добавить к /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

Затем запустите:

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

Это, очевидно, помещает вас в официально неподдерживаемую конфигурацию, но, возможно, это лучше, чем отсутствие пакета вообще - и это сработало для меня. Кроме того, использование репозитория nginx означает, что вы получаете свежие обновления.


Не могли бы вы уточнить / уточнить, почему можно пойти по этому пути? Что касается «Плюс, использование репозитория nginx означает, что вы получаете свежие обновления». Вы также получаете «свежие обновления», как я описал.
gf_

Пакеты nginx обновляются в день их выпуска, потому что они являются частью процесса их выпуска, а не процесса выпуска Debian. Я включил основные пакеты, а не стабильные пакеты, но вы можете получить стабильность, просто удалив / mainline в указанных выше путях. Что вы предпочитаете, зависит от вас.
GreenReaper

Чтобы расширить вышесказанное: растяжка является текущей версией для тестирования, и поэтому имеет минимальную задержку в зависимости от того, сколько времени потребуется, чтобы перейти от тестирования ; и это предполагает, что это немедленно приводит к нестабильности - например, 1.10.0 была выпущена 26 апреля , но перенесена в нестабильную 29 апреля и перенесена на 5 мая ( см. PTS ).
GreenReaper

1
Я в курсе этих фактов, спасибо. :) Я думаю, что вопрос сводится к тому, нужны ли «новые пакеты» (только потому, что (?)), Если вы пытаетесь предоставлять стабильные услуги. AFAIK, многие люди выбирают Debian (и это ОС, о которой идет речь), потому что он стабилен. Существует довольно большой риск, связанный с запуском новых версий программного обеспечения. Но в любом случае, я думаю, что не существует общего правила, как справиться с этим, потому что среда, ожидания и потребности различаются. Кроме того: Спасибо за ваш вклад, я уверен, что это имеет значение для людей; мои строки раньше не означают какого-либо оскорбления.
gf_

1
Как вы говорите, это вопрос степени. Если вы хотите быть на переднем крае, вы можете ежедневно собирать сборки. В моем случае, по крайней мере, быть на переднем крае технологии является плюсом. Сам ALPN, вероятно, не является необходимостью для большинства сайтов, но он очень желателен для тех, кто хочет использовать HTTP / 2 (особенно, если у вас это было раньше при использовании NPN); и эта целевая группа также с большей вероятностью будет интересоваться типом функций, которые появляются в основной строке nginx до стабильной. Я управляю десятью узлами кэша и обычно пробую его на меньшем, чтобы тестировать под нагрузкой, прежде чем развернуть его дальше.
GreenReaper

0

Другой способ - использовать jessie-backports, а затем легко перестроить nginx.

добавить в /etc/apt/sources.list backports

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

а затем запустить от имени пользователя root

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

и затем пересоберите nginx. Следуйте инструкциям на https://wiki.debian.org/BuildingAPackage


«[...] Либо вы компилируете для себя, что вы не хотите делать [...]»
gf_

0

Для меня самый простой способ исправить это - использовать другой образ Nginx Docker, см. Официальную сборку Nginx на Docker Hub . В стандартной сборке Docker Nginx используется Debian Jessie, так что это не решит вашу проблему, но они также предлагают альтернативную сборку на основе Alpine Linux . Его последние сборки используют OpenSSL 1.0.2!

Таким образом, это решение предполагает, что вы установили Docker и можете запускать Nginx Alpine LinuxвместоDebian Jessie .

Чтобы запустить свой контейнер 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

Краткое объяснение, с чего можно начать с Docker:

  • docker run: загружает образ Docker (в данном случае nginx:1.11-alpine), если у вас его еще нет, и запускает контейнер Docker на основе этого образа
  • --name nginx-container: присваивает контейнеру Docker имя (вы можете просмотреть все запущенные контейнеры Docker, используя sudo docker psили используя sudo docker ps -aтакже просмотр остановленных контейнеров)
  • -p 80:80 -p 443:443: связывает порты 80 и 443 на хост-компьютере с портами 80 и 443 в контейнере Docker соответственно
  • -v /path/to/your/nginx/directory/:/etc/nginx/: монтирует каталог в вашей хост-системе, который содержит вашу конфигурацию Nginx, в /etc/nginx/каталог в контейнере Docker
  • /path/to/your/files/to/serve/:/usr/share/nginx/html/: монтирует каталог на вашей хост-системе, который содержит файлы, которые вы хотите, чтобы Nginx обслуживал
  • -d: запускает контейнер в фоновом режиме (вы можете остановить использование контейнера docker stop nginx-container)
  • nginx:1.11-alpine: используйте это изображение для запуска вашего контейнера ( официальные изображения Nginx Docker перечислены здесь )

Также полезно:

  • используйте sudo docker exec nginx-container <command>для запуска команды в контейнере, напримерsudo docker exec nginx-container nginx -s reload для перезагрузки Nginx после изменения файлов конфигурации в хост-системе
  • Или используйте sudo docker exec -it nginx-container bashдля ввода оболочки bash в контейнер, чтобы вы могли работать там напрямую (не рекомендуется, но иногда полезно)

0

Альтернативный способ - использовать BoringSSL, что не повредит окружению OpenSSL. Вот подробности, на которые можно сослаться, https://www.admon.org/hardwares/enable-http2-support-for-nginx-on-debian-jessie.


1
Ответы, содержащие только ссылки, становятся менее полезными после истечения срока действия ссылок. Пожалуйста, включите соответствующую часть связанной страницы в ваш ответ.
sendmoreinfo

0

В моей ситуации я использовал репозиторий Dotdeb apt. Инструкции на этом сайте дают возможность добавить репозиторий, который позволяет вам установить Nginx с «полной» поддержкой HTTP2. Текущая версия 1.14, что на одну ступень меньше, чем в последнем выпуске, так что вы не будете слишком далеко позади (текущий бэкпорт 1.10)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.