nginx实现负载均衡、缓存功能实战
Nginx实现反向代理
nginx代理基于是ngx_http_proxy_module模块的功能,该模块有很多属性配置选项,如:
proxy_pass:指定将请求代理至server的URL路径;
proxy_set_header:将发送至server的报文的某首部进行重写;
proxy_send_timeout:在连接断开之前两次发送到server的最大间隔时长;过了这么长时间后端还是没有收到数据,连接会被关闭
proxy_read_timeout:是从后端读取数据的超时时间,两次读取操作的时间间隔如果大于这个值,和后端的连接会被关闭。
proxy_connect_timeout: 是和后端建立连接的超时时间
1、location的/uri将被替换为/newuri,如下:
proxy_pass http://ip:port/newuri;
proxy_pass http://172.16.100.1/mobile/index.php;
2、如果location的URI是通过模式匹配定义的,其URI将直接被传递,而不能为其指定转换的另一个URI。
proxy_pass http://172.16.100.2;
3、如果在location中使用的URL重定向,那么nginx将使用重定向后的URI处理请求,而不再考虑之前定义的URI
rewrite ^(.*)$ /mobile/$1 break;
proxy_pass http://172.16.100.1;
客户端发送请求给反向代理,而nginx作为反向代理,帮客户端把请求发送给真正的后端服务器,而对于后台真正的服务器来说,他认为来访问的客户端是反向代理,此时如果想记录真正的客户端来访问的信息日志,就需要定义一个头部,把真正访问的客户端的ip打到头部中,这样后端服务器就能记录真正访问的客户端的信息了。
proxy_set_header可将发送至server的报文的某首部进行重写;常用于nginx做负载均衡时,获取客户端IP时,需要添加forward头部。
proxy_set_header X-REMOTE-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
原有请求报文中如果存在X-Forwared-For首部,则将client_addr以逗号分隔补原有值后,否则则直接添加此首部;
"$remote_addr" $host "$http_x_forwarded_for"
配置步骤:
1.在nginx反向代理服务器上配置
2.在后端服务器上配置
3.在浏览器上访问反向代理,然后在后端服务器上查看日志
tail -f /var/log/nginx/access.log
upstream(定义一组负载均衡的后端服务器)
nginx负载均衡是ngx_http_upstream_module模块的功能,需要在配置文件http块上下文中定义upstream块,指定一组负载均衡的后端服务器,然后在上面讲到的proxy_pass中引用,就可以反向代理时实现负载均衡了。
语法:server address [parameters];
paramerters:
max_fails:在一定时间内(这个时间在fail_timeout参数中设置)检查这个服务器是否可用时产生的最多失败请求数
fail_timeout:在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用,进行对后端服务器的健康状态检查;
max_fails 3;fail_timeout 10s; 意思是在10s内最多失败请求次数为3次,在经历3次失败请求后,暂停服务10s(一般max_fails和fail_timeout在一起用)
backup:当所有后端服务器都宕机时,可以指定代理服务器自身作为备份,对外提供维护提示页面;
server backend1.example.com weight=5;
server backend2.example.com:8080 max_fails=3; fail_timeout=5s ;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
专业健康检测模块 nginx_upstream_check_module-master
upstream块里可以用多个server选项配置多个后端服务器,同时还可配置对后端服务器的健康状态检查,可以在server后面加上max_fails(proxy_next_upstream指定检查策略,默认为返回超时为失败)和fail_timeout参数实现;也可以用health_check选项来实现health_check可以指定的参数较多,不过需要定义在location上下文中。
另外,可以指定代理服务器自身作为备份server,当所有后端服务器都宕机时,对外提供维护提示页面。
还可以指定负载均衡策略:主要有round_robin(加权轮询,默认)、hash、ip_hash、least_conn(最少连接)和least_time(最少响应时间,商业版本),策略定义在upstream上下文即可;
编译安装tengine
1.在官方下载最新的tengine包,然后rz到linux系统上
yum groupinstall "development tools"
./configure --prefix=/usr/local/tengine
7.vim /etc/profile.d/nginx.sh 添加PATH变量
export PATH=/usr/local/tengine/sbin:$PATH
. /etc /profile.d/nginx.sh 使添加的PATH变量生效
8.cp /etc/nginx/nginx.conf /usr/local/tengine/conf 将nginx的配置文件拷过来作为tengine的配置文件
tengine实现健康检测
该模块在Tengine-1.4.0版本以前没有默认开启,它可以在配置编译选项的时候开启:./configure --with-http_upstream_check_module
vim /usr/local/tengine/conf/nginx.conf
1.配置upstream (upstream在server段外面配置)
也可以直接curl来访问,这样就可以用awk把down的机器的ip给截下来,然后再做处理
check interval=3000 rise=2 fall=5 timeout=1000 type=http;
- interval:向后端发送的健康检查包的间隔。
- fall(fall_count): 如果连续失败次数达到fall_count,服务器就被认为是down。
- rise(rise_count): 如果连续成功次数达到rise_count,服务器就被认为是up。
- timeout: 后端健康请求的超时时间。
- default_down: 设定初始时服务器的状态,如果是true,就说明默认是down的,如果是false,就是up的。默认值是true,也就是一开始服务器认为是不可用,要等健康检查包达到一定成功次数以后才会被认为是健康的。
- port: 指定后端服务器的检查端口。你可以指定不同于真实服务的后端服务器的端口,比如后端提供的是443端口的应用,你可以去检查80端口的状态来判断后端健康状况。默认是0,表示跟后端server提供真实服务的端口一样。该选项出现于Tengine-1.4.0。
check_http_send "HEAD / HTTP/1.0\r\n\r\n";
该指令可以配置http健康检查包发送的请求内容。为了减少传输数据量,推荐采用"HEAD"方法。
当采用长连接进行健康检查时,需在该指令中添加keep-alive请求头,如:"HEAD / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n"。
同时,在采用"GET"方法的情况下,请求uri的size不宜过大,确保可以在1个interval内传输完成,否则会被健康检查模块视为后端服务器或网络异常。
Syntax: check_http_expect_alive [ http_2xx | http_3xx | http_4xx | http_5xx ]
该指令指定HTTP回复的成功状态,默认认为2XX和3XX的状态是健康的。
nginx反向代理实现动静分离
vim /usr/local/tengine/conf/nginx.conf
Nginx实现缓存功能
缓存的最根本的目的是为了提高网站性能,减轻频繁访问数据,而给数据库带来的压力。合理的缓存,还会减轻程序运算时,对CPU带来的压力。在计算机现代结构中,操作内存中的数据比操作存放在硬盘上的数据是
要快N个数量级的,操作简单的文本结构的数据,比操作数据库中的数据快N个数量级 。
例如:每次用户访问网站,都必须从数据库读取网站的标题,每读一次需要15毫秒的时间,如果有100个用户(先不考虑同一时间访问),每小时访问10次,那么就需要读取数据库1000次,需要时间15000毫秒.如果把页面直接变成
页面缓存,则每次访问就不需要去数据库读取,大大提升了网站性能。
缓存服务工作原理
Nginx实现缓存是通过代理缓存pxory_cache,这也是ngx_http_proxy_module模块提供的功能,这里配置选项较多,常用的选项有:proxy_cache_path、proxy_cache和proxy_cache_valid。
1、proxy_cache_path
proxy_cache_path定义一个完整的缓存空间,指定缓存数据的磁盘路径、索引存放的内存空间以及一些其他参数,如缓存删除策略。
如,proxy_cache_path /data/cache levels=1:2 keys_zone=web:10m max_size=1G inactive=10;
levels:配置在该目录下再分两层目录,一层1个随机字符作为名称,二层2个随机字符作为名称,levels最多三层,每层最多两个字符,这是为了加快访问文件的速度;最后使用代理url的哈希值作为关键字与文件名,一个缓存数据如下:/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c;
keys_zone:用来为这个缓存区起名,并设置大小。指定名称为web,这个名称后面proxy_cache需要
max_size:指定最大缓存数据磁盘空间的大小,最多缓存的数据大小,如果超过这个大小,就开始清理缓存数据,使用lru算法将最近最少使用的缓存数据清理掉。
inactive:在inactive指定的时间内,未被访问的缓存数据将从缓存中删除。
2、proxy_cache
proxy_cache用来引用上面proxy_cache_path定义的缓存空间,现
proxy_cache web; #引用上面定义上的缓存空间,同一缓存空间可以在几个地方使用
3、proxy_cache_valid
proxy_cache_valid设置不同响应代码的缓存时间,如:
proxy_cache_valid 200 302 10m; 响应状态码为200 302的数据缓存住到失效的时间为10分钟,不管有没有人来访问这些数据,10分钟后都将失效
配置Nginx缓存实例:
先配置proxy_cache_path,再配置proxy_cache引用、打开缓存空间,接着配置两个proxy_cache_valid;为方便调试测试,我们可以通过add_header给请求响应增加一个头部信息,表示从服务器上返回的cache状态怎么样(有没有命中),主要配置如下:
#定义一个完整的缓存空间; 缓存数据存储在/data/cache目录中/配置在该目录下再分两层目录,名称为web(proxy_cache引用),10m内存空间大小/最大缓存数据磁盘空间的大小为1G/10分钟未被访问的缓存数据将从缓存中删除
proxy_cache_path /data/cache levels=1:2 keys_zone=web:10m max_size=1G inactive=10m;
#access_log logs/host.access.log main;
add_header Magedu-Cache "$upstream_cache_status form $server_addr"; #给请求响应增加一个头部信息,表示从服务器上返回的cache状态怎么样(有没有命中)
proxy_pass http://webserver; #引用上面定义的upstream负载均衡组
proxy_cache web; #引用上面定义上的缓存空间,同一缓存空间可以在几个地方使用
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m; #对代码200和302的响应设置10分钟的缓存,对代码404的响应设置为1分钟:
在tengine配置文件中具体配置如下:
vim /usr/local/tengine/conf/nginx.conf
1.配置proxy_cache开启缓存功能(在http段配置)
proxy_cache_path /data/cache levels=1:2 keys_zone=web:10m max_size=1G inactive=10m;
2.配置proxy_cache引用上面定义的缓存空间(在location段配置)
3.配置proxy_cache_valid,设置不同响应代码的数据缓存时间(在location段配置)
proxy_cache_valid 200 302 10m;
add_header Magedu-Cache "$upstream_cache_status form $server_addr";#给请求响应增加一个头部信息,表示从服务器上返回的cache状态怎么样(有没有命中)
memcached
memcached是什么
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。它是一种基于内存的key-value存储,
用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。
Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它
的API兼容大部分流行的开发语言。本质上,它是一个简洁的key-value存储系统。
一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩
memcached配置
systemctl start memcached(注意是memcached)
memcache该怎样使用呢,
可以用telnet来连接memchache
如果不想修改配置文件,可以通过启动memcached手动指定参数,如下:
memcached参数:
-m <num> 指定分配给memcached使用的内存,单位是MB,默认为64;
-l <ip_addr> 监听的服务器IP地址,如果有多个地址的话,使用逗号分隔,格式可以为"IP地址:端口号",例如:-l 指定192.168.0.184:19830,192.168.0.195:13542;端口号也可以通过-p选项指定
-p <num> Listen on TCP port <num>, the default is port 11211.
-R <num> 为避免客户端饿死(starvation),对连续达到的客户端请求数设置一个限额,如果超过该设置,会选择另一个连接来处理请求,默认为20
-k 设置锁定所有分页的内存,对于大缓存应用场景,谨慎使用该选项
-s <file> 指定Memcached用于监听的UNIX socket文件
-a <perms> 设置-s选项指定的UNIX socket文件的权限
-U <num> Listen on UDP port <num>, the default is port 11211, 0 is off.
memcached状态查看
STAT pid 22362 //memcache服务器的进程ID
STAT uptime 1469315 //服务器已经运行的秒数
STAT time 1339671194 //服务器当前的unix时间戳
STAT version 1.4.9 //memcache版本
STAT libevent 1.4.9-stable //libevent版本
STAT pointer_size 64 //当前操作系统的指针大小(32位系统一般是32bit,64就是64位操作系统)
STAT rusage_user 3695.485200 //进程的累计用户时间
STAT rusage_system 14751.273465 //进程的累计系统时间
STAT curr_connections 69 //服务器当前存储的items数量
STAT total_connections 855430 //从服务器启动以后存储的items总数量
STAT connection_structures 74 //服务器分配的连接构造数
STAT cmd_get 328806688 //get命令(获取)总请求次数
STAT cmd_set 75441133 //set命令(保存)总请求次数
STAT get_hits 253547177 //总命中次数
STAT get_misses 75259511 //总未命中次数
memcached使用
set key flags exptime bytes [noreply]
key 是通过被存储在Memcached的数据并从memcached获取键(key)的名称。
flags 是32位无符号整数,该项目被检索时用的数据(由用户提供),并沿数据返回服务器存储。
exptime 以秒过期时间,0表示没有延迟,如果exptime大于30天,Memcached将使用它作为UNIX时间戳过期。
bytes 是在数据块中,需要被存储的字节数。基本上,这是一个需要存储在memcached的数据的长度。
value 是一个需要存储的数据。数据需要与上述选项执行命令后,将通过新的一行。
凡是基于内存存储的数据一掉电就没有了,凡是基于硬盘存储的数据一掉电还是能够找回的
memcache的缓存数据是存储在内存上的一掉电就没有了,而nginx的缓存数据时存储在硬盘上的,索引是存储在内存上的,但是索引可以通过数据从建的
php去连接memcache缓存数据库,需要安装php-memcache(php连接memcache的客户端)
然后在浏览器上访问172.17.251.236/phpinfo.php,查看php是否支持memcache客户端和服务的模块,如图:是支持的
$mem->connect("172.17.251.236", 11211); #连接Memcached
$version = $mem->getVersion();
echo "Server's version: ".$version."<br/>\n"; #输出Memcached版本信息
$mem->set('magedu', 'Hello World', 0, 600); #向Memcached存储数据'Hello World',时
echo "Store data in the cache (data will expire in 600 seconds)<br/>\n";
$get_result = $mem->get('magedu'); #获取testkey的值
echo "$get_result is from memcached server.";
memcached分布式存储
nginx实现负载均衡、缓存功能实战的更多相关文章
- Nginx实现负载均衡&Nginx缓存功能
一.Nginx是什么 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambl ...
- Nginx网络架构实战学习笔记(三):nginx gzip压缩提升网站速度、expires缓存提升网站负载、反向代理实现nginx+apache动静分离、nginx实现负载均衡
文章目录 nginx gzip压缩提升网站速度 expires缓存提升网站负载 反向代理实现nginx+apache动静分离 nginx实现负载均衡 nginx gzip压缩提升网站速度 网页内容的压 ...
- nginx的负载均衡实战
前言 nginx是一个高性能的HTTP和反向代理的服务器.它有三个最基本的功能,一是当做web服务器.二是作为反向代理服务器.三是提供负载均衡(在反向代理基础上),由于它占有内存小,并发能力强,所以在 ...
- Nginx负载均衡——基础功能
熟悉Nginx的小伙伴都知道,Nginx是一个非常好的负载均衡器.除了用的非常普遍的Http负载均衡,Nginx还可以实现Email,FastCGI的负载均衡,甚至可以支持基于Tcp/UDP协议的各种 ...
- Nginx实现负载均衡功能
一.什么是Nginx? Nginx是一款轻量级的Web 服务器.反向代理服务器.电子邮件(IMAP/POP3)代理服务器. 二.Nginx的优点: 高并发连接:官方测试Nginx能够支撑5万并发连接, ...
- Nginx正反向代理、负载均衡等功能实现配置
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 系统环境: VirtualBox Manager Centos6.4 nginx1.10.0 IP对应的机器名: IP ...
- Nginx 反向代理功能-实现Nginx tcp负载均衡
Nginx 反向代理功能-实现Nginx tcp负载均衡 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- 消费者用nginx做负载均衡,提供者用zookeeper自带功能实现负载均衡
公司的项目基于阿里的Dubbo微服务框架开发.为了符合相关监管部门的安全要求,公司购买了华东1.华东2两套异地服务器,一套是业务服务器,一套是灾备服务器.准备在这两套服务器上实现Dubbo的分布式服务 ...
- 死磕nginx系列--使用nginx做负载均衡
使用nginx做负载均衡的两大模块: upstream 定义负载节点池. location 模块 进行URL匹配. proxy模块 发送请求给upstream定义的节点池. upstream模块解读 ...
随机推荐
- css的一些基础方法
1.css样式表分别有: 内联样式表 <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- JavaScript笔记(5)
1.DOM操作 常用的DOM操作 document.getElementById(id); //返回指定id的元素,通用 document.getElementsByTagName(tagName); ...
- 学习前端第二天之css层叠样式
一.设置样式公式 选择器 {属性:值:} 二.font 设置四大操作 font-size:字体大小 (以像素为单位) font-weight:字体粗细 font-family:字体 ( 可直接跟 ...
- LLVM的RTTI特性
本文思路来源于http://llvm.org/docs/HowToSetUpLLVMStyleRTTI.html,叙述有不同,望谅解,希望能从其他方面帮助大家了解C++语言的底层实现. 背景 在LLV ...
- linux-2.6.38 总线驱动分析
一.IIC总线驱动代码 IIC总线控制器通常是在内存上的,连接在platform总线上,所以需要通过platform_driver和platform_device的匹配.我想大概根据总线设备驱动模型的 ...
- SQLite3学习笔记(3)
SQLite 表达式 表达式是一个或多个值.运算符和计算值的 SQL函数的组合. SQL表达式与公式类似,都写在查询语言中.您还可以使用特定的数据集来查询数据库. SELECT语句的基本语法如下: S ...
- Selenium&Appium四种等待方式
一.摘要 本博文主要介绍自动化测试中,无论是selenium或是Appium的四种等待方式,合理的使用等待对代码的稳定性,测试效率都有很大的提高 隐式等待:是在尝试发现某个元素的时候,如果没能立刻发现 ...
- Spring入门篇——第2章 Spring IOC容器
第2章 Spring IOC容器 介绍Spring IOC容器的基本概念和应用 2-1 IOC及Bean容器 自己的理解:什么是IOC?就是利用配置文件(外部容器)来创建对象. 在IOC容器中,所有对 ...
- shell字符串处理
一.字符串切片: ${#var}:返回字符串变量var的长度${var:offset}:返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,offse ...
- python解决八皇后问题的方法
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/9/11 15:40 # @Author : Lijinjin # @Site ...