我在我的服务器上运行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安装中安装nginx : apt-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 bash在sudo docker exec -it nginx-container bash中input一个bash shell,这样你可以直接在那里工作(不推荐,但有时候是有用的) 另一种方法是使用BoringSSL,而不会损害OpenSSL环境。 这里是要参考的细节, https://www.admon.org/hardwares/enable-http2-support-for-nginx-on-debian-jessie