使用OpenSSL 1.0.2的Debian Jessie Nginx使用ALPN而不是NPN


14

我在服务器上运行debian jessie,最近升级到了具有http / 2支持(nginx 1.10)的新Nginx Web服务器。与今天一样,它的工作原理非常好,并且Web服务器正在通过http2协议交付内容。

我已经读到,Chrome正在放弃NPN支持,并且仅允许在2016年5月15日之后使用ALPN。ALPN是扩展程序,需要安装openssl 1.0.2,但在debian jessie上仅是openssl 1.0.1(在debian backports和另一个存储库上,此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,而无需构建自己的构建(不良维护)或等待反向端口存储库拥有它?我也不想在我的系统上使用两个版本的openssl,如果其中一个必须手动链接和维护。

谢谢你的帮助。


您可以使用apt pinning和使用opensslout Debian stretch
gf_

@gf_很有可能破坏系统。很多事情都取决于OpenSSL。
迈克尔·汉普顿

@MichaelHampton好吧,我无法判断风险的程度,我怀疑它的风险很高。我要和维护者之一Kurt Roeckx一起去,他们试图在冻结后不久1.0.2进入jessie(当时被拒绝了):“此版本应与1.0.1版本兼容。我不希望有任何变化。从1.0.1升级到1.0.2。” (我会更加了解libc6。)
gf_16年

在这种情况下,@ gf_“使用它”将需要重新编译使用OpenSSL的所有内容。我对此感到惊讶,这并不奇怪。Debian喜欢老而稳定的人。在您的建议上下文中,这还意味着引入每个使用OpenSSL的拉伸包,其中包括很多内容。
迈克尔·汉普顿

@MichaelHampton我对Debian的政策非常了解,对于当时被拒绝(也不想说这个或给人留下印象),我也并不感到惊讶。但是:(也许我的措辞不正确):(在已安装apt-get install -t stretch nginx的香草Debian jessienginx)将插入: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_

Answers:


16

2016年8月8日更新: nginx in jessie-backports1.9.10-1~bpo8+3针对版本构建openssl >= 1.0.2~ALPN如果正在运行,jessie只需将软件包取出即可开始工作jessie-backports,不再需要从中取出软件包stretch

-

原始答案:根据评论,我的答案就在这里:我认为,截至今天(2016年5月9日),解决此问题的方法还不多。基本上,您必须尝试通过某种方式使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
    
  • 设置apt pinning,以确保仅从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/ as进行安装root)。利润!

  • 正如我在评论中所描述的,要降低所涉及的风险,您可以使用类似chroot或类似LXC的容器解决方案。如果您想走这chroot条路,则必须在其中设置一个网络接口:为此,请看一下此博客文章,其中对进行了介绍network namespaces

  • 希望这可以帮助; 如果您还有其他问题,请随时与我联系。非常感谢您的反馈,并且我对反馈的过程很感兴趣。


我今天已经按照您的答案描述安装了nginx,一切似乎都很好!我需要做的唯一一件事是删除旧的nginx安装,因为我从nginx存储库中获得了nginx 1.10,并且该版本与debian存储库软件包不兼容(但是从debian nginx升级时,我也这样做了。到1.10,因此没有问题)。感谢您的努力和帮助!
朱拉·尼梅克

@JurajNemec太好了!非常感谢您的反馈!您是否ALPN已经检查了支持?
gf_

是。通过http2测试SSL Labs测试对其进行了检查,两者均指出是否支持ALPN。还nginx -V提供信息,说明该版本是使用openssl 1.0.2+编译的。因此,我认为它工作正常。
朱拉·尼梅克

@JurajNemec太好了,听起来不错!如果您有可能,请在运行此设置一段时间(大概四到八周)后获得一个小的更新。谢谢!
gf_

@JurajNemec看来,Google进行了更改,并删除了NPN。您的设置仍然可以按预期工作吗?
gf_

11

另一种方法是从jessie-backports安装OpenSSL 1.0.2,并使用nginx自己的存储库中的 Ubuntu 16.04 LTS构建这样,您至少要使用为Jessie构建的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的仓库意味着您可以获得最新的更新。


您能否详细说明/阐明为什么要走这条路?关于“ Plus,使用nginx的回购意味着您可以获得新的更新。”:您也将使用我所描述的方式获得“新的更新”。
gf_

nginx的软件包在发布的当天进行更新,因为它们是其发布过程的一部分,而不是Debian的发布过程。我提供的是mainline软件包,而不是稳定软件包,但是您只需在上述路径中删除/ mainline就可以保持稳定。您更喜欢哪个,取决于您。
GreenReaper '16

在上述内容上进行扩展:stretch是当前的“测试”版本,因此根据从测试移出需要多长时间而具有最小延迟;并假设它立即使其变得不稳定-例如,1.10.0已于4月26日发布,但被推至不稳定的4月29日,于5月5日迁移至拉伸状态请参阅PTS)。
GreenReaper'7

1
我非常了解这些事实,谢谢。:)我认为问题可以归结为:如果试图提供稳定的服务,是否需要“新软件包”(仅因为(?))。AFAIK,很多人选择Debian(这是问题所在的操作系统),因为它很稳定。运行新版本的软件存在很大的风险。但是无论如何,我猜没有一个普遍的规则可以做到这一点,因为环境,期望和需求是不同的。此外:感谢您的投入,我相信这对人们很有价值;我之前的台词并不意味着任何冒犯。
gf_

1
正如你所说,这是学位的问题。如果您想走在前沿,可以每天编译一次构建。就我而言,至少在技术方面处于领先地位是一个加号。ALPN本身可能并不是大多数站点所需要的-但是,那些希望使用HTTP / 2的用户非常希望使用它(尤其是如果您以前在使用NPN时拥有它)。这个目标群体也更可能对稳定之前在主线nginx中弹出的功能感兴趣。我管理10个缓存节点,通常在较小的缓存节点上进行尝试以在负载下进行测试,然后再进一步推广。
GreenReaper '16

0

另一种方法是使用jessie-backports,然后轻松重建nginx

添加到/etc/apt/sources.list反向端口

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

然后以根用户身份运行

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

然后重建nginx。按照https://wiki.debian.org/BuildingAPackage上的说明进行操作


“ [...]您自己编译,不想做[...]”
gf_

0

对我而言,最简单的解决方法是使用其他Nginx Docker映像,请参阅Docker Hub上官方Nginx构建。默认的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分别绑定到Docker容器中的端口80和443
  • -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

在我的情况下,我使用了Dotdeb apt存储库。该网站的说明提供了一个添加存储库的选项,该存储库使您可以安装具有“完全” HTTP2支持的Nginx。当前版本是1.14,比上一个发行版落后一个小,所以您不会落后太多(当前backport是1.10)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.