Nginx支持TCP代理和负载均衡-stream模块

Nginx支持TCP代理和负载均衡-stream模块,第1张

nginx安装手册

LVS,Nginx和HAProxy负载均衡对比

Nginx支持TCP代理和负载均衡-stream模块

该 ngx_stream_core_module 模块自190版开始提供。默认情况下不构建此模块,应使用 --with-stream 配置参数启用它。

IPv6地址在方括号中指定:

UNIX域套接字使用“ unix: ”前缀指定:

该 ssl 参数允许指定此端口上接受的所有连接都应在SSL模式下工作。

该 udp 参数配置一个侦听套接字以处理数据报(1913)。

的 proxy_protocol 参数(1114)允许指定这个端口上接受的所有连接应使用 代理服务器协议 。

该 listen 指令可以有几个特定于与套接字相关的系统调用的附加参数。

不同的服务器必须监听不同的 address : port 对。

可以将地址指定为域名或IP地址,以及可选端口。如果未指定端口,则使用端口53。以循环方式查询名称服务器。

默认情况下,nginx将在解析时查找IPv4和IPv6地址。如果不需要查找IPv6地址,则 ipv6=off 可以指定参数。

默认情况下,nginx使用响应的TTL值缓存答案。可选 valid 参数允许覆盖它:

该 ngx_stream_core_module 模块支持自1112以来的变量。

启动nginx,发现nginx已经开始监听2018端口了

在客户端通过telnet连接realserver的2018端口:

在realserver上查看网络连接:

可以正常连接

在客户端通过telnet连接nginx所在服务器的2018端口

在nginx机器上查看网络连接

在realserver上查看网络连接

nginx是给做了一个TCP连接的中转。

client和nginx有一个tcp长连接,nginx和realserver有一个tcp长连接,但是client和realserver之间并没有tcp长连接,仅由nginx服务器负责数据中转。

负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

负载均衡根据所采用的设备对象( 软/硬件负载均衡 ),应用的OSI网络层次( 网络层次上的负载均衡 ),及应用的地理结构( 本地/全局负载均衡 )等来分类。根据应用的 OSI 网络层次来分类的两个负载均衡类型。

网络模型图,包含了 OSI 模型及 TCP/IP 模型,两个模型虽然有一点点区别,但主要的目的是一样的,模型图描述了通信是怎么进行的。它解决了实现有效通信所需要的所有过程,并将这些过程划分为逻辑上的层。层可以简单地理解成数据通信需要的步骤。

根据负载均衡所作用在 OSI 模型的位置不同,负载均衡可以大概分为以下几类:

在实际应用中,比较常见的就是四层负载及七层负载。这里也重点说下这两种负载。

所谓四层负载均衡,也就是主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。

所谓七层负载均衡,也称为“内容交换”,也就是主要通过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。

a使用语法:

check interval=milliseconds [fall=count] [rise=count] [timeout=milliseconds] [default_down=true|false] [type=tcp|http|ssl_hello|mysql|ajp] [port=check_port]

b默认值:

如果没有配置参数,默认值是:interval=30000 fall=5 rise=2 timeout=1000 default_down=true type=tcp

c上下文: upstream模块

upstream mogo {

server mogo:8080 weight=4;

server mogo2:8080 weight=4;

check interval=3000 fall=5 rise=2 timeout=1000;

ip_hash;

}

对mogo负载均衡条目中的所有节点,每个3秒检测一次,请求 2 次正常则标记realserver状态为up,如果检测 5 次都失败,则标记 realserver的状态为down,超时时间为1秒

nginx负载均衡策略:

aRR(Round Robin-默认) - 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,会自动剔除。

bip_hash - 客户端ip绑定,每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端的服务器,可以解决session问题。

cleast_conn - 最少连接,下一个请求将被分配到活动连接数量最少的服务器。

在项目运营时,我们都会遇到一个问题,项目需要更新时,我们可能需先暂时关闭下服务器来更新。但这可能会出现一些状况:

1用户还在操作,被强迫终止了(我们可以看日志等没人操作的时候更新,但总可能会有万一)

2不知道的用户可能会想网站是不是被攻击了,降低了对网站的信任程度,从而导致失去部分潜在客户,这点尤其对金融互联网公司不利。

在查了一些资料后,决定采用Tomcat + Nginx + Redis来实现负载均衡和session共享。下面记录下我的实践过程,如有错误不足之处欢迎大神指点,不喜勿喷。

1Nginx简单介绍及开启

Nginx是一款轻量级兼备高性能的Http和反向代理服务器。所谓反向代理就是指在用户发起访问请求,由代理服务器接收,然后将请求转发给正式服务器,并且将正式服务器处理完的数据返回给客户端,此时代理服务器就表现为一个服务器。这么做看起来多经过了一步,稍显麻烦,但实则是好处多多,在下面的demo中我会将其体现出来。

