HAProxy、Nginx 配置 HTTP/2 完整指南

HAProxy、Nginx 配置 HTTP/2 完整指南

基于最近对HTTP/2的争论和它的优势,是时候升级底层架构了。这篇文章将会介绍如何在安装和配置HAProxy和Ngnix(使用ssl终端)。为了简化流程,我建议你准备好使用Docker镜像。

如果你想跳过安装环节或你只对配置环节感兴趣,可以跳至配置部分。

我为什么需要关注HTTP/2?

这里有一些介绍HTTP/2益处的文章-而且我鼓励你去读一读。下面我将重点介绍我认为比较重要的几点。

HTTP/2的主要优势:

  • 使用二进制数据(不像HTTP/1.1一样使用明文)而且它使用了header数据压缩。不用再为header和cookie的大小而担心了。
  • 它是完全多元化的,为了提升并发性可以使用一个连接加载多种资源。你的网站性能在需要引入多种资源的时候会表现得更好,因为现在它们可以在一次TCP连接中全部加载,在非阻塞模式中。域名切分和资源级联变成了反面模式。简单来说:你的网站加载会更快。
  • 它允许服务器提前推送请求到客户端的缓存(目前Ngnix不支持这个特性)
  • 它使用新的ALPN扩展,那将允许更快地加密连接。这个加密协议在初始化连接的阶段是可用的。

今天我可以使用它吗?

是的,你可以。正如你所看到的在Can I Use上的服务那样,所有现代浏览器现在都支持HTTP/2,这里包括IE11和Edge。唯一的例外是移动端的Opera Mini和Android浏览器不支持它。

此外,下面描述的配置都会确保客户端在不支持HTTP/2的情况下,退回到HTTP/1.1。这非常重要:你的网站应该为那些老版本浏览器或搜索引擎爬虫提供访问支持。

安装

我会在CentOS 7下安装,如果你使用其他Linux发布版本,你可以简单调整下代码。

你需要做的:

1.站点能跑通SSL。如果你还没有虚拟证书的话,你需要使用虚拟证书(简单)。

2.Ngnix 1.9.5 或更新版本( 简单 )。

3. 安装配置好OpenSSL的HAPorxy 1.6或更新版( 需要一些技巧 )。

4.良好的HAPRoxy和Ngnix配置( 简单 )。

5.确认你是否已经在使用HTTP/2,HTTP/2 and SPDY indicator 对Chrome友好。

OpenSSL部分是需要一些技巧,因为大部分有OpwnSSL 1.0.1(或者更旧的版本)的Linux分支都不支持ALPN(应用层协议协商)。ALPN协议允许应用层去协商,这个协议将被用在连接中,而且这是基本的,如果我们要在相同的TCP端口支持HTTP/2和HTTP/1。除此之外,HTTP/2在HAProxy中只支持使用ALPN,所以它一定会在我们的列表里。

如果你对安装流程熟悉的话,请直接跳至配置部分.

1.获取 SSL 证书

你可以很便宜的从ssl2buy.com上买到信任证书,那里有许多靠谱发行机构的代售。我曾经在那里买了一堆证书而且我推荐他们的服务和客户支持。你可以从那里拿到低于20美元的AphaSSL证书。

如果你需要为HAProxy或Nginx生成虚拟证书,你可以使用下面的命令:

我们需要在下一步的配置中使用生成的证书和秘钥。

2.Nginx 安装

在CentOS 7上安装Ngnix 1.9十分简单。唯一需要做的就是使用主线版YUM源,而不是稳定版。就像Ngnix.org.oage上描述的那样,把yum源的配置放到/etc/yum.repos.d/nginx.repo位置然后执行yum install:

搞定。

让我们创建一个Ngnix vhost.conf(虚拟主机配置文件)确保我们的Nginx在拥有HTTP/2的情况下正常工作。下面是一个简单的vhost配置:

第一点:关键点是在listen 443 default_server ssl http2那一行。这就相当于你使用了HTTP/2。

第二点:现在忽略第三行listen 81部分的配置 – 我们一会再回来看这部分。

