Haproxy

Haproxy

设置转发和代理访问阿里MongoDB云数据库

大数据 空心菜 发表了文章 0 个评论 5575 次浏览 2017-03-09 21:34 来自相关话题

摘要:基于安全原因考虑,阿里云MongoDB云数据库目前只支持从阿里云ECS上访问,无法通过公网直接访问,不方便用户在本地开发环境里直接进行测试,但是开发就是要测试性能,没有办法作为一个运维你必须想办法了,本文介绍能让用户通过公网访问MongoDB云数据库的方 ...查看全部
AliyunMongodb.png


摘要:基于安全原因考虑,阿里云MongoDB云数据库目前只支持从阿里云ECS上访问,无法通过公网直接访问,不方便用户在本地开发环境里直接进行测试,但是开发就是要测试性能,没有办法作为一个运维你必须想办法了,本文介绍能让用户通过公网访问MongoDB云数据库的方案。


环境架构说明
环境说明:
包含公网 + 私网ip的ECS
  • 公网IP地址:121.196.197.64
  • 内网IP地址:10.0.0.110
 MongoDB云数据库
  • 节点1:s-uf6745fa496c28d4.mongodb.rds.aliyuncs.com:3717(Primary,通过ping域名来获取对应的ip,获取到ip地址10.0.0.119,因域名对应的ip可能发生变化,在生产环境切勿直接指定ip,可以直接用域名)
  • 节点2:s-uf624ab1be981c34.mongodb.rds.aliyuncs.com:3717

 
结构示意图如下:
MongodbArch.png

目标:
通过121.196.197.64:27017能访问到10.0.0.119:3717提供的MongoDB云服务。

方案一:Iptables实现
利用iptables的nat机制,可以方便的实现请求转发,首先需要ECS开启包转发的支持
echo 1 > /proc/sys/net/ipv4/ip_forward
配置转发规则
iptables -t nat -A PREROUTING -d 121.196.197.64 -p tcp --dport 27017 -j DNAT --to-destination 10.0.0.119:3717
iptables -t nat -A POSTROUTING -d 10.0.0.119 -p tcp --dport 3717 -j SNAT --to-source 10.0.0.110
此时你就能在任意能连通公网的机器上连接121.196.197.64:27017访问MongoDB云服务,所有的请求都会转发到10.0.0.119:3717上,如果你需要严格限制,只允许你办公区公网ip地址访问的话,添加第一条规则的时候还可以增加一个 -s 参数,限制访问源!

需要注意的是,此时访问121.196.197.64:27017只能以单节点的方式直连,而不能按复制集的方式访问。
mongo --host 121.196.197.64:27017 --authenticationDatabase admin -uroot -pxxoo

方案二:Harpoxy四层代理实现
haproxy支持tcp(四层)、http(七层)2种转发模式,类似于iptables,我们也可以利用haproxy来实现公网访问MongoDB云数据库。

修改/etc/haproxy/haproxy.cfg配置文件内容,根据默认的配置文件稍作修改,主要配置tcp转发模式、前端、后端服务的地址信息。(haproxy版本为1.5.4)
global
log 127.0.0.1 local2

chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon

# turn on stats unix socket
stats socket /var/lib/haproxy/stats

defaults
# 使用tcp转发模式
mode tcp
log global
option dontlognull
option http-server-close
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000

# 前端地址信息, 121.196.197.64:27017
frontend main 121.196.197.64:27017
default_backend app

# 后端地址信息,10.0.0.119:3717
backend app
balance roundrobin
server app1 10.0.0.119:3717 check
启动haproxy
haproxy -f /etc/haproxy/haproxy.cfg
此时你就能在任意能连通公网的机器上连接121.196.197.64:27017访问MongoDB云服务,所有的请求都会转发到10.0.0.119:3717上。

需要注意的是,此时访问121.196.197.64:27017只能以单节点的方式直连,也不能按复制集的方式访问。
mongo --host 121.196.197.64:27017 --authenticationDatabase admin -uroot -pxxoo
以上服务同样适用于RDS、Redis云数据库,但切记仅能用于测试开发环境,生产环境请做好安全心里准备!

Centos7下使用Harpoxy负载均衡Apache

运维 koyo 发表了文章 5 个评论 4138 次浏览 2016-11-21 18:41 来自相关话题

  什么是HAProxy HAProxy是一个免费的,快速和可靠的解决方案提供高可用性、负载均衡,并为TCP代理和基于http的应用程序。特别适合高流量网站和高并发网站。   ...查看全部
ha-proxy_load-balancing.png

 


什么是HAProxy


HAProxy是一个免费的,快速和可靠的解决方案提供高可用性、负载均衡,并为TCP代理和基于http的应用程序。特别适合高流量网站和高并发网站。
 


环境说明


操作系统:Centos 7
主机分布:1 haproxy server, 3 client 
IP & Hostname
192.168.0.50    server.rootworld.in 
192.168.0.51 web1.rootworld.in
192.168.0.52 web2.rootworld.in
192.168.0.53 web3.rootworld.in

1、在客户端机器上安装web服务器
 
WEB1
[root@web1 ~]# yum install httpd -y
[root@web1 ~]# systemctl enable httpd.service
[root@web1 ~]# systemctl start httpd.service

WEB2
[root@web2 ~]# yum install httpd -y
[root@web2 ~]# systemctl enable httpd.service
[root@web2 ~]# systemctl start httpd.service

WEB3
[root@web3 ~]# yum install httpd -y
[root@web3 ~]# systemctl enable httpd.service
[root@web3 ~]# systemctl start httpd.service

2、检查您的web服务器工作正常。
 
