Nginx作为七层负载均衡调度器

来源:互联网 发布:安卓模拟器知乎 编辑:程序博客网 时间:2024/06/03 05:29


Nginx可以作为静态web服务器
Nginx在实际运维中,用到最多的地方是反向代理服务器,或负载均衡服务器

Alt text

(二)ngx_http_proxy_module模块详解

Nginx在实际运维中,用到最多的地方是反向代理服务器,或负载均衡服务器

  • Nginx使用proxy_pass和fastcgi_pass实现单台主机的动静分离(PHP以daemon方式运行)
# 如果用户请求的URI为/index.html
# 所有的静态请求调度到httpd服务器
# 用户请求的URI会加到http://192.168.23.11:8080,请求会变成http://192.168.23.11:8080/index.html
location ~* \.html$ {
proxy_pass http://192.168.23.11:8080;
}
# php以php-fpm的模式运行
# 如果用户请求的URI为/index.php
# 所有的动态请求调度到PHP服务器
location ~* \.php$ {
fastcgi_pass 192.168.23.12:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /app/php/$fastcgi_script_name;
include fastcgi_params;
}
  • Nginx使用proxy_pass和fastcgi_pass实现单台主机的动静分离(PHP以httpd模块方式运行)
location ~* \.html$ {
proxy_pass http://192.168.23.11:8080;
}
location ~* \.php$ {
proxy_pass http://192.168.23.12:8080;
}
  • 解决内网服务器的日志中记录的客户端IP地址为反代的IP(如果代理前端有CDN,需要在CDN上配置X-Forwarded-For)
通常的情况下,对内网中的web服务器的日志进行分析是非常关键的,但是基于前端调度器调度之后,所有的web服务器的日志信息中客户端IP地址都变成了调度器的内网IP地址。那么在这种情况下,需要使用Nginx的一个指令:proxy_set_header 将客户端的IP地址获得后,传递给内网的web服务器,让内网的web服务器的日志的客户端IP地址为真实的客户端IP地址
# 在Nginx中配置
proxy_set_header X-Forwarded-For $remote_addr;
# 在httpd中配置
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
add_header X-cache $uptream_cache_status;
  • 如何使用反向proxy的cache机制(与fastcgi的缓存类似,先在server中定义再调用)
# proxy定义缓存的方式与fastcgi的方式一样
1:在http段中先定义缓存,其中/var/cache/nginx/proxy_cache为缓存在磁盘文件的路径,122表示存储在磁盘上的文件使用三个层次的目录结构,在内存中的keys缓存名为proxy_cache,大小为10M,磁盘最大缓存为10G。缓存目录/var/cache/nginx/proxy_cache需要提前创建好
http{
proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2:2 keys_zone=proxy_cache:100m max_size=10g;
}
2:调用缓存功能写在location中调用
location / {
proxy_pass http://192.168.23.11;
index index.html index.htm;
# 指定的key的名称
proxy_cache_key $request_uri;
# 调用缓存
proxy_cache proxy_cache;
# 指定不同的状态码的缓存时长
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
}

(三)ngx_http_headers_module模块详解

这个模块可以给响应报文添加自定义首部

  • 可以在location段中添加
# 添加一个响应头,指明响应请求的服务器的主机名
add_header X-Server $server_name;
# 指明缓存的超时时长,超过这段时间缓存服务器就会向后端真实服务器请求,并更新缓存
expires 24h;
# 告知客户端,响应客户端请求的报文是缓存中加载的,还是后端服务器响应的
add_header X-cache $uptream_cache_status;

(四)ngx_stream_upstream_module模块详解(做实验的时候,请关闭cache缓存功能)

这个模块是实现了Nginx的七层负载均衡

  • 功用:可以将后端响应客户端请求的真实的服务器进行分组,实现后端服务器的批量上线和下线
  • 使用方式:服务器组必须定义在http端中,在location段使用反代指令调用