第三点:我使用使用标准的80/443端口在Docker镜像里跑这个样例,所以它们不会和我的host主机上的任何端口发生冲突。如果有需要,你可以把它调整至适用你的需要。

第四点:使用在获取SSL证书那一步生成的dummy.crt和dummy.key。

好了,当你使用https://协议连接站点时,HTTP/2提示器会提示你站点正在运行HTTP/2协议。

恭喜你,你的Ngnix已经在运行HTTP/2了!

3. OpenSSL 和 HAProxy 安装

这一部分有点棘手。我们需要编译OpenSSL 1.0.2的源码(因为在yum中还没有可用的资源)并且在之后的HAProxy重编译中还会使用到它。

建立OpenSSL的工作,我们使用no-shared参数,并且HAProxy是通过静态方式连接到OpenSSL的。我遵照的是HAProxy官方的README。但可笑的是,我最终还是采用了其他的方式……并且要非常足智多谋。你会常常去读这些冗长且乏味的README文件吗?

在那之后,你应该已经编译通过HAProxy且安装好了。测试一下:

haproxy -vv

4.配置

这是一个我们将用到完整的/etc/haproxy/haproxy.cfg(HAProxy配置):

最本质的部分在这:

这里我们定义了HTTPS前端接口在客户端请求HAProxy时监听443端口。

请求被后端的nodes-http2还是nodes-http处理取决于客户端是否支持HTTP2.注意我们决定SSL在HAProxy上使用这个配置,连接对后端服务器来说是被解密过的。我们的后端服务器可以被HAProxy用web服务器的域名访问(这就是运行过程中的Nginx,就像我们上面说的)。

在bind *:443 line with alpn h2,http/1.1一行我们建议为了方便客户端使用最好两种协议(HTTP/2 and HTTP/1.1)都支持。

这样的话浏览器即使不支持HTTP/2,也可以浏览我们的网站。

use_backend nodes-http2 if { ssl_fc_alpn -i h2 } 支持HTTP/2的客户端会被重定向到nodes-http2后端节点,剩下使用HTTP/1.1协议的将被nodes-http处理。如果你想让后端兼容还不支持HTTP/2的客户端,这件事十分重要的。

因此我们会有下面这一行:

server node1 web.server:81 check send-proxy

在这里,我们只讨论了HAProxy和HTTP/2协议。通常它连接web.server在81端口。我们还有更令人高兴的惊喜吗?

让我们用nginx下列虚拟主机配置(如上所述):

这一行:listen 81 default_server http2 proxy_protocol;

定义了服务器在端口81,会处理HTTP/2的请求。请注意,我们无法在服务器使用443端口进行SSL连接:SSL连接已经被HAProxy解密过了,所以现在我们有一个非加密连接。因此我们需要限制服务器的81端口只使用HTTP/2,不使用SSL。

题外话:小也有proxy_protocol关键词。在haproxy.cfg等效发送代理,在后端服务器配置。代理协议是独立出来的,这儿有篇文章很好的解释了原因。简而言之,它允许通过HAProxy后端服务器传送客户端的IP地址和端口号,这通常是非常理想的。

你可以使用上面的配置运行HAProxy:

haproxy -f /etc/haproxy/haproxy.cfg