3、安装HAProxy Server.
[root@server ~]# yum install haproxy openssl-devel -y 

 4、配置HAPorxy的主配置文件/etc/haproxy/haproxy.cfg,修改log日志位置
[root@server ~]# vim /etc/haproxy/haproxy.cfg 
logconf.PNG

 
5、配置启动UDP syslog reception 在/etc/rsyslog.conf配置文件中,并且把Haproxy日志单独放到/var/log目录下。
[root@server ~]# vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
rsyslogconf.PNG

 
6、在/etc/rsyslog.d/目录下配置haproxy.conf文件配置单独的log文件
[root@server ~]# vim /etc/rsyslog.d/haproxy.conf
local2.* /var/log/haproxy.log
logro.PNG

 
7、重启syslog服务,更新配置
[root@server ~]# service rsyslog restart

8、按照需求配置/etc/haproxy/haproxy.cfg文件
[root@server ~]# vim /etc/haproxy/haproxy.cfg

9、为均衡器在/etc/haproxy/haproxy.cfg配置前端和后端
# Configuration for HTTP site

listen server 192.168.0.50:80
bind *:80
default_backend LBbackend


backend LBbackend
mode http
server web1 192.168.0.51:80 check
server web1 192.168.0.52:80 check
server web1 192.168.0.53:80 check
stats enable
stats hide-version
stats uri /stats
stats realm Haproxy\ Statistics
stats auth admin:redhat
balance roundrobin
option httpchk
option httpclose
option forwardfor
cookie LB insert
haconfig.PNG

 
10、重启HAProxy服务并启用
[root@server ~]# systemctl enable haproxy.service
[root@server ~]# systemctl restart haproxy.service
[root@server ~]# systemctl status haproxy.service
harestart.PNG

 
11、验证HAProxy负载均衡器
http://192.168.0.50/
web1.PNG

web2.PNG

web3.PNG

 
12、打开HAProxy监控服务面板
 http://192.168.0.50/stats
hagui.PNG

安装配置Haproxy代理MySQL Galera集群

数据库 koyo 发表了文章 0 个评论 5532 次浏览 2016-07-02 13:51 来自相关话题

这篇文章,我讲介绍如何为MariaDB Galera 集群添加负载均衡,大致步骤如下: 确认所有Galera节点作为一个单一集群运行(所有节点都是主节点而且相互同步) []安装Haproxy(你可以安装到独立的服务器或者应用服务器)[/ ...查看全部
这篇文章,我讲介绍如何为MariaDB Galera 集群添加负载均衡,大致步骤如下:
确认所有Galera节点作为一个单一集群运行(所有节点都是主节点而且相互同步)
    []安装Haproxy(你可以安装到独立的服务器或者应用服务器)[/][]配置集群监控检测脚本,用于检测每个backend server服务器健康[/][]配置Haproxy统计页面[/][]将应用程序指向Haproxy[/]

 
大致架构图如下:
galera_haproxy_secaserver.png

 
配置集群检测脚本
**本节中所描述的步骤应该是所有数据库节点上执行,除非另有指定。
 
1、首先,我们需要配置后端健康检查报告。 我们将使用现有的Percona的clustercheck脚本 。 拿到脚本,并把它放在/usr/local/bin目录运行以下命令:
$ git clone https://github.com/olafz/percona-clustercheck
$ cp percona-clustercheck/clustercheck /usr/local/bin

 2、 clustercheck脚本执行通过监控MySQL的几个变量/状态 Galera节点上定期检查。 它会产生一个相应的HTTP返回代码一个简单的HTML输出(无论是503 - 服务不可用或200 - OK)。 为了让事情更容易为HAProxy的触发脚本,并获得后端的最新状态,我们必须让它侦听的端口。 我们可以使用xinetd打开脚本到一个服务进程,并使其听一个自定义的端口,在这种情况下,我将使用9200。
 
创建一个名为/etc/xinet.d/mysqlchk的新文件,并添加以下几行:
# default: on
# description: mysqlchk
service mysqlchk
{
disable = no
flags = REUSE
socket_type = stream
port = 9200
wait = no
user = nobody
server = /usr/local/bin/clustercheck
log_on_failure += USERID
only_from = 0.0.0.0/0
per_source = UNLIMITED
}

3、添加Mysqlchk服务到xinetd
echo 'mysqlchk      9200/tcp    # MySQL check' >> /etc/services

4、默认情况下,该脚本将使用MySQL用户名为“clustercheckuser”,密码为“clustercheckpassword!”。 我们需要确保这个MySQL用户与对应的密码存在的脚本将能够执行健康检查之前。 运行下面的DB节点之一(Galera应该复制该语句到其他节点)DDL语句:
mysql> GRANT PROCESS ON [i].[/i] TO 'clustercheckuser'@'localhost' IDENTIFIED BY 'clustercheckpassword!';
mysql> FLUSH PRIVILEGES;
你可以改变clustercheck script的32,33行,这篇文章我们使用默认用户名和密码。
 
5、验证脚本返回一个正确的值
$ /usr/local/bin/clustercheck > /dev/null
$ echo $?
0
如果DB节点在已同步,你应该得到0,否则1应该是输出。 后端健康检查配置。
 
安装Haproxy
1、最简单的安装方法就是使用(yum/apt)包管理器,然而,强烈建议使用上HAProxy的网站提供的最新版本。无论哪种方式,我下面都会介绍到。
 
A)如果您选择通过软件包管理器安装HAProxy的:
$ yum install haproxy # Redhat/CentOS
$ sudo apt-get install haproxy # Debian/Ubuntu

