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

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

6 ответов

Решение

Обновление 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, созданный для Джесси.

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

Другой способ - использовать 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

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

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