# 服务器组的选项说明
1:weight=1 指定权重
2:max_fails=3 指定如果想后端服务器请求3次,依然不相应,则将其标记为不可用
3:fail_timeout=10s 指定如果请求超过了10秒,后端服务器任然无法响应,那么表示此次请求失败
4:backup 指定此服务器为备用服务器,当所有的后端服务器都不用时启用,俗称救火服务器
5:down 指定此服务器下线,不再接受用户的请求
http{
# 状态服务器组, 注意组名不能使用下划线
upstream static-servers {
# 指定给静态服务器组调度请求的时候,使用最少连接算法进行调度,此调度算法也会考虑权重的影响
least_conn;
# 指定后端服务器保持连接的个数
keepalive 3;
server 192.168.23.11:80 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.23.12:80 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.23.13:80 weight=1 backup;
server 192.168.23.14:80 weight=1 down;
}
# 动态服务器组, 注意组名不能使用下划线
upstream dynamic-servers {
# 指定动态服务器组使用哈希调度算法进行调度,原地址hash算法hash的是客户端IP,那么就使得同一个客户端的IP地址始终发往同一个后端主机。粒度为IP级别
ip_hash;
# 基于hash算法进行调度,同一个请求的URI调度到同一台动态服务器上,实现会话绑定。粒度为URI级别
hash $request_uri;
server 192.168.23.16:80 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.23.17:80 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.23.18:80 weight=1 backup;
server 192.168.23.19:80 weight=1 down;
}
# 调用后端服务器组
location ~* \.html$ {
proxy_pass http://static-servers;
}
# 调用后端服务器组
location ~* \.php$ {
proxy_pass http://dynamic-servers;
}
}

(五)ngx_http_upstream_hc_module模块详解(只有商业版才可以使用)

参考博客: http://blog.csdn.net/nimeijian/article/details/73302274
github 开源模块:https://github.com/yaoweibin/nginx_upstream_check_module

  • 功用:用于检查后端主机的健康状态

  • health_check指令详解

match=name:指定按照什么样的标准判断后端服务器的健康状态
interval=3:指定多长时间检测一次后端服务器
fails=3:指定如果想后端服务器请求3次,依然不相应,则将其标记为不可用
passes=1:指定后端服务器只要有一次响应了请求,则将其标记为可用
uri=/.health_page:指定健康状态检测所请求的URI资源路径,这里是请求站点下的.health_page页面
port=80:向服务器的哪个端口发起健康状态的检查请求
http{
# 指明健康状态判定的条件
match health {
status 200;
header Content-Type = text/html;
body ~ "health";
}
# 调用后端服务器组
location ~* \.html$ {
proxy_pass http://static-servers;
health_check match=health interval=3 fails=3 passes=1 uri=/.health_page port=80;
}
# 调用后端服务器组
location ~* \.php$ {
proxy_pass http://dynamic-servers;
}
}

(六)memcached缓存入门


  • memcached基于K/V存储
  • 将所有的数据都是存储在内存中
  • 每一个存储项都包含 key(键)、flag(标志位)、expire time(过期时间)、size(值的字节大小)、value(值)
  • memcached的脚本参数配置文件
/etc/sysconfig/memcached
  • 安装memcached
yum install -y memcached
[root@7 ~]# rpm -ql memcached
/etc/sysconfig/memcached
/usr/bin/memcached
/usr/bin/memcached-tool
/usr/lib/systemd/system/memcached.service
/usr/share/doc/memcached-1.4.15
/usr/share/doc/memcached-1.4.15/AUTHORS
/usr/share/doc/memcached-1.4.15/CONTRIBUTORS
/usr/share/doc/memcached-1.4.15/COPYING
/usr/share/doc/memcached-1.4.15/ChangeLog
/usr/share/doc/memcached-1.4.15/NEWS
/usr/share/doc/memcached-1.4.15/README.md
/usr/share/doc/memcached-1.4.15/protocol.txt
/usr/share/doc/memcached-1.4.15/readme.txt
/usr/share/doc/memcached-1.4.15/threads.txt
/usr/share/man/man1/memcached-tool.1.gz
/usr/share/man/man1/memcached.1.gz
  • 一些memcached的默认值说明