B)通过Haproxy官网下载源码
$ yum install php-curl gcc make # Redhat/CentOS
$ apt-get install php5-curl gcc make # Debian/Ubuntu
$ wget http://www.haproxy.org/download/1.5/src/
$ tar xvzfz
$ cd
$ make TARGET=linux26
$ cp -f haproxy /usr/sbin/haproxy
从源代码(选项B)安装带有没有初始化脚本。所以你需要手动的通过命令行启动。
 
配置HAproxy
现在,我们已经安装了HAProxy的。 我们需要将其配置为在端口3307监听MySQL服务,并执行后端健康检查。 在/etc/haproxy/haproxy.cfg,确保以下行存在:
global
pidfile /var/run/haproxy.pid
daemon
user haproxy
group haproxy
stats socket /var/run/haproxy.socket user haproxy group haproxy mode 600 level admin

maxconn 8192
spread-checks 3
quiet
defaults
mode tcp
option dontlognull
option tcp-smart-accept
option tcp-smart-connect
retries 3
option redispatch
maxconn 8192
timeout check 3500ms
timeout queue 3500ms
timeout connect 3500ms
timeout client 10800s
timeout server 10800s

userlist STATSUSERS
group admin users admin
user admin insecure-password admin
user stats insecure-password yourpassword

listen admin_page 0.0.0.0:9600
mode http
stats enable
stats refresh 60s
stats uri /
acl AuthOkay_ReadOnly http_auth(STATSUSERS)
acl AuthOkay_Admin http_auth_group(STATSUSERS) admin
stats http-request auth realm admin_page unless AuthOkay_ReadOnly

listen mysql_3307
bind *:3307
mode tcp
timeout client 10800s
timeout server 10800s
balance leastconn
option httpchk
option allbackups
default-server port 9200 inter 2s downinter 5s rise 3 fall 2 slowstart 60s maxconn 64 maxqueue 128 weight 100
server db1 10.0.0.187:3306 check
server db2 10.0.0.188:3306 check
server db3 10.0.0.189:3306 check
现在开机启用该服务,让其工作。
 
RHEL/CentOS 6:
$ chkconfig haproxy on # RHEL6
$ service haproxy start # RHEL6

Ubuntu 14.04 and lower, Debian 7 and lower:
$ update-rc.d haproxy defaults
$ sudo service haproxy start

RHEL/CentOS 7, Debian 8, Ubuntu 15.04:
$ systemctl enable haproxy
$ systemctl start haproxy

 
验证Haproxy端口监听是否正常:
sudo netstat -tulpn | grep haproxy
tcp 0 0 0.0.0.0:9600 0.0.0.0:* LISTEN 370/haproxy
tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 370/haproxy

 3307是MySQL的负载平衡端口,而9600是HAProxy的统计页面。 您可以登录访问http检查状态:// haproxy_ip_address:9600 /,以用户名“管理员”和密码登录“你的密码”作为配置的内部haproxy.cfg。 你应该看到类似下面的内容:
haproxyStatus.png

现在你可以把你的应用程序或者Mysql的客户端执行harproxy代理的3307端口,用于Mysql的负载均衡和故障自动转移。

负载均衡软件和Web应用服务器详解

运维 Rock 发表了文章 0 个评论 3261 次浏览 2016-04-03 23:10 来自相关话题

