Nginx反向代理、负载均衡、缓存、URL重写及读写分离
设计高性能网站的时候首页静态化,都是html格式,可能有
些子版块是动态生成的,但也是缓存的。
由于网站越来越复杂,网站需要分区,分成图片组,搜索组等等:
Xcache: 缓存
Nginx特性:
map
event-driver:一个进程响应多个请求,单线程进程
aio
LEMP:
Nnginx(FastCGI) + php + fps
10000个请求,才2.5M内存
lvs: 4层,dr模型,配置逻辑比较复杂,工作在内核的,但性能是最好的
经过优化后,一个时间内可以转发数百万个请求,不具备检查APPServer
状况的能力,还需要调用iodevertor
nginx: 7层,能理解具体应用协议的,工作于用户空间,一个时间内能处理上万个请求
haproxy: 7层,能理解具体的应用协议的,工作在用户空间,一个时间内能处理上万个请求
在同一个条件下,haproxy的转发能力比nginx强,但nginx对系统的资源需求量要求小,
haproxy具有缓存功能,但nginx的缓存功能乏善可陈了。
一般MySQL服务器,能同时处理50个请求就不错了。
Memcache: 公共缓存,后端查询数据库缓存,先查询Memcache,如果缓存中没有,
再查数据库。命中率达到40%左右,带整体的性能提升都是
非常明显的。
Xcache: 单个APP server为例,由于App Server是php服务器,
Php的执行代码要编译成opcode, 然后才能执行,第二个请求再
请求同一个页面的时候,还需要重新编译,由于每个请求是由
一个进程处理,不能共享,但使用xcache后,可以使得第一个
请求编译的opcode可以被第二个请求使用。
如果某个App Server挂了怎么吧?
1.可以使用持久连接,让同一个客户端的请求时钟发送到某个
服务器;如果这个服务器挂了,就会丢失这台主机的会话信息;
2.共享会话信息,通过组播的方式同步,粘性会话,小集群可以;
3.使用session共享服务器,用memcache或者redis缓存服务器。
每一个请求都会发cookia,通过cookia, 找到session。
Memcache对高可用的支持不理想,但可以很好实现分布式功能。
通过hash运行,取余,选择服务器。
如果某个key要存多个数据的时候,可以用redis。
随着访问量的增加,网站需要分块,把图片,搜索,广告等分块。
随着访问的增加,分发服务器会成为瓶颈,形成单点故障。
在分发服务器可以缓存opcode生成的结果,但转发服务器
本身就很忙,还有缓存,所以可以将缓存服务器缓存起来。
如果缓存服务器有,就由缓存服务器够着响应,如果没有则
发送到后端服务器。
如果第一请求后的结果,缓存在第一个缓存服务器,如果第二个请求
过来,请求访问第二个缓存服务器,则第二个缓存不能命中。
为了提高命中率,可以做持久连接(会破坏负载均衡效果),或者
数据同步。
这些APP Server都是服务动态内容的,还可以加一个服务静态内容的服务器组(varnish),如果图片的时候,转发给静态服务器组(lvs分发给varnish,varnish在分发到后端服务器)。或者增加专门图片服务器组。
如果要区分请求的资源类型,lvs是不支持的。
Nginx如果php的请求分发到后端?
Location ~* \.php${
Fastcgi_proxy127.0.0.1:9000
//定义方向代理,这就是反向代理
}
正向代理:内网的主机的80端口的请求,都发送代理服务器,代理内网主机
访问internet,再返回结果给内网主机。
反向代理:外网的主机想访问内网的主机,过程与正向代理相反。
Server{
Listen 80;
Server_namewww.magedu.com
Location /{
后端服务器;
}
}
怎么定义后端服务器呢?
使用方向代理:
Proxy_pass
回顾Nginx配置分段:
Main; //全局配置,worker进程数,错误日志,
Event{
//定义事件驱动的,Nginx基于事件驱动,如epoll
}
httpd{
//关于httpd相关配置
}
Server{
//server只能放在http中,server不能嵌套,但location可以
//嵌套
}
Location URI{
//定义虚拟主机
//可以放在server中,也可以放在httpd中
//访问规则,定义URI的属性(谁能干什么)
}
详解:
Location /form/{
Proxy_passHttp://172.16.100.11:8080/bbs/;
}
àhttp://172.16.100.11:8080/bbs/
如果使用了模式匹配只能指定到:
http://172.16.100.11:8080/
OP:
~ :不区分大小写
~* :区分大小写
^~ : 做逐字符匹配
= : 路径精确匹配,通常匹配一个文件
28分