cat /etc/sysconfig/memcached
PORT="11211" :默认的端口
USER="memcached" :默认运行memcached的用户
MAXCONN="1024" :默认最大并发连接数1024
CACHESIZE="64" : 默认内存缓存的空间64M
  • 如何连接至memcached服务器,检查其缓存的信息
telnet 192.168.23.6 11211
1:stats //可以查看服务器的状态信息
STAT pid 17357 //memcached服务进程的进程ID
STAT uptime 1569 //从启动到当前所经过的时间,单位是秒。
STAT time 1439175334 //服务器当前的unix时间戳
STAT version 1.4.15 //memcache版本
STAT libevent 2.0.21-stable //libevent版本
STAT pointer_size 64 //当前操作系统的指针大小(32位系统一般是32bit,64就是64位操作系统)
STAT rusage_user 0.027995 //进程的累计用户时间
STAT rusage_system 0.023996 //进程的累计系统时间
STAT curr_connections 10 //当前打开着的连接数
STAT total_connections 12 //表示从memcached服务启动到当前时间,系统打开过的连接的总数。
STAT connection_structures 11 //表示从memcached服务启动到当前时间,被服务器分配的连接结构的数量
STAT reserved_fds 20
STAT cmd_get 9 //get命令的请求次数
STAT cmd_set 3 //set命令的请求次数
STAT cmd_flush 0 //flush_all命令的请求次数
STAT cmd_touch 0 //touch命令的请求次数
STAT get_hits 0 //表示get数据命中的次数。
STAT get_misses 0 //表示get数据未命中的次数。
STAT delete_misses 0 //表示delete数据未命中的次数。
STAT delete_hits 0 //表示delete数据命中的次数。
STAT incr_misses 0 //表示incr数据未命中的次数。
STAT incr_hits 0 //表示incr数据命中的次数。
STAT decr_misses 0 //表示decr数据未命中的次数。
STAT decr_hits 0 //表示decr数据命中的次数。
STAT cas_misses 0 //表示cas数据未命中的次数。
STAT cas_hits 0 //表示cas数据命中的次数。
STAT cas_badval 0 //cas操作找到key,但版本过期,没有设置成功
STAT touch_hits 0 //表示touch数据命中的次数。
STAT touch_misses 0 //表示touch数据未命中的次数。
STAT auth_cmds 0 //认证命令处理的次数
STAT auth_errors 0 //认证失败的次数
STAT bytes_read 1248 //从网络读取的总的字节数。
STAT bytes_written 1052 //发送到网络的总的字节数。
STAT limit_maxbytes 67108864 //memcached服务缓存允许使用的最大字节数。这里为67108864字节,也就是是64M与我们启动memcached服务设置的大小一致。
STAT accepting_conns 1 //服务器是否达到过最大连接(0/1)
STAT listen_disabled_num 0 //失效的监听数
STAT threads 4 //被请求的工作线程的总数量。
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT malloc_fails 0
STAT bytes 0 //已用的缓存空间大小
STAT curr_items 1 //当前存储的数据总数
STAT total_items 1 //总共缓存的keyvalue数,包括过期删除的
STAT expired_unfetched 0 //连接操作主动放弃数目
STAT evicted_unfetched 0
STAT evictions 0 //为获取空闲内存而删除的items数(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items)
STAT reclaimed 0 //已过期的数据条目来存储新数据的数目(回收再利用的条目)
2:stats items
STAT items:1:number 1 //缓存项数量
STAT items:1:age 946 // 缓存了多长时间
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:1:reclaimed 1
STAT items:1:expired_unfetched 0
STAT items:1:evicted_unfetched 0
3:stats slabs //查看
STAT 1:chunk_size 96 //当前slab每个chunk的大小
STAT 1:chunks_per_page 10922 //每个Page有多少个chunk
STAT 1:total_pages 1 //分配给当前slab的page总数
STAT 1:total_chunks 10922 //当前slab最多能够存放的chunk数,应该等于chunck_per_page * total_page
STAT 1:used_chunks 1 //使用了多少个chunk
STAT 1:free_chunks 10921 //过期数据空出的chunk里还没有被使用的chunk数
STAT 1:free_chunks_end 0 //新分配的但是还没有被使用的chunk数
STAT 1:mem_requested 71 //请求存储在该slab的字节数
STAT 1:get_hits 7
STAT 1:cmd_set 6
STAT 1:delete_hits 1
STAT 1:incr_hits 3
STAT 1:decr_hits 1
STAT 1:cas_hits 0
STAT 1:cas_badval 0
STAT 1:touch_hits 0
STAT active_slabs 1
STAT total_malloced 1048512
END
4:stats sizes //查看slabs大小
stats sizes
STAT 96 1 //大小为96的chunk有1个item
END
  • memcached交互式shell中的命令详解