为什么我们使用软件负载均衡​ []海量并发下分散请求,减轻服务压力,分布式部署,容灾,解决单点问题,端口复用节约服务器资源[/][]硬件负载均衡成本较高,设备维护较为复杂,稳定性高[/][]nginx haproxy lvs(pira ...查看全部


为什么我们使用软件负载均衡​


    []海量并发下分散请求,减轻服务压力,分布式部署,容灾,解决单点问题,端口复用节约服务器资源[/][]硬件负载均衡成本较高,设备维护较为复杂,稳定性高[/][]nginx haproxy lvs(piranha)[/][]php+fastcgi,modjk+tomcat [/]


软件负责均衡原理


负载均衡分为七层和四层负载均衡,是由通信协议决定均衡模式,如SSL 443是TCP模式,http请求是应用层模式,然后按照一定的调度算法把请求调度到相应的节点
    []在统一接入层进行请求调度均衡[/][]按照服务器性能调度请求,权值调整[/][]业务层逻辑解耦,按照URL分发[/][]IP层,按照网段分发[/][]容灾 [/][]自适应性调度(nginx+fasctcgi,modjk+apache)[/]

注意事项:
    []服务是否长连接 [/][]是否会话黏贴 [/][]32位系统和64位系统网络中断问题[/][]安全相关  [/][]维护成本 [/][]节点生存检测 [/][]算法选择[/][]避免跨IDC 跨网段 跨楼层[/]


负责均衡软件特点


LVS特点:
    []抗负载能力强,使用IP负载均衡技术,只做分发,所以LVS本身并没有多少流量产生;[/][]稳定性、可靠性好,自身有完美的热备方案;(如:LVS+Keepalived)[/][]应用范围比较广,可以对所有应用做负载均衡;[/][]不支持正则处理,不能做动静分离。 [/]

常用四种算法:
    []rr:轮叫,轮流分配到后端服务器;[/][]wrr:权重轮叫,根据后端服务器负载情况来分配;[/][]lc:最小连接,分配已建立连接最少的服务器上;[/][]wlc:权重最小连接,根据后端服务器处理能力来分配。[/]

可以采用ipvsadm –p(persistence)来保持session,默认是300/s 。
 
Nginx特点:
    []工作在7层,可以对做正则规则处理;(如:针对域名、目录进行分流)[/][]配置简单,能ping通就能进行负载功能,可以通过端口检测后端服务器状态,不支持url检测;[/][]抗高并发,采用epoll网络模型处理客户请求;[/][]支持HTTP、TCP和EMail,应用范围比较少;[/][]nginx主要是HTTP和反向代理服务器,低系统资源消耗。[/]

常用四种算法:
    []RR:(默认)轮询,轮流分配到后端服务器;[/][]weight:根据后端服务器性能分配;[/][]ip_hash:每个请求按访问ip的hash结果进行分配,并发小时合适,解决session问题;[/][]fair:(扩展策略),默认不被编译nginx内核,根据后端服务器响应时间判断负载情况,选择最轻的进行处理。 [/]

 
Haproxy特点:
    []支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;[/][]配置简单,支持url检测后端服务器状态;[/][]仅做负载均衡软件使用,在高并发情况下,处理速度高于nginx;[/][]TCP层多用于Mysql从(读)服务器负载均衡。 [/]

常用四种算法:
    []roundrobin:轮询,轮流分配到后端服务器;[/][]static-rr:根据后端服务器性能分配;[/][]leastconn:最小连接者优先处理;[/][]source:根据请求源IP,与Nginx的IP_Hash类似。[/]


为什么要解决session会话


负载均衡环境下,每个用户都有可能不固定的访问后端服务器,在有些应用情况下,是必须要求在一定时间内同一用户访问的所有请求都分配给后端同一台服务器去处理,例如:电子商务网站,用户注册页面等,一刷新页面,就会分配到后端的另一台服务器上,那刚才的页面上的信息也都没了,这种情况下,分配同一台服务器处理请求是至关重要的!


Web应用服务器对比


主流应用服务器:
    []Apache后台服务器(主要处理php及一些功能请求 如:中文url)[/][]Nginx前端服务器(利用它占用系统资源少得优势来处理静态页面 大量请求)[/][]Lighttpd 图片服务器[/]

总体来说,随着nginx功能得完善将使他成为今后web server的主流。
三种服务器对比:
db.png

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

运维 push 发表了文章 0 个评论 4116 次浏览 2016-04-01 00:21 来自相关话题

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

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


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


这里有一些介绍HTTP/2益处的文章-而且我鼓励你去读一读。下面我将重点介绍我认为比较重要的几点。
HTTP/2的主要优势:
    []使用二进制数据(不像HTTP/1.1一样使用明文)而且它使用了header数据压缩。不用再为header和cookie的大小而担心了。[/][]它是完全多元化的,为了提升并发性可以使用一个连接加载多种资源。你的网站性能在需要引入多种资源的时候会表现得更好,因为现在它们可以在一次TCP连接中全部加载,在非阻塞模式中。域名切分和资源级联变成了反面模式。简单来说:你的网站加载会更快。 [/][]它允许服务器提前推送请求到客户端的缓存(目前Ngnix不支持这个特性) [/][]它使用新的ALPN扩展,那将允许更快地加密连接。这个加密协议在初始化连接的阶段是可用的。[/]
今天我可以使用它吗?
use.png
是的,你可以。正如你所看到的在Can I Use上的服务那样,所有现代浏览器现在都支持HTTP/2,这里包括IE11和Edge。唯一的例外是移动端的Opera Mini和Android浏览器不支持它。此外,下面描述的配置都会确保客户端在不支持HTTP/2的情况下,退回到HTTP/1.1。这非常重要:你的网站应该为那些老版本浏览器或搜索引擎爬虫提供访问支持。

安装

我会在CentOS 7下安装,如果你使用其他Linux发布版本,你可以简单调整下代码。你需要做的:
    []站点能跑通SSL。如果你还没有虚拟证书的话,你需要使用虚拟证书(简单)。[/][]Ngnix 1.9.5 或更新版本( 简单 )。[/][]安装配置好OpenSSL的HAPorxy 1.6或更新版( 需要一些技巧 )。[/][]良好的HAPRoxy和Ngnix配置( 简单 )。[/][]确认你是否已经在使用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生成虚拟证书,你可以使用下面的命令:
# Generate all keys and cefiticates in /etc/ssl/ directory
openssl genrsa -out /etc/ssl/dummy.key 2048
openssl req -new -key /etc/ssl/dummy.key -out /etc/ssl/dummy.csr -subj "/C=GB/L=London/O=Company Ltd/CN=haproxy"
openssl x509 -req -days 3650 -in /etc/ssl/dummy.csr -signkey /etc/ssl/dummy.key -out /etc/ssl/dummy.crt
# Concatenate certificate and key into .pem format, compatible with HAProxy
cat /etc/ssl/dummy.crt /etc/ssl/dummy.key > /etc/ssl/dummy.pem
我们需要在下一步的配置中使用生成的证书和秘钥。
 
2.Nginx 安装
在CentOS 7上安装Ngnix 1.9十分简单。唯一需要做的就是使用主线版YUM源,而不是稳定版。就像Nginx.org page上描述的那样,把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提示部分
nginx.png

haproxy.png

如果你想看看使用这些Docker镜像和上述配置的真实的产品工程,打开https://PrototypeBrewery.io 。Prototype Brewery是我们的产品,一个计划和构建交互式web项目的原型工具。打开看看吧,我们已经在使用HTTP/2了(别忘了注册)。


总结


正如你看到的,迁移到HTTP/2真的很简单,你今天就能做掉。 没有什么理由让你再等下去了,主流浏览器都已经支持它了。而且即使回迁到HTTP/1.1上你仍然是安全的。
分享阅读原文:http://m12.io/blog/http-2-with-haproxy-and-nginx-guide 
中文原文:http://www.oschina.net/translate/haproxy-nginx-http-2

设置转发和代理访问阿里MongoDB云数据库

大数据 空心菜 发表了文章 0 个评论 5575 次浏览 2017-03-09 21:34 来自相关话题

摘要:基于安全原因考虑,阿里云MongoDB云数据库目前只支持从阿里云ECS上访问,无法通过公网直接访问,不方便用户在本地开发环境里直接进行测试,但是开发就是要测试性能,没有办法作为一个运维你必须想办法了,本文介绍能让用户通过公网访问MongoDB云数据库的方 ...查看全部
AliyunMongodb.png


摘要:基于安全原因考虑,阿里云MongoDB云数据库目前只支持从阿里云ECS上访问,无法通过公网直接访问,不方便用户在本地开发环境里直接进行测试,但是开发就是要测试性能,没有办法作为一个运维你必须想办法了,本文介绍能让用户通过公网访问MongoDB云数据库的方案。


环境架构说明
环境说明:
包含公网 + 私网ip的ECS
  • 公网IP地址:121.196.197.64
  • 内网IP地址:10.0.0.110
 MongoDB云数据库
  • 节点1:s-uf6745fa496c28d4.mongodb.rds.aliyuncs.com:3717(Primary,通过ping域名来获取对应的ip,获取到ip地址10.0.0.119,因域名对应的ip可能发生变化,在生产环境切勿直接指定ip,可以直接用域名)
  • 节点2:s-uf624ab1be981c34.mongodb.rds.aliyuncs.com:3717

 
结构示意图如下:
MongodbArch.png

目标:
通过121.196.197.64:27017能访问到10.0.0.119:3717提供的MongoDB云服务。

方案一:Iptables实现
利用iptables的nat机制,可以方便的实现请求转发,首先需要ECS开启包转发的支持
echo 1 > /proc/sys/net/ipv4/ip_forward
配置转发规则
iptables -t nat -A PREROUTING -d 121.196.197.64 -p tcp --dport 27017 -j DNAT --to-destination 10.0.0.119:3717
iptables -t nat -A POSTROUTING -d 10.0.0.119 -p tcp --dport 3717 -j SNAT --to-source 10.0.0.110
此时你就能在任意能连通公网的机器上连接121.196.197.64:27017访问MongoDB云服务,所有的请求都会转发到10.0.0.119:3717上,如果你需要严格限制,只允许你办公区公网ip地址访问的话,添加第一条规则的时候还可以增加一个 -s 参数,限制访问源!

需要注意的是,此时访问121.196.197.64:27017只能以单节点的方式直连,而不能按复制集的方式访问。
mongo --host 121.196.197.64:27017 --authenticationDatabase admin -uroot -pxxoo

方案二:Harpoxy四层代理实现
haproxy支持tcp(四层)、http(七层)2种转发模式,类似于iptables,我们也可以利用haproxy来实现公网访问MongoDB云数据库。

修改/etc/haproxy/haproxy.cfg配置文件内容,根据默认的配置文件稍作修改,主要配置tcp转发模式、前端、后端服务的地址信息。(haproxy版本为1.5.4)
global
log 127.0.0.1 local2

chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon

# turn on stats unix socket
stats socket /var/lib/haproxy/stats

defaults
# 使用tcp转发模式
mode tcp
log global
option dontlognull
option http-server-close
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000

# 前端地址信息, 121.196.197.64:27017
frontend main 121.196.197.64:27017
default_backend app

# 后端地址信息,10.0.0.119:3717
backend app
balance roundrobin
server app1 10.0.0.119:3717 check
启动haproxy
haproxy -f /etc/haproxy/haproxy.cfg
此时你就能在任意能连通公网的机器上连接121.196.197.64:27017访问MongoDB云服务,所有的请求都会转发到10.0.0.119:3717上。

需要注意的是,此时访问121.196.197.64:27017只能以单节点的方式直连,也不能按复制集的方式访问。
mongo --host 121.196.197.64:27017 --authenticationDatabase admin -uroot -pxxoo
以上服务同样适用于RDS、Redis云数据库,但切记仅能用于测试开发环境,生产环境请做好安全心里准备!

Centos7下使用Harpoxy负载均衡Apache

运维 koyo 发表了文章 5 个评论 4138 次浏览 2016-11-21 18:41 来自相关话题

  什么是HAProxy HAProxy是一个免费的,快速和可靠的解决方案提供高可用性、负载均衡,并为TCP代理和基于http的应用程序。特别适合高流量网站和高并发网站。   ...查看全部
ha-proxy_load-balancing.png

 


什么是HAProxy


HAProxy是一个免费的,快速和可靠的解决方案提供高可用性、负载均衡,并为TCP代理和基于http的应用程序。特别适合高流量网站和高并发网站。
 


环境说明


操作系统:Centos 7
主机分布:1 haproxy server, 3 client 
IP & Hostname
192.168.0.50    server.rootworld.in 
192.168.0.51 web1.rootworld.in
192.168.0.52 web2.rootworld.in
192.168.0.53 web3.rootworld.in

1、在客户端机器上安装web服务器
 
WEB1
[root@web1 ~]# yum install httpd -y
[root@web1 ~]# systemctl enable httpd.service
[root@web1 ~]# systemctl start httpd.service

WEB2
[root@web2 ~]# yum install httpd -y
[root@web2 ~]# systemctl enable httpd.service
[root@web2 ~]# systemctl start httpd.service

WEB3
[root@web3 ~]# yum install httpd -y
[root@web3 ~]# systemctl enable httpd.service
[root@web3 ~]# systemctl start httpd.service

2、检查您的web服务器工作正常。
 
3、安装HAProxy Server.
[root@server ~]# yum install haproxy openssl-devel -y 

 4、配置HAPorxy的主配置文件/etc/haproxy/haproxy.cfg,修改log日志位置
[root@server ~]# vim /etc/haproxy/haproxy.cfg 
logconf.PNG

 
5、配置启动UDP syslog reception 在/etc/rsyslog.conf配置文件中,并且把Haproxy日志单独放到/var/log目录下。
[root@server ~]# vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
rsyslogconf.PNG

 
6、在/etc/rsyslog.d/目录下配置haproxy.conf文件配置单独的log文件
[root@server ~]# vim /etc/rsyslog.d/haproxy.conf
local2.* /var/log/haproxy.log
logro.PNG

 
7、重启syslog服务,更新配置
[root@server ~]# service rsyslog restart

8、按照需求配置/etc/haproxy/haproxy.cfg文件
[root@server ~]# vim /etc/haproxy/haproxy.cfg

9、为均衡器在/etc/haproxy/haproxy.cfg配置前端和后端
# Configuration for HTTP site

listen server 192.168.0.50:80
bind *:80
default_backend LBbackend


backend LBbackend
mode http
server web1 192.168.0.51:80 check
server web1 192.168.0.52:80 check
server web1 192.168.0.53:80 check
stats enable
stats hide-version
stats uri /stats
stats realm Haproxy\ Statistics
stats auth admin:redhat
balance roundrobin
option httpchk
option httpclose
option forwardfor
cookie LB insert
haconfig.PNG

 
10、重启HAProxy服务并启用
[root@server ~]# systemctl enable haproxy.service
[root@server ~]# systemctl restart haproxy.service
[root@server ~]# systemctl status haproxy.service
harestart.PNG

 
11、验证HAProxy负载均衡器
http://192.168.0.50/
web1.PNG

web2.PNG

web3.PNG

 
12、打开HAProxy监控服务面板
 http://192.168.0.50/stats
hagui.PNG

安装配置Haproxy代理MySQL Galera集群

数据库 koyo 发表了文章 0 个评论 5532 次浏览 2016-07-02 13:51 来自相关话题

这篇文章,我讲介绍如何为MariaDB Galera 集群添加负载均衡,大致步骤如下: 确认所有Galera节点作为一个单一集群运行(所有节点都是主节点而且相互同步) []安装Haproxy(你可以安装到独立的服务器或者应用服务器)[/ ...查看全部
这篇文章,我讲介绍如何为MariaDB Galera 集群添加负载均衡,大致步骤如下:
确认所有Galera节点作为一个单一集群运行(所有节点都是主节点而且相互同步)
    []安装Haproxy(你可以安装到独立的服务器或者应用服务器)[/][]配置集群监控检测脚本,用于检测每个backend server服务器健康[/][]配置Haproxy统计页面[/][]将应用程序指向Haproxy[/]

 
大致架构图如下:
galera_haproxy_secaserver.png

 
配置集群检测脚本
**本节中所描述的步骤应该是所有数据库节点上执行,除非另有指定。
 
1、首先,我们需要配置后端健康检查报告。 我们将使用现有的Percona的clustercheck脚本 。 拿到脚本,并把它放在/usr/local/bin目录运行以下命令:
$ git clone https://github.com/olafz/percona-clustercheck
$ cp percona-clustercheck/clustercheck /usr/local/bin

 2、 clustercheck脚本执行通过监控MySQL的几个变量/状态 Galera节点上定期检查。 它会产生一个相应的HTTP返回代码一个简单的HTML输出(无论是503 - 服务不可用或200 - OK)。 为了让事情更容易为HAProxy的触发脚本,并获得后端的最新状态,我们必须让它侦听的端口。 我们可以使用xinetd打开脚本到一个服务进程,并使其听一个自定义的端口,在这种情况下,我将使用9200。
 
创建一个名为/etc/xinet.d/mysqlchk的新文件,并添加以下几行:
# default: on
# description: mysqlchk
service mysqlchk
{
disable = no
flags = REUSE
socket_type = stream
port = 9200
wait = no
user = nobody
server = /usr/local/bin/clustercheck
log_on_failure += USERID
only_from = 0.0.0.0/0
per_source = UNLIMITED
}

3、添加Mysqlchk服务到xinetd
echo 'mysqlchk      9200/tcp    # MySQL check' >> /etc/services

4、默认情况下,该脚本将使用MySQL用户名为“clustercheckuser”,密码为“clustercheckpassword!”。 我们需要确保这个MySQL用户与对应的密码存在的脚本将能够执行健康检查之前。 运行下面的DB节点之一(Galera应该复制该语句到其他节点)DDL语句:
mysql> GRANT PROCESS ON [i].[/i] TO 'clustercheckuser'@'localhost' IDENTIFIED BY 'clustercheckpassword!';
mysql> FLUSH PRIVILEGES;
你可以改变clustercheck script的32,33行,这篇文章我们使用默认用户名和密码。
 
5、验证脚本返回一个正确的值
$ /usr/local/bin/clustercheck > /dev/null
$ echo $?
0
如果DB节点在已同步,你应该得到0,否则1应该是输出。 后端健康检查配置。
 
安装Haproxy
1、最简单的安装方法就是使用(yum/apt)包管理器,然而,强烈建议使用上HAProxy的网站提供的最新版本。无论哪种方式,我下面都会介绍到。
 
A)如果您选择通过软件包管理器安装HAProxy的:
$ yum install haproxy # Redhat/CentOS
$ sudo apt-get install haproxy # Debian/Ubuntu

B)通过Haproxy官网下载源码
$ yum install php-curl gcc make # Redhat/CentOS
$ apt-get install php5-curl gcc make # Debian/Ubuntu
$ wget http://www.haproxy.org/download/1.5/src/
$ tar xvzfz
$ cd
$ make TARGET=linux26
$ cp -f haproxy /usr/sbin/haproxy
从源代码(选项B)安装带有没有初始化脚本。所以你需要手动的通过命令行启动。
 
