AmazingCounters.com

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.18.64.7/mobile/index.php;
  } 

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

location ~ ^/mobile {
  proxy_pass http://172.18.64.107;
  }    

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

location /youxi {

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

  proxy_pass http://172.18.64.17;

  }

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以逗号分隔补原有值后,否则则直接添加此首部;

日志查看: "$remote_addr" $host "$http_x_forwarded_for"

Nginx实现反向代理负载均衡

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一起使用,进行对后端服务器的健康状态检查;
  • 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(Tengine可动态加载各种模块,且性能更高)

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上下文即可;

Nginx实现反向代理负载均衡实例:

Nginx实现缓存功能

为什么需要缓存? 缓存的最根本的目的是为了提高网站性能,减轻频繁访问数据而给数据库带来的压力。合理的缓存,还会减轻程序运算时,对CPU带来的压力 。在计算机现代结构中,操作内存中的数据比操作存放在硬盘上的数据是 要快N个数量级的,操作简单的文本结构的数据,比操作数据库中的数据快N个数量级 。 例如:每次用户访问网站,都必须从数据库读取网站的标题,每读一次需要 15毫秒的时间,如果有100个用户(先不考虑同一时间访问),每小时访问10次 ,那么就需要读取数据库1000次,需要时间15000毫秒.如果把页面直接变成 页面缓存,则每次访问就不需要去数据库读取,大大提升了网站性能。

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

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

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

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

1、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:指定最大缓存数据磁盘空间的大小;

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; proxy_cache_valid 404 1m;

配置Nginx缓存实例: 先配置proxy_cache_path,再配置proxy_cache引用、打开缓存空间,接着配置两个proxy_cache_valid;为方便调试测试,我们可以通过 add_header给请求响应增加一个头部信息,表示从服务器上返回的cache 状态怎么样(有没有命中),

主要配置如下: #定义一个完整的缓存空间; 缓存数据存储在/data/cache目录中/配置在该目 录下再分两层目录,名称为web(proxy_cache引用),10m内存空间大小/最大缓存数据磁盘空间的大小/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 Heiye-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分 钟:
    }  

Memcached

Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。它是一种基于内存的key-value存储, 用来存储小块的任意数据(字符串、对象)。这些数据 可以是数据库调用、API调用或者是页面渲染的结果。 Memcached简洁而强大。它的简洁设计便于快速开发 ,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。本质上,它是一个简洁的key-value存储系统。 一般的使用目的是,通过缓存数据库查询结果,减少数 据库访问次数,以提高动态Web应用的速度、提高可扩 展性。

memcached配置:

一、安装memcached yum intall memcached

二、配置文件修改

  • /etc/sysconfig/memcached#路径
  • PORT="11211" #端口
  • USER="memcached" #
  • 启动用户 MAXCONN="1024"
  • #最大连接 CACHESIZE="64" #缓存空间大小

memcached配置

  • -d 指定memcached进程作为一个守护进程启动
  • -m 指定分配给memcached使用的内存,单位是MB,默认为64;
  • -u 运行memcached的用户
  • -l <ip_addr> 监听的服务器IP地址
  • -p 指定端口 Listen on TCP port , the default is port 11211.
  • -c 设置最大运行的并发连接数,默认是1024
  • -R 为避免客户端饿死(starvation),对连续达到的客户端请求数设置一 个限额,如果超过该设置,会选择另一个连接来处理请求,默认为20 -k 设置锁定所有分页的内存,对于大缓存应用场景,谨慎使用该选项
  • -P 保存memcached进程的pid文件
  • -s 指定Memcached用于监听的UNIX socket文件
  • -a 设置
  • -s选项指定的UNIX socket文件的权限
  • -U Listen on UDP port , the default is port 11211, 0 is off.

 

如果有多个地址的话,使用逗号分隔,格式可以 为“IP地址:端口号” ,例如:-l 指定192.168.0.1:19830,192.168.0.2:13542;端口号也可以通过-p选项指定

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 reserved_fds 20 //
  • STAT cmd_get 328806688 //get命令(获取)总请求次数
  • STAT cmd_set 75441133 //set命令(保存)总请求次数
  • STAT get_hits 253547177 //总命中次数
  • STAT get_misses 75259511 //总未命中次数

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时间戳过期。 bytes 是在数据块中,需要被存储的字节数。基本上,这是一个需要存储在memcached的 数据的长度。 noreply (可选) 参数告知服务器不发送回复 value 是一个需要存储的数据。数据需要与上述选项执行命令后,将通过新的一行。

memcached测试脚本 

<?php
$mem = new Memcache;
$mem->connect("172.18.64.7", 11211); #连接Memcached 
$version = $mem->getVersion(); 
echo "Server's version: ".$version."\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)\n"; 
$get_result = $mem->get('Heiye'); #获取testkey的值 
echo "$get_result is from memcached server."; 
?>

memcached分布式存储原理(Hash环)

 

重点关注:

1、Nginx和apache主要区别在哪里?

2、如何优化Nginx参数?

3、Nginx的日志格式是怎样的?常见的日志参数有哪些?

4、在Nginx中,请说明Rewrite模块里break和last的区别?

5、Nginx的结构是怎样的?如何工作的?

6、Nginx中配置location时匹配顺序是怎样的?

7、如何用命令实现Nginx日志统计,得到访问ip最多的前10个?

8、lnmp该怎么优化?php-fpm有哪些优化技巧?

9、Nginx缓存实现是什么存放在内存,什么存放在硬盘?

10、Nginx实现负载均衡,如何获取客户端的IP地址?

11、memcached为什么效率高?常用的场景是?

 

  

posted @ 2017-11-23 20:07  黑夜繁星  阅读(484)  评论(0编辑  收藏  举报
AmazingCounters.com