现在你应该能够连接到您的代理主机(例如https://localhost:443/),看到它正在运行HTTP / 2。如果你在Firefox的测试,检查网络请求头的标题,你会看到X-Firefox-Spdy: “h2″。

Docker images

如果你早已经会使用Docker,你可以用我们的MILLION12镜像。当Docker还是1.0版本的时候我们已经开始使用Docker很长时间了(MILLION12这是我们的仓库地址),而且我们已经构建了一堆有用的镜像 。在这个例子里,我们将使用million12/haproxymillion12/nginx 这两个镜像。里面的配置是我们讨论后的最终结果。

你可以运行整个栈通过使用docker-compose.yml文件。注意我们是通过haproxy容器里的web.server主机名连接Nignx的,那个域名就是当前haproxy.cfg使用的主机名。

连接https://haproxy:8443你就会看到屏幕显示出如下内容(注意蓝色的HTTP/2提示部分)。

http://m12.io/blog/http-2-with-haproxy-and-nginx-guide

https://github.com/million12/docker-haproxy

https://github.com/million12/docker-nginx

时间: 2024-07-28 20:15:54

HAProxy、Nginx 配置 HTTP/2 完整指南的相关文章

中小企业openstack私有云布署实践【4.2 上层代理haproxy+nginx配置 (办公网测试环境)】

续上一节说明 一开始我也是使用haproxy来做的,但后来方式改了,是因为物理机controller的高配置有些浪费,我需要1组高可用的上层nginx代理服务器来实现其它域名80代理访问,很多办公网测试的域名解析58.251.17.238的IP,都是复用走这组controller的nginx 测试环境:haproxy + nginx 所以,我需要将haproxy的dashboard占用的80剥离出来 两边的controller主备控制节点均安装 yum install -y haproxy 创建

nginx.conf 集群完整配置

###############################nginx.conf 集群完整配置############################### #user nobody; # user 主模块指令,指令nginx worker 运行用户和用户组(user xxxuser xxxgroup) ,默认由nobody运行 worker_processes 1; # worker_processes 主模块指令,指令nginx运行进程数,每个进程平均耗10m-12m内存,单核为1,多核为

nginx配置指南之一(转载)

nginx配置指南之一 一.nginx简介 1.1 Tengine简介 Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性.Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验.它的最终目标是打造一个高效.稳定.安全.易用的Web平台. 1.2 参考资源 http://tengine.taobao.org/documentation_cn.html 二.Tengine设置及编译 2.1 前期准备 在

nginx配置使用笔记:三

什么是remote_addr remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你 的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把 remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个 代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP. 什么是x_forwarded_for 正如上面所述,当你使用了代

分享:Nginx配置性能优化

Nginx配置性能优化 分类: Nginx/Apache2014-04-03 22:23 3957人阅读 评论(0) 收藏 举报 nginxgzipworkerweb服务epoll 大多数的Nginx安装指南告诉你如下基础知识--通过apt-get安装,修改这里或那里的几行配置,好了,你已经有了一个Web服务器了.而且,在大多数情况下,一个常规安装的nginx对你的网站来说已经能很好地工作了.然而,如果你真的想挤压出Nginx的性能,你必须更深入一些.在本指南中,我将解释Nginx的那些设置可以

(备忘)Nginx中文手册(技术指南第二版)

Nginx 常见应用技术指南[Nginx Tips] 第二版 目 录 一. Nginx 基础知识二. Nginx 安装及调试三. Nginx Rewrite四. Nginx Redirect五. Nginx 目录自动加斜线:六. Nginx Location七. Nginx expires八. Nginx 防盗链九. Nginx 访问控制十. Nginx日志处理十一. Nginx Cache十二. Nginx 负载均衡十三. Nginx简单优化十四. 如何构建高性能的LEMP环境十五. Ngin

Haproxy安装配置及日志输出问题

简介:软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现.LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载.    HAProxy支持两种主要的代理模式:"tcp"也即4层(大多用于邮件服务器.内部协议通信服务器等),和7层(HTTP).在4层模式 下,HAproxy仅在客户端和服务器之间转发双向流量.7层模式下,HAProxy会分析协议,并且能通过允许.拒绝.交换.增加.修改或者删除请求 (r

nginx 配置详解

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用.其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:京东.新浪.网易.腾讯.淘宝等. 一.event模型 传统的基于进程和线程的模型在处理并发连接的时候针对每个连接

你真的了解如何将 Nginx 配置为Web服务器吗

阅读之前,建议先阅读初识 Nginx. 之后,我们来了解一下 Nginx 配置. 抽象来说,将 Nginx 配置为 Web 服务器就是定义处理哪些 URLS 和如何处理这些URLS 对应的请求.具体来说,就是定义一些虚拟服务器(Virtual Servers),控制具有特定 IP 和域名的请求. 更具体的来说, Nginx 通过定义一系列 locations 来控制对 URIS 的选择.每一个 location 定义了对映射到自己的请求的处理场景:返回一个文件或者代理请求,或者根据不同的错误代码