配置HAproxy
现在,我们已经安装了HAProxy的。 我们需要将其配置为在端口3307监听MySQL服务,并执行后端健康检查。 在/etc/haproxy/haproxy.cfg,确保以下行存在:
global
pidfile /var/run/haproxy.pid
daemon
user haproxy
group haproxy
stats socket /var/run/haproxy.socket user haproxy group haproxy mode 600 level admin

maxconn 8192
spread-checks 3
quiet
defaults
mode tcp
option dontlognull
option tcp-smart-accept
option tcp-smart-connect
retries 3
option redispatch
maxconn 8192
timeout check 3500ms
timeout queue 3500ms
timeout connect 3500ms
timeout client 10800s
timeout server 10800s

userlist STATSUSERS
group admin users admin
user admin insecure-password admin
user stats insecure-password yourpassword

listen admin_page 0.0.0.0:9600
mode http
stats enable
stats refresh 60s
stats uri /
acl AuthOkay_ReadOnly http_auth(STATSUSERS)
acl AuthOkay_Admin http_auth_group(STATSUSERS) admin
stats http-request auth realm admin_page unless AuthOkay_ReadOnly

listen mysql_3307
bind *:3307
mode tcp
timeout client 10800s
timeout server 10800s
balance leastconn
option httpchk
option allbackups
default-server port 9200 inter 2s downinter 5s rise 3 fall 2 slowstart 60s maxconn 64 maxqueue 128 weight 100
server db1 10.0.0.187:3306 check
server db2 10.0.0.188:3306 check
server db3 10.0.0.189:3306 check
现在开机启用该服务,让其工作。
 
