编程技术分享平台

网站首页 > 技术教程 正文

Python运维:Nginx作为七层负载均衡调度器

xnh888 2024-10-11 19:57:29 技术教程 29 ℃ 0 评论

Nginx可以作为静态web服务器

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

(二)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为缓存在磁盘文件的路径,1:2:2表示存储在磁盘上的文件使用三个层次的目录结构,在内存中的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 内存分配器

物理内存分配:

内存的大小有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

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表