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