RHEL/CentOS 6:
$ chkconfig haproxy on # RHEL6
$ service haproxy start # RHEL6

Ubuntu 14.04 and lower, Debian 7 and lower:
$ update-rc.d haproxy defaults
$ sudo service haproxy start

RHEL/CentOS 7, Debian 8, Ubuntu 15.04:
$ systemctl enable haproxy
$ systemctl start haproxy

 
验证Haproxy端口监听是否正常:
sudo netstat -tulpn | grep haproxy
tcp 0 0 0.0.0.0:9600 0.0.0.0:* LISTEN 370/haproxy
tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 370/haproxy

 3307是MySQL的负载平衡端口,而9600是HAProxy的统计页面。 您可以登录访问http检查状态:// haproxy_ip_address:9600 /,以用户名“管理员”和密码登录“你的密码”作为配置的内部haproxy.cfg。 你应该看到类似下面的内容:
haproxyStatus.png

现在你可以把你的应用程序或者Mysql的客户端执行harproxy代理的3307端口,用于Mysql的负载均衡和故障自动转移。

负载均衡软件和Web应用服务器详解

运维 Rock 发表了文章 0 个评论 3261 次浏览 2016-04-03 23:10 来自相关话题

为什么我们使用软件负载均衡​ []海量并发下分散请求,减轻服务压力,分布式部署,容灾,解决单点问题,端口复用节约服务器资源[/][]硬件负载均衡成本较高,设备维护较为复杂,稳定性高[/][]nginx haproxy lvs(pira ...查看全部


为什么我们使用软件负载均衡​


    []海量并发下分散请求,减轻服务压力,分布式部署,容灾,解决单点问题,端口复用节约服务器资源[/][]硬件负载均衡成本较高,设备维护较为复杂,稳定性高[/][]nginx haproxy lvs(piranha)[/][]php+fastcgi,modjk+tomcat [/]


软件负责均衡原理


负载均衡分为七层和四层负载均衡,是由通信协议决定均衡模式,如SSL 443是TCP模式,http请求是应用层模式,然后按照一定的调度算法把请求调度到相应的节点
    []在统一接入层进行请求调度均衡[/][]按照服务器性能调度请求,权值调整[/][]业务层逻辑解耦,按照URL分发[/][]IP层,按照网段分发[/][]容灾 [/][]自适应性调度(nginx+fasctcgi,modjk+apache)[/]

注意事项:
    []服务是否长连接 [/][]是否会话黏贴 [/][]32位系统和64位系统网络中断问题[/][]安全相关  [/][]维护成本 [/][]节点生存检测 [/][]算法选择[/][]避免跨IDC 跨网段 跨楼层[/]


负责均衡软件特点


LVS特点:
    []抗负载能力强,使用IP负载均衡技术,只做分发,所以LVS本身并没有多少流量产生;[/][]稳定性、可靠性好,自身有完美的热备方案;(如:LVS+Keepalived)[/][]应用范围比较广,可以对所有应用做负载均衡;[/][]不支持正则处理,不能做动静分离。 [/]

常用四种算法:
    []rr:轮叫,轮流分配到后端服务器;[/][]wrr:权重轮叫,根据后端服务器负载情况来分配;[/][]lc:最小连接,分配已建立连接最少的服务器上;[/][]wlc:权重最小连接,根据后端服务器处理能力来分配。[/]

可以采用ipvsadm –p(persistence)来保持session,默认是300/s 。
 
Nginx特点:
    []工作在7层,可以对做正则规则处理;(如:针对域名、目录进行分流)[/][]配置简单,能ping通就能进行负载功能,可以通过端口检测后端服务器状态,不支持url检测;[/][]抗高并发,采用epoll网络模型处理客户请求;[/][]支持HTTP、TCP和EMail,应用范围比较少;[/][]nginx主要是HTTP和反向代理服务器,低系统资源消耗。[/]

常用四种算法:
    []RR:(默认)轮询,轮流分配到后端服务器;[/][]weight:根据后端服务器性能分配;[/][]ip_hash:每个请求按访问ip的hash结果进行分配,并发小时合适,解决session问题;[/][]fair:(扩展策略),默认不被编译nginx内核,根据后端服务器响应时间判断负载情况,选择最轻的进行处理。 [/]

 
Haproxy特点:
    []支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;[/][]配置简单,支持url检测后端服务器状态;[/][]仅做负载均衡软件使用,在高并发情况下,处理速度高于nginx;[/][]TCP层多用于Mysql从(读)服务器负载均衡。 [/]

常用四种算法:
    []roundrobin:轮询,轮流分配到后端服务器;[/][]static-rr:根据后端服务器性能分配;[/][]leastconn:最小连接者优先处理;[/][]source:根据请求源IP,与Nginx的IP_Hash类似。[/]


为什么要解决session会话


负载均衡环境下,每个用户都有可能不固定的访问后端服务器,在有些应用情况下,是必须要求在一定时间内同一用户访问的所有请求都分配给后端同一台服务器去处理,例如:电子商务网站,用户注册页面等,一刷新页面,就会分配到后端的另一台服务器上,那刚才的页面上的信息也都没了,这种情况下,分配同一台服务器处理请求是至关重要的!


Web应用服务器对比


主流应用服务器:
    []Apache后台服务器(主要处理php及一些功能请求 如:中文url)[/][]Nginx前端服务器(利用它占用系统资源少得优势来处理静态页面 大量请求)[/][]Lighttpd 图片服务器[/]

总体来说,随着nginx功能得完善将使他成为今后web server的主流。
三种服务器对比:
db.png

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

运维 push 发表了文章 0 个评论 4116 次浏览 2016-04-01 00:21 来自相关话题

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

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


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


这里有一些介绍HTTP/2益处的文章-而且我鼓励你去读一读。下面我将重点介绍我认为比较重要的几点。
HTTP/2的主要优势:
    []使用二进制数据(不像HTTP/1.1一样使用明文)而且它使用了header数据压缩。不用再为header和cookie的大小而担心了。[/][]它是完全多元化的,为了提升并发性可以使用一个连接加载多种资源。你的网站性能在需要引入多种资源的时候会表现得更好,因为现在它们可以在一次TCP连接中全部加载,在非阻塞模式中。域名切分和资源级联变成了反面模式。简单来说:你的网站加载会更快。 [/][]它允许服务器提前推送请求到客户端的缓存(目前Ngnix不支持这个特性) [/][]它使用新的ALPN扩展,那将允许更快地加密连接。这个加密协议在初始化连接的阶段是可用的。[/]
今天我可以使用它吗?
use.png
是的,你可以。正如你所看到的在Can I Use上的服务那样,所有现代浏览器现在都支持HTTP/2,这里包括IE11和Edge。唯一的例外是移动端的Opera Mini和Android浏览器不支持它。此外,下面描述的配置都会确保客户端在不支持HTTP/2的情况下,退回到HTTP/1.1。这非常重要:你的网站应该为那些老版本浏览器或搜索引擎爬虫提供访问支持。

安装

我会在CentOS 7下安装,如果你使用其他Linux发布版本,你可以简单调整下代码。你需要做的:
    []站点能跑通SSL。如果你还没有虚拟证书的话,你需要使用虚拟证书(简单)。[/][]Ngnix 1.9.5 或更新版本( 简单 )。[/][]安装配置好OpenSSL的HAPorxy 1.6或更新版( 需要一些技巧 )。[/][]良好的HAPRoxy和Ngnix配置( 简单 )。[/][]确认你是否已经在使用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生成虚拟证书,你可以使用下面的命令:
# Generate all keys and cefiticates in /etc/ssl/ directory
openssl genrsa -out /etc/ssl/dummy.key 2048
openssl req -new -key /etc/ssl/dummy.key -out /etc/ssl/dummy.csr -subj "/C=GB/L=London/O=Company Ltd/CN=haproxy"
openssl x509 -req -days 3650 -in /etc/ssl/dummy.csr -signkey /etc/ssl/dummy.key -out /etc/ssl/dummy.crt
# Concatenate certificate and key into .pem format, compatible with HAProxy
cat /etc/ssl/dummy.crt /etc/ssl/dummy.key > /etc/ssl/dummy.pem
我们需要在下一步的配置中使用生成的证书和秘钥。
 
2.Nginx 安装
在CentOS 7上安装Ngnix 1.9十分简单。唯一需要做的就是使用主线版YUM源,而不是稳定版。就像Nginx.org page上描述的那样,把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提示部分
nginx.png

haproxy.png

如果你想看看使用这些Docker镜像和上述配置的真实的产品工程,打开https://PrototypeBrewery.io 。Prototype Brewery是我们的产品,一个计划和构建交互式web项目的原型工具。打开看看吧,我们已经在使用HTTP/2了(别忘了注册)。


总结


正如你看到的,迁移到HTTP/2真的很简单,你今天就能做掉。 没有什么理由让你再等下去了,主流浏览器都已经支持它了。而且即使回迁到HTTP/1.1上你仍然是安全的。
分享阅读原文:http://m12.io/blog/http-2-with-haproxy-and-nginx-guide 
中文原文:http://www.oschina.net/translate/haproxy-nginx-http-2
代理服务器知识分享!