Назад | Перейти на главную страницу

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

Я запускаю 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 (также для backports debian и других репозиториев нет версии openssl 1.0.2 для этого debian).

И есть проблема - я обновился с 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 в моей системе, если одна из них должна быть связана и обслуживаться вручную.

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

Обновление 2016/08/08: nginx в 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 / так как root) для обновления кеша пакетов.

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

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

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

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

добавить в /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 означает получение свежих обновлений.

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

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

Таким образом, это решение предполагает, что вы установлен докер и нормально работают с 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 в контейнер, чтобы вы могли работать там напрямую (не рекомендуется, но иногда полезно)

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

добавить в /etc/apt/sources.list резервные копии

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

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