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;
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(定义一组负载均衡的后端服务器)
语法: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
另外,可以指定代理服务器自身作为备份server,当所有后端服务器都宕机时,对外提供维护提示页面。
编译安装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个数量级 。
页面缓存,则每次访问就不需要去数据库读取,大大提升了网站性能。
缓存服务工作原理
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 /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;
-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.";