nginx实现负载均衡、缓存功能实战

时间:2023-03-09 05:31:47
nginx实现负载均衡、缓存功能实战

nginx实现负载均衡、缓存功能实战

什么是正向代理?应用场景:*

nginx实现负载均衡、缓存功能实战

什么是反向代理?例如:haproxy和nginx

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: 是和后端建立连接的超时时间

 

proxy_pass配置常见用法有三种:

1、location的/uri将被替换为/newuri,如下:

location /uri {

proxy_pass http://ip:port/newuri;

}

将/mobi 的请求跳转到新服务器上/mobile目录下

location /mobi/ {

proxy_pass http://172.16.100.1/mobile/index.php;

}

172.17.253.236为反向代理服务器

vim /etc/nginx/nginx.conf

nginx实现负载均衡、缓存功能实战

在浏览器*问

nginx实现负载均衡、缓存功能实战

2、如果location的URI是通过模式匹配定义的,其URI将直接被传递,而不能为其指定转换的另一个URI。

location ~ ^/mobile {

proxy_pass http://172.16.100.2;

}

172.17.253.132为反向代理服务器

vim /etc/nginx/nginx.conf

nginx实现负载均衡、缓存功能实战

在浏览器*问

nginx实现负载均衡、缓存功能实战

3、如果在location中使用的URL重定向,那么nginx将使用重定向后的URI处理请求,而不再考虑之前定义的URI

location /youxi {

rewrite ^(.*)$ /mobile/$1 break;

proxy_pass http://172.16.100.1;

}

172.17.253.132是反向代理

vim /etc/nginx/nginx.conf

nginx实现负载均衡、缓存功能实战

在浏览器*问

nginx实现负载均衡、缓存功能实战

客户端发送请求给反向代理,而nginx作为反向代理,帮客户端把请求发送给真正的后端服务器,而对于后台真正的服务器来说,他认为来访问的客户端是反向代理,此时如果想记录真正的客户端来访问的信息日志,就需要定义一个头部,把真正访问的客户端的ip打到头部中,这样后端服务器就能记录真正访问的客户端的信息了。

proxy_set_header可将发送至server的报文的某首部进行重写;常用于nginx做负载均衡时,获取客户端IP时,需要添加forward头部。

proxy_set_header Host $host;

proxy_set_header X-REMOTE-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

原有请求报文中如果存在X-Forwared-For首部,则将client_addr以逗号分隔补原有值后,否则则直接添加此首部;

nginx实现负载均衡、缓存功能实战

日志查看:

"$remote_addr" $host "$http_x_forwarded_for"

配置步骤:

1.在nginx反向代理服务器上配置

vim /etc/nginx/nginx.conf

在server段中配置

nginx实现负载均衡、缓存功能实战

然后重启nginx服务

2.在后端服务器上配置

vim /etc/nginx/ngin.conf

配置日志格式

nginx实现负载均衡、缓存功能实战

然后重启nginx服务

3.在浏览器*问反向代理,然后在后端服务器上查看日志

nginx实现负载均衡、缓存功能实战

查看后端服务器的日志

tail -f /var/log/nginx/access.log

nginx实现负载均衡、缓存功能实战

 

upstream(定义一组负载均衡的后端服务器)

nginx负载均衡是ngx_http_upstream_module模块的功能,需要在配置文件http块上下文中定义upstream块,指定一组负载均衡的后端服务器,然后在上面讲到的proxy_pass中引用,就可以反向代理时实现负载均衡了。

语法:server address [parameters];

paramerters:

weight:负载均衡策略权重,默认为1;

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:当所有后端服务器都宕机时,可以指定代理服务器自身作为备份,对外提供维护提示页面;

down:永久不可用

 