1:stats //查看memcached服务器的状态信息
2:stats items //查看此时memcached服务器中缓存了多少缓存项
3:stats slabs //查看slabs状态
4:stats sizes //查看slabs大小
5:set //指定一个key对于的value
set name 0 60 3
yhy
STORED
6:add //添加一个key
add class 0 600 3
ops
STORED
7:replace //替换key的value
8:append // 向key的value后面再添加值
append class 0 6000 9
uplooking
STORED
9:prepend //向key的value前面再添加值
prepend class 0 6000 9
uplooking
STORED
10:get //获取key对于的value
get name
VALUE name 0 3
yhy
11:delete //删除key
delete class
DELETED
12:incr:当一个key对应的value为数值的时候,让其加一个数
add age 0 600 2
25
STORED
incr age 60
85
get age
VALUE age 0 2
85
END
13:decr:当一个key对应的value为数值的时候,让其减一个数
decr age 30
157
get age
VALUE age 0 3
157
END
14:flush_all:清空所有的缓存,将有效时长设置为0,不会删除key
  • memcached的常用选项详解
-l :设置监听的地址
-d :以守护进程的模式运行
-u :以哪个用户运行
-m :指定缓存空间大小,默认是64 megabytes,
-c :指定最大并发连接数,默认是1024
-p :设置监听的端口
-U :设置udp的端口,可选
-M:缓存空间耗尽时,向客户端返回错误信息,而不是使用LRU算法进行缓存清理
-f :设置每类slab中的chuck的倍数增长因子
-t :设置处理用户请求的线程数
-n:设置chuck的最小值
启动命令运行memcached,指定chuck的增长因子为1.1
memcached -u memcached -f 2 -vv
  • memcached内存管理机制---slabs 内存分配器

Alt text

物理内存分配:
内存的大小有page决定,每一个page为4KB大小
逻辑内存分配:
每一个slab是1M
每一个chunks是1KB
  • 安装libmemcached工具包,可以在命令行分析memcached的状态信息
yum install -y libmemcached
如:查看memcached服务器的状态信息
memstat --servers=127.0.0.1
memcached-tool 127.0.0.1:11211
如果想详细了解,请移步gooble

(七)PHP连接memcached


  • PHP、Python连接memcached的方式
1:php-pecl-memcached.x86_64
2:python-memcached.noarch
  • 实际操作步骤
1:在安装了PHP的服务器上,安装php-pecl-memcached
yum install -y httpd php php-pecl-memcached
2:修改配置文件/etc/php.ini,添加
session.save_handler = memcache
session.save_path = "tcp://192.168.23.10:11211?persistent=1&weight=1&timeout=1&retry_interval=15"
extension=/usr/lib64/php/modules/memcached.so
3:将PHP的会话保存在memcached中,PHP页面如下
<?php
ini_set('display_errors', 'on');
$mem = new Memcached;
$mem->addServer("192.168.23.10", 11211);
$mem->set('key', 'www.uplooking.com');
$val = $mem->get('key');
echo $val;
?>
4:在memcached的服务器上安装telnet
yum install -y memcached
yum install -y telnet
5:在没有访问页面前,测试下是否memcached中有缓存项
memcached-tool 127.0.0.1:11211
6:访问页面后,测试下是否memcached中有缓存项
memcached-tool 127.0.0.1:11211
7:使用telnet登入
telnet 127.0.0.1 11211
get key
VALUE key 0 17
www.uplooking.com
END