nginx高负载均衡服务器
来源:互联网 发布:workbanch 导出mysql 编辑:程序博客网 时间:2024/06/01 07:30
1.1.1 简介
Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
其特点是占有内存少,并发能力强,能够支持高达50000个并发连接响应。这归功于它选择了epoll and kqueue作为开发模型(socket数量不限制)(Apache采用的select开发模型)。它处理请求是异步非阻塞,在高并发下保持低资源低消耗高性能。非常稳定,bug极少。Apache使用处理每个连接都需要一个进程,其并发性能不是很好。而Nginx使用多路复用的技术,让一 个进程处理多个连接,所以并发性能比较好。
成为事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国使用nginx网站用户有:新浪、网易、腾讯、京东、淘宝等。
l Nginx是一个高性能的HTTP和方向代理服务器
l 采用C语言编写
l 支持的操作系统众多,windows、linux、MacOSX
l 安全性高,外界只能访问nginx所在服务器,nginx将请求转发内部服务器。调用后,返回调用的结果
l 可实现负载均衡
l Rewrite功能强大
电商、互联网架构大部分都采用Nginx+Tomcat的架构。
官网地址:http://nginx.org/en/download.html
1.1.2 nginx和Apache、IIS等比较
根据W3Techs公布的数据,Nginx目前已经在Web服务器领域有了一定的地位。
在排名前1000的网站中,Nginx占据了将近三分之一的席位(29.1%),已经取代了IIS(仅为12.7%)第二名的位置。当然,Apache还是当之无愧的老大,占39.1%。这表明,大型网站更愿意使用开源的web服务器。Google服务器也有8.2%的份额。
在排名前100万的网站中,主流服务器仍为Apache,占据了63.7%的份额,也有很大一部分使用IIS,占16.7%。Nginx占据了14.2%。
这得益于Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型,而Apache则使用的是传统的select模型。目前Linux下能够承受高并发访问的Squid、Memcached都采用的是epoll网络I/O模型。
处理大量的连接的读写,Apache所采用的select网络I/O模型非常低效。下面用一个比喻来解析Apache采用的select模型和Nginx采用的epoll模型进行之间的区别:
假设你在大学读书,住的宿舍楼有很多间房间,你的朋友要来找你。select版宿管大妈就会带着你的朋友挨个房间去找,直到找到你为止。而epoll版宿管大妈会先记下每位同学的房间号,你的朋友来时,只需告诉你的朋友你住在哪个房间即可,不用亲自带着你的朋友满大楼找人。如果来了10000个人,都要找自己住这栋楼的同学时,select版和epoll版宿管大妈,谁的效率更高,不言自明。同理,在高并发服务器中,轮询I/O是最耗时间的操作之一,select和epoll的性能谁的性能更高,同样十分明了。
1.1.3 Nginx目录结构
1.1.4 Nginx启动停止
启动: start nginx.exe (不能双击,双击后进程无法关掉)
停止: nginx.exe –s stop
重新加载: nginx.exe –s reload
注:Windows下有时停止无效,造成开启太多,手工结束进程。
1.1.5 方式1:由nginx转发请求到tomcat
当用户访问http://localhost:80,nginx将这个请求什么也不做,只负责转发到tomcat的访问地址http://localhost:8080
server {
listen 80;
server_name localhost;
location/ { #拦截所有的资源
proxy_pass http://127.0.0.1:8080; #转向tomcat的地址
}
}
1.1.6 方式2:动静分离(指向一个目录)
静态资源:图片、css、js、html(静态资源处理时并发非常高)
动态资源:asp/aspx、php、jsp
nginx默认配置
location / {
root html; #相对路径,配置了一个html目录,我们可以将网站所用到的所有的静态资源从war中移除,放到这个目录下。
index index.html index.htm; #配置的欢迎页面
}
1.1.7 方式3:图片服务器(指向一个目录)
#图片服务器C:\Windows\System32\drivers\etc\hosts
server {
listen 80;
server_name image.jt.com; #域名地址,修改hosts文件做一个配置 image.jt.com127.0.0.1
location/ {
root c:\\jt-upload; #图片文件所在目录,按日期来分目录:yyyy/mm/dd/uuid.jpg或者当前时间的毫秒数+随机值.jpg
}
}
1.1.8 方式4:负载均衡
tomcat集群,每个tomcat部署的业务相同。
1.1.8.1 轮询
默认配置,tomcats有n个,请求就被平均分配到这n个服务器上。请求次数%n,平均分配到每个服务器。
例子:3个tomcat
修改3个端口,在同一台服务器上启动3个tomcat。每个tomcat下放一个index.html。然后内容修改,分别展示T1,T2,T3。当请求nignx,通过这种方法验证得出默认nginx轮询这3个页面,但顺序不一定是配置的顺序。
#前台,有3个tomcat集群,用户访问时轮询转向到某一个tomcat
server {
listen 80;
server_name www.jt.com;
location/ { #拦截所有的资源
proxy_pass http://jt; #引用定义的upstream
}
}
#配置一个upstream,声明一个名称jt,配置多个ip地址转向,默认就是轮询
upstreamjt {
server127.0.0.1:8080;
server127.0.0.1:8090;
server127.0.0.1:8100;
}
轮询方式存在问题:服务器有性能比较好的,有性能比较差的。新的服务器的配置比旧的服务器强悍很多。CPU核也多,内存也大,硬盘容量也大,速度还快。
如果还使用轮询的方式,就会造成新服务器资源的浪费,旧的服务器资源压力大。显然资源分配不合理,应该多劳多得。
1.1.8.2 权重
#前台,有3个tomcat集群,用户访问时轮询转向到某一个tomcat
server {
listen 80;
server_name www.jt.com;
location/ { #拦截所有的资源
proxy_pass http://jt; #引用下面定义的upstream
}
}
#配置一个upstream,声明一个名称jt,配置多个ip地址转向,默认就是轮询
upstreamjt {
server127.0.0.1:8080 weight=8; #访问请求分成9份,这个tomcat负责8份的链接
server127.0.0.1:8090 weight=1; #访问请求分成9份,这个tomcat负责1份的链接
server127.0.0.1:8100 down; #这个tomcat暂时不参加负载
}
1.1.9 *解决Session共享的解决办法
问题的由来:访问一个网站时,有两类请求。一种请求叫做无状态的请求,一种请求叫做有状态。
无状态,例如:登录页面,类似这种页面,哪个tomcat给我们响应都是一样的,不需要区分。这是我们最喜欢的。集群的动态伸缩性(增加节点,移除节点)。
有状态,例如:系统登录后,假如用户的请求被转发到tomcat1上,这时系统会写一个当前用户的信息放入session中。这种情况就称为有状态的,问题就来了。nginx负载均衡后,下一次用户的请求就被转发tomcat2上。tomcat2上没有session。系统就会要求用户去登录,这显然是不合理的。把这个问题称作session共享问题。
解决的办法:
1.1.9.1 session同步
tomcat支持动态将某个tomcat下的session复制到其他的tomcat中。但是这个方式是早期的企业级应用习惯的方式。现在很少使用。
这种方式在集群数量很少时,结果还是可以的。但如果集群数量庞大。都需要复制session,这时会因为网络延迟,或者session的内容非常大。都会造成隐患,这时可能读到脏数据。
1.1.9.2 Session黏着-放在服务端
对ip地址或者域名地址进行hash;或者uri进行hash。
缺点:用户浏览器的IP地址hash以后满足单调性。会可能造成资源的分配不均衡,负载均衡就达不到到目的。有的服务器负载过重,有的服务器负载过轻,显然没有充分利用资源。
#配置一个upstream,声明一个名称jt,配置多个ip地址转向,默认就是轮询
upstreamjt {
ip_hash; #IP_HASH方式来实现session共享
server127.0.0.1:8080 weight=5; #访问请求分成9份,这个tomcat负责8份的链接
server127.0.0.1:8090 weight=5; #访问请求分成9份,这个tomcat负责1份的链接
server127.0.0.1:8100 down; #这个tomcat暂时不参加负载
}
因为uri比ip地址相应数量多,变化就多,因此uri-hash比ip-hash分布更均衡些。
uri-hash需要第三方软件支持pcre-8.02.tar.gz、Nginx_upstream_hash-0.3.1.tar.gz
1.1.9.3 将信息放到cookie-放在客户端
session存在服务器端,会对服务器产生压力。如果将信息保存到cookie中,减轻了服务器的压力,同时每个客户端的压力也很小。因为只保存自己的信息。这种方式在实际的开发中广泛的采用。
缺点:cookie可以被禁用,cookie要随着浏览器传递,增大了传输的内容,cookie大小有限制。
1.1.9.4 终极的解决方案-新SSO单点登录
将session从系统中独立出来。Apache shiro顶级安全框架,它的session管理就是独立出来的。目前主流做法是利用redis作为session管理的实现,因为redis访问极其快速。
原先我们将项目的资源一起放到war中,而nginx可以将这些资源单独出来,无需判断为动态资源还是静态资源而直接进行静态资源的返回。这点使处理静态资源时,它的效率比Apache高数倍。
#图片服务器
server {
listen 80;
server_name image.jt.com;
#charsetkoi8-r;
#access_log logs/host.access.log main;
proxy_set_headerX-Forwarded-Host $host;
proxy_set_headerX-Forwarded-Server $host;
proxy_set_headerX-Forwarded-For $proxy_add_x_forwarded_for;
location/ {
root c:\\jt-upload;
}
}
目录:C:\jt-upload\images\2016\03\07\607.jpg
访问:http://image.jt.com/images/2016/03/07/607.jpg
1.1.10 流行的nginx部署结构
先通过一个nginx进行转发到2个nginx上,然后再通过nginx进行负载到多个tomcat集群上。
- nginx高负载均衡服务器
- Nginx 负载均衡服务器
- Nginx+Keepalived高可用负载均衡服务器搭建
- 配置Nginx+keepalived高可用负载均衡服务器
- Nginx负载均衡服务器的双机高可用
- nginx负载均衡高可用
- 负载均衡服务器nginx安装
- nginx服务器负载均衡配置
- nginx服务器搭建负载均衡
- Nginx服务器(负载均衡)
- nginx+keepalived 高可用负载均衡
- nginx+keepalived高可用性负载均衡
- nginx+keepalived实现高可用负载均衡
- nginx + keepalive 实现高可用负载均衡
- nginx+keepalived 高可用负载均衡
- Keepalived+Nginx实现负载均衡高可用
- nginx+keepalive实现高可用负载均衡
- nginx+keepalive实现高可用负载均衡
- 算法----八皇后扩展
- Keras私房手册
- 停课总结(一)
- 图片下的阴影 box-shadow
- 文件自删除的一些资料与实现
- nginx高负载均衡服务器
- Elasticsearch之重新索引数据、索引别名和零停机时间。
- 脚本引擎执行
- VM虚拟机下安装CentOS7无法上网的解决办法
- C语言基础知识学习(二)
- Java IO笔记(BufferedReader/BufferedWriter)
- 2017 10 04小结
- 使用synchronized的注意点
- 显式类型转换