Debian的jessie nginx用openssl 1.0.2来使用ALPN而不是NPN

我在我的服务器上运行debian jessie,最近升级到了带有http / 2支持的新的nginx web服务器(nginx 1.10)。 就像今天,它工作的很好,web服务器使用http2协议提供内容。

我已经阅读, 铬是下降NPN的支持 ,只允许ALPN 15.5.2016后。 ALPN是扩展,它需要安装openssl 1.0.2,但在debian上jessie只是openssl 1.0.1(在debian backports和另一个版本库中,这个debian没有openssl 1.0.2版本)。

并有问题 – 我已经从SPDY升级到http2,并在几天内,我将不得不closureshttp2,不能使用SPDY,因为这个版本的nignx只有http2。 我也读过,这个版本的debian会卡住openssl 1.0.1,只有debian stretch会有openssl 1.0.2。 但是发布date几乎是一年,Chrome会尽快放弃支持,所以我不想放弃http2协议的好处。

有没有解决scheme,如何在这个系统上安装openssl 1.0.2,而不build立自己的构build(坏的维护)或等待backports存储库有它? 我也不希望两个版本的openssl在我的系统上,如果他们之一必须手动链接和维护。

感谢您的帮助。

更新2016/08/08: jessie-backports nginx (版本1.9.10-1~bpo8+3是针对openssl >= 1.0.2~ 1.9.10-1~bpo8+3构build的)如果运行jessie只需要jessie-backports ,不再需要拉伸包装。

原来的答案:好的,这里是我的答案,根据意见:在我看来,没有很多方法来解决这个问题,截至今天,2016/05/09。 基本上你必须尝试以某种方式获得一个现代的nginx进入你的系统,编译为>= openssl 1.0.2~

我目前看到的只有两个选项:你自己编译,你不想做的,这是很容易理解的,或者你把现代的软件包从Debian stretch伸进你的系统。 这涉及到一些风险,因为你将一个稳定的环境与另一个环境混合在一起,但在我看来,这些风险相当低, 因为你正在使用Debian

所以,我们来试试这个:

  • Debian stretch库添加到您的apt sources 。 不要为此使用/etc/apt/sources.list ,而是使用/etc/apt/sources.list中的专用文件来保持清洁,我个人使用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来确保你只从你指定的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 )来更新软件包caching。

  • Debian stretch安装中安装nginxapt-get install -t stretch nginx (通过sudo /以root身份执行此操作)。 利润!

  • 正如我在评论中所描述的那样,为了降低涉及的风险,您可以使用诸如LXC之类的chroot或容器解决scheme。 如果你想采用chroot方式,你必须在那里设置一个networking接口:为了做到这一点,看看这个博客post,例如 ,介绍network namespaces

  • 希望这可以帮助; 如果你有更多的问题,请随时与我联系。 我将不胜感激反馈意见,我对如何去感兴趣。

另一种方法是从jessie-backports安装OpenSSL 1.0.2,并使用nginx自己的仓库中的 Ubuntu 16.04 LTS版本。 这样你至less可以使用为Jessie构build的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 

这显然会让你进入一个官方不受支持的configuration,但也许这比没有一个软件包更好 – 这对我来说很有用。 另外,使用nginx的回购意味着你得到新的更新。

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

添加到/etc/apt/sources.list后台

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

然后以root身份运行

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

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

对我来说,解决这个问题的最简单方法是使用不同的Nginx Docker镜像,请参阅Docker Hub上官方的Nginx构build 。 默认的Docker Nginx构build使用Debian Jessie,这样就不会解决你的问题,但是他们也提供了一个基于Alpine Linux的替代版本。 它的最新版本使用OpenSSL 1.0.2!

因此,这个解决scheme假设你安装了Docker,并且在Alpine Linux上运行Nginx而不是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容器一个名字(你可以使用sudo docker ps查看所有正在运行的Docker容器,或者使用sudo docker ps -a来查看已经停止的容器)
  • -p 80:80 -p 443:443 :将主机上的端口80和443分别绑定到Docker容器中的端口80和443
  • -v /path/to/your/nginx/directory/:/etc/nginx/ :将包含Nginxconfiguration的主机系统上的目录挂载到Docker容器中的/etc/nginx/目录
  • /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在您更改主机系统上的configuration文件后sudo docker exec nginx-container nginx -s reload加载Nginx
  • 或者使用sudo docker exec -it nginx-container bashsudo docker exec -it nginx-container bash中input一个bash shell,这样你可以直接在那里工作(不推荐,但有时候是有用的)

另一种方法是使用BoringSSL,而不会损害OpenSSL环境。 这里是要参考的细节, https://www.admon.org/hardwares/enable-http2-support-for-nginx-on-debian-jessie