首先我们去Nginx官网下载个Nginx,我这是在自己电脑上,所以当然下载的是windows版本的。下载完成后直接放在某个盘中即可,不需要安装。接下去我们打开cmd,进入nginx的目录下,输入start nginx。

我们可以看到一个窗口一闪而过,这样nginx就已经被开启了,我们在任务管理器中可以找到它的进程。

现在我们在浏览器中输入localhost。可以看到出现一个页面,虽然简陋了点,但这确确实实就是nginx的欢迎页面,就类似tomcat刚启动完成的locahost:8080的欢迎页面。

2使用Nginx实现反向代理

现在我们搭建一个基于SpringMVC +Spring + Mybaties框架的maven项目,搭建过程不加以赘述。功能很简单,就是能跳转到一个页面就行了,当然也可以使用别的框架。

运行demo,我这tomcat端口是8080,在浏览器输入localhost:8080,出现我们的页面。

这时我们还是直接访问tomcat服务器的,现在我想通过nginx访问tomcat,即输入localhost就能显示我们demo的页面。

这就要我们去修改nginx的核心配置文件,在其目录下的conf文件夹下的nginxconf文件,那么首先我们就要了解该文件中一些节点的作用。

worker_processes:工作进程个数,可配置多个

worker_connections:单个进程最大连接数

server:每一个server相当于一个代理服务器

lister:监听端口,默认80

server_name:当前服务的域名,可以有多个,用空格分隔(我们是本地所以是localhost)

location:表示匹配的路径,这时配置了/表示所有请求都被匹配到这里

index:当没有指定主页时,默认会选择这个指定的文件,可多个,空格分隔

proxy_pass:请求转向自定义的服务器列表

upstream name{ }:服务器集群名称

知道了节点作用后,我们就知道我们需要修改的文件中的server部分,这是它原有的代码,我删除了它注释部分。现在我们就能明白为什么输入localhost,

它访问的是它欢迎页面即indexhtml。

下面我们对这段代码进行一些小小修改。就是将请求转向我们定义的服务器。

随后在cmd中输入命令nginx -s reload即可重启nginx。

重启后,我们再输入localhost,可以看到跳转到的页面是我们demo的。

至此,反向代理已完成,这样所有请求都需经过代理服务器才能访问到正式服务器,某种程度上可以保护网站安全。

3使用Nginx实现负载均衡

负载均衡即是代理服务器将接收的请求均衡的分发到各服务器中。

负载均衡的优势在访问量少或并发小的时候可能并不明显,且不说淘宝双11、铁道部抢票这种级别的访问量、高并发,就是一般网站的抢购活动时,也会给服务器造成很大压力,可能会造成服务器崩溃。而负载均衡可以很明显的减少甚至消除这种情况的出现,下面我们说说实现方法。

首先我们再开启一个tomcat服务器,这里区分一下就叫tomcat2吧,原先的叫tomcat1。将tomcat1上的项目,拷贝到tomcat2上,稍微修改下页面上的文字以便等下区分我们的请求被分发到了哪个tomcat上。tomcat2端口我这里为8081。在浏览器中输入localhost:8081。

服务器准备好了,我们要在server外部定义个服务器集群,即用到了上文中提到的upstream 标签。服务器集群名字取为test。

同时我们需要再修改下server,将定向的路径转到问你服务器集群上。

重启下nginx,在浏览器输入localhost,再多刷新几次,可以看到两个页面在来回切换。

这样即实现了负债均衡。假设我们服务器在运行过程中,其中一个tomcat挂了,仍然还有另一个可以访问。更新的时候也能先关闭只其中一个,轮流更新。另外还能有效缓解服务器压力,是不是很棒呢

当然,以上nginx的配置是简单化的,实际上我们还可以配置nginx对静态资源的缓存等等,在此就不多加演示了。

4小结

花了好些时间,总算陆陆续续要写好了,在此小结一下。

nginx作为一个反向代理服务器,能缓存我们项目的静态文件,并实现反向代理与均衡负载,可以有效减少服务器压力,即使项目不大,也可以使用。

大家另外应该都还发现了个问题,虽然这样请求能分别请求到两个tomcat上,如果是一般不需身份校检的或什么认证的方法尚可,但如果出现这类情况:

我们在tomcat1上进行了登录,这时用户session当然是存在tomcat1上的,而这时进入个人中心的请求请求到tomcat2上了,这时就会出现问题了。tomcat2会告诉你还未登录,这显然不是我们想看到的。

这就涉及到session共享了,如何让两个服务器上的session共用。我这里放到下次再说,作为码农比较忙,可能要过个好几天。另外我将这次的demo源码上传了,下次还要用,nginx配置就不传了,大家自己多动手试验。

可以利用Nginx反向代理实现负载均衡

详细配置可参考(百度搜的)

http://wwwphp100com/html/program/nginx/2013/0905/5525html

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » Nginx支持TCP代理和负载均衡-stream模块

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情