upstream dynamic {

server backend1.example.com weight=5;

server backend2.example.com:8080 max_fails=3; fail_timeout=5s ;

server 192.0.2.1 max_fails=3;

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系统上

2.然后解压解包

tar xvf tengine-2.1.1.tar.gz

3.安装编译环境

yum groupinstall "development tools"

yum install prce-devel

yum install openssl-devel

4.cd tengine-2.1.1/

./configure --prefix=/usr/local/tengine

5.make &&make install

6.cd /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实现健康检测

该模块在Tengine-1.4.0版本以前没有默认开启,它可以在配置编译选项的时候开启:./configure --with-http_upstream_check_module

 

修改tengine的配置文件

vim /usr/local/tengine/conf/nginx.conf

1.配置upstream (upstream在server段外面配置)

nginx实现负载均衡、缓存功能实战

2.在location段配置

nginx实现负载均衡、缓存功能实战

3.重新加载tengine的配置文件

nginx -s reload

4.在浏览器上查看健康检测页面

nginx实现负载均衡、缓存功能实战

也可以直接查看代码

nginx实现负载均衡、缓存功能实战

也可以直接curl来访问,这样就可以用awk把down的机器的ip给截下来,然后再做处理

nginx实现负载均衡、缓存功能实战

 

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,也就是一开始服务器认为是不可用,要等健康检查包达到一定成功次数以后才会被认为是健康的。
  • type:健康检查包的类型,现在支持以下多种类型
    • tcp:简单的tcp连接,如果连接成功,就说明后端正常。
    • ssl_hello:发送一个初始的SSL hello包并接受服务器的SSL hello包。
    • http:发送HTTP请求,通过后端的回复包的状态来判断后端是否存活。
    • mysql: 向mysql服务器连接,通过接收服务器的greeting包来判断后端是否存活。
    • ajp:向后端发送AJP协议的Cping包,通过接收Cpong包来判断后端是否存活。
  • 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

配置upstream

nginx实现负载均衡、缓存功能实战

配置location段

nginx实现负载均衡、缓存功能实战

 

nginx实现负载均衡、缓存功能实战

Nginx实现缓存功能

为什么需要缓存?

缓存的最根本的目的是为了提高网站性能,减轻频繁访问数据,而给数据库带来的压力。合理的缓存,还会减轻程序运算时,对CPU带来的压力。在计算机现代结构中,操作内存中的数据比操作存放在硬盘上的数据是

要快N个数量级的,操作简单的文本结构的数据,比操作数据库中的数据快N个数量级 。

例如:每次用户访问网站,都必须从数据库读取网站的标题,每读一次需要15毫秒的时间,如果有100个用户(先不考虑同一时间访问),每小时访问10次,那么就需要读取数据库1000次,需要时间15000毫秒.如果把页面直接变成

页面缓存,则每次访问就不需要去数据库读取,大大提升了网站性能。

 

缓存服务工作原理

nginx实现负载均衡、缓存功能实战

 

缓存数据分为两部分(索引,数据):

1、存储数据的索引,存放在内存中;

2、存储缓存数据,存放在磁盘空间中;

 

Nginx实现缓存是通过代理缓存pxory_cache,这也是ngx_http_proxy_module模块提供的功能,这里配置选项较多,常用的选项有:proxy_cache_path、proxy_cache和proxy_cache_valid

 

1、proxy_cache_path

proxy_cache_path定义一个完整的缓存空间,指定缓存数据的磁盘路径、索引存放的内存空间以及一些其他参数,如缓存删除策略。

注意,该选项只能定义在http块上下文中。

如,proxy_cache_path /data/cache levels=1:2 keys_zone=web:10m max_size=1G inactive=10;

缓存数据存储在/data/cache目录中;

levels:配置在该目录下再分两层目录,一层1个随机字符作为名称,二层2个随机字符作为名称,levels最多三层,每层最多两个字符,这是为了加快访问文件的速度;最后使用代理url的哈希值作为关键字与文件名,一个缓存数据如下:/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c;

keys_zone:用来为这个缓存区起名,并设置大小。指定名称为web,这个名称后面proxy_cache需要

引用;而10m就是内存空间的大小;

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分钟后都将失效

proxy_cache_valid 404 1m;

 

配置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;

 

server {

listen 80;

server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

add_header Magedu-Cache "$upstream_cache_status form $server_addr"; #给请求响应增加一个头部信息,表示从服务器上返回的cache状态怎么样(有没有命中)

 

location / {

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;

nginx实现负载均衡、缓存功能实战

2.配置proxy_cache引用上面定义的缓存空间(在location段配置)

proxy_cache web;

3.配置proxy_cache_valid,设置不同响应代码的数据缓存时间(在location段配置)

proxy_cache_valid 200 302 10m;

proxy_cache_valid 404 1m;

nginx实现负载均衡、缓存功能实战

4.在server段配置,给请求响应增加一个头部消息

add_header Magedu-Cache "$upstream_cache_status form $server_addr";#给请求响应增加一个头部信息,表示从服务器上返回的cache状态怎么样(有没有命中)

nginx实现负载均衡、缓存功能实战

 

memcached

memcached是什么

Memcached是一个*开源的,高性能,分布式内存对象缓存系统。它是一种基于内存的key-value存储,

用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。

 

Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它

的API兼容大部分流行的开发语言。本质上,它是一个简洁的key-value存储系统。

 

一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩

展性。

 

memcached配置

配置文件修改

/etc/sysconfig/memcached #路径

PORT="11211" #端口

USER="memcached" #启动用户

MAXCONN="1024" #最大连接

CACHESIZE="64" #缓存空间大小

 

开启memcache服务

systemctl start memcached(注意是memcached)

 

memcache该怎样使用呢,
可以用telnet来连接memchache

nginx实现负载均衡、缓存功能实战

如果不想修改配置文件,可以通过启动memcached手动指定参数,如下:

memcached参数:

-d 指定memcached进程作为一个守护进程启动

-m <num> 指定分配给memcached使用的内存,单位是MB,默认为64;

-u <username> 运行memcached的用户

-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.

-c <num>设置最大运行的并发连接数,默认是1024

-R <num> 为避免客户端饿死(starvation),对连续达到的客户端请求数设置一个限额,如果超过该设置,会选择另一个连接来处理请求,默认为20

-k 设置锁定所有分页的内存,对于大缓存应用场景,谨慎使用该选项

-P 保存memcached进程的pid文件

-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状态查看

nginx实现负载均衡、缓存功能实战

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 reserved_fds 20 //

STAT cmd_get 328806688 //get命令(获取)总请求次数

STAT cmd_set 75441133 //set命令(保存)总请求次数

STAT get_hits 253547177 //总命中次数

STAT get_misses 75259511 //总未命中次数

 

memcached使用

memcached set 命令的基本语法如下所示:

set key flags exptime bytes [noreply]

value

set name 1 1800 8

xiaoming

key 是通过被存储在Memcached的数据并从memcached获取键(key)的名称。

flags 是32位无符号整数,该项目被检索时用的数据(由用户提供),并沿数据返回服务器存储。

exptime 以秒过期时间,0表示没有延迟,如果exptime大于30天,Memcached将使用它作为UNIX时间戳过期。

nginx实现负载均衡、缓存功能实战

bytes 是在数据块中,需要被存储的字节数。基本上,这是一个需要存储在memcached的数据的长度。

noreply (可选) 参数告知服务器不发送回复

value 是一个需要存储的数据。数据需要与上述选项执行命令后,将通过新的一行。

 

 

凡是基于内存存储的数据一掉电就没有了,凡是基于硬盘存储的数据一掉电还是能够找回的

memcache的缓存数据是存储在内存上的一掉电就没有了,而nginx的缓存数据时存储在硬盘上的,索引是存储在内存上的,但是索引可以通过数据从建的

 

php去连接memcache缓存数据库,需要安装php-memcache(php连接memcache的客户端)

1.安装memcache

yum install memcache

2.安装php连接memcache的客户端

yum install php-memcache

3.查看php支持的模块

vim /data/web/phpinfo.php

<?php

phpinfo()

?>

然后在浏览器*问172.17.251.236/phpinfo.php,查看php是否支持memcache客户端和服务的模块,如图:是支持的

nginx实现负载均衡、缓存功能实战

4.编写memcached测试脚本,然后在浏览器*问

vim /data/web/memcache.php

<?php

$mem = new 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',时

间为600s

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.";

?>

nginx实现负载均衡、缓存功能实战

然后在浏览器*问

nginx实现负载均衡、缓存功能实战

memcached分布式存储

nginx实现负载均衡、缓存功能实战