nginx常用模块和lvs的使用及相关FAQ
1、详细描述常见nginx常用模块和模块的使用示例
- ngx_http_core_module nginx核心模块,在http配置中起主导地位,例如
-
-
-
listen 80 服务监听80端口 location / url匹配以/开头的路径 error page 404 404.html 状态码为404,返回404.html页面 server_name www.baidu.com 访问服务器的域名名称为www.baidu.com root /var/www/html 访问的根目录为/var/www/html
-
ngx_http_access_module 访问控制模块,适用于http, server, location, limit_except配置当中
-
-
deny all 阻止所有ip访问 access 192.168.1.1 允许192.168.1.1ip地址访问 - ngx_http_auth_basic_module 基于用户的访问控制,适用basic机制进行用户认证,首先在http配置中选择是否开启认证
-
auth_basic string | off;
auth_basic_user_file file; - 然后配置认证的文件,其中htpasswd由http-tools提供
- htpasswd -cb .passwd jony albert
- 最后配置认证文件
-
location /admin/ {
auth_basic "Admin";
auth_basic_user_file /etc/nginx/.passwd;
}
-
- ngx_http_log_module 记录日志模块,原文含义是
- The
ngx_http_log_module
module writes request logs in the specified format.Requests are logged in the context of a location where processing ends. It may be different from the original location, if an internal redirect happens during request processing.
- The
配置日志记录格式
log_format compression '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" "$gzip_ratio"'; 访问日志记录在某个文件 access_log /spool/logs/nginx-access.log compression buffer=32k;
- ngx_http_rewrite_module模块,http地址重写模块
- The ngx_http_rewrite_module module is used to change request URI using PCRE regular expressions, return redirects, and conditionally select configurations.
- 将用户请求的uri根据相应的配置规则进行调整,生成新的uri
- rewrite regex replacement [flag]
- 举例: 访问download目录下任意子目录下的media目录的任意文件都转换成mp3目录的以.mp3格式的文件
- 访问download目录下任意子目录下的audio目录的任意文件都转换成mp3目录的以ra格式的文件
- 同时返回状态码403
-
server { ... rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last; return 403; ... }
- ngx_http_referer_module模块,重新定义http头部referer信息
- The ngx_http_referer_module module is used to block access to a site for requests with invalid values in the “Referer” header field.
- 设置有效referer信息为 server_names *.baidu.com
-
valid_referers server_names *.baidu.com;
if($invalid_referer) {
return http://www.baidu.com/404.html
} -
定义referer首部的合法可用值;
none:请求报文首部没有referer首部;
blocked:请求报文的referer首部没有值;
server_names:参数,其可以有值作为主机名或主机名模式;
arbitrary_string:直接字符串,但可使用*作通配符;
regular expression:被指定的正则表达式模式匹配到的字符串; - 注意这里面的server_names加s,跟核心模块中的server_name 不一样
2、简述Linux集群类型、系统扩展方式及调度方法
linux集群类型有:LB, 负载均衡类型,HA,高可用类型,HP,高性能类型
常见的系统扩展类型有:
scale out(横向扩展):通过硬件或软件的方式,将以往由单一服务器负责的业务需求分配到其他节点的服务器上进行处理,但是从用户的视角来看,这些服务器是单一的系统。而lvs集群的扩展方式正是属于scale out。
常见的lvs集群的调度算法分为静态调度算法和动态调度算法。
静态调度算法:根据算法本身进行调度;
wrr:Weighted RR,加权轮询,调度器根据事先设置的权重来分配外部请求到集群中的节点。
sh:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的真实服务器Ip,从而实现会话绑定;
dh:Destination Hashing;目标地址哈希,将发往同一个目标地址的请求始终转发至第一次挑中的真实服务器IP,典型使用场景是正向代理缓存场景中的负载均衡;
wlc:Weighted Least Connections,调度器通过wlc调度算法根据事先设置的权重优化负载均衡型男。具有较高权重的服务器将承受较大比例的连接请求。
sed:Shortest Expection Delay,在WLC基础上改进,
Overhead = (activeconns+1)*256/权重
,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权重过大的时候,会倒置空闲服务器一直处于无连接状态。NQ:Never Queue Scheduling NQ,如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空闲。
lblc:基于地址的最小连接数调度(locality-based least-connection):将来自同一个目的地址的请求分配给同一台RS,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS,并以它作为下一次分配的首先考虑。
LBLCR:Locality-Based Least Connections with Replication,带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
3、简述lvs四种集群优点及使用场景
Lvs集群的类型包括:nat、dr、tun和fullnat四种类型,
lvs常用术语:
RS: Real Server,负责真正提供服务,后端服务器
VIP: LVS服务器上的公网IP,即Virtual IP
DIP: LVS服务器上的内网IP,即Director IP
RIP: Real Server上的内网IP
CIP:客户端的IP
- nat
- lvs的nat集群会将请求报文中的目标地址和目标端口修改为选定到的真实服务器的Ip和端口,从而实现报文的转发
-
lvs-nat集群应用时由以下几点注意实现:
1、RIP和DIP必须在同一个Ip网络中,且应使用私网地址,RS的网关要指向DIP;
2、请求报文和响应报文必须经由Director转发;
3、支持端口映射,可修改请求报文的目标端口;4、director必须为Linux系统,RS可以为任意系统;
- 主要工作流程为:
-
1、客户端的请求发往Director 的VIP。
2、Director发到客户端请求报文后,将报文中的目标Ip修改为集群中的选定的RIP,目标端口80也修改成8080,然后将请求报文发往RS。
3、当RS收到请求报文后,在检查报文的目标IP为自己的RIP后,会接受报文并进行处理响应。响应的源Ip为RIP,目标IP为CIP,端口不变。
4、Director收到RS的响应报文,修改响应报文的源IP为VIP,端口为80,然后转发给客户端。
5、客户端接受响应报文,其源IP为VIP,端口为80,整个过程对于客户端来说是透明无感知的。
- lvs-dr集群是Lvs的默认模式,又称为Direct Routing,直接路由模式。通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。
-
-
其工作流程如下:
1、客户端的请求会发往Director,此时,客户端请求报文的源Ip为CIP,目标Ip为Director的VIP。
2、当Director接受到客户端的请求报文后,Director会在请求报文外封装一个MAC首部,其源MAC为Director接口的MAC地址,目标MAC为选定RS的MAC地址;
3、当RS收到Director转发过来的请求报文后,检查发现请求报文的目标Ip为本地环回接口上配置的VIP,因此会接受报文进行响应处理。另外由于对ARP响应规则做了修改,因此RS不会把响应报文响应给director ,而是响应给GW;
4、客户端接收响应报文,完成通信。
-
- lvs-tun模式转发方式工作,不修改请求报文的IP首部,而在源IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RealServer,RealServer直接响应给客户端(源IP是VIP,目标IP是CIP)
-
此模式的注意要点:
(1) DIP, VIP, RIP都应该是公网地址;(2) RS的网关不能,也不可能指向DIP;
(3) 请求报文要经由Director,但响应不能经由Director;
(4) 不支持端口映射;
(5) RS的OS得支持隧道功能 - 优点在于Director只负责将请求包分配给对应的RS,而响应则由RS自己直接应答给客户端,因此director不再是瓶颈。但其缺点在于需要每个服务器都支持Ip tunnel协议
-
- lvs-fullnat模式即通过同时修改请求报文的源IP地址和目标IP地址进行转发的模式。此类型的模式,默认Kernel不支持。
- 此模式的注意要点为:
-
(1) VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP;
(2) RS收到的请求报文源地址是DIP,因此,只能响应给DIP;但Director还要将其发往Client;
(3) 请求和响应报文都经由Director;
(4) 支持端口映射; - 其工作流程为:
-
1.客户端的请求会发往Director,此时,客户端请求报文的源IP为CIP,目标IP为Director的VIP
2.当Director收到客户端的请求报文时,会将源IP修改为本机的DIP,同时将请求报文中的目标IP修改为后端某个RS的RIP,具体为哪个RS的RIP,取决于LVS使用的具体算法
3.当RS收到对应的请求报文时,会发现报文的目标IP就是自己的RIP,于是就会接收报文并 处理后进行响应。响应报文的源IP则为RIP,目标IP则为DIP
4.当Director收到对应的响应报文时,Director会将响应报文的源IP修改为VIP,目标IP修改为CIP,于是响应报文被发往客户端。
5.客户端则会收到响应报文,源IP为VIP,端口为80,而LVS相对于客户端而言,转换过程是透明的。
4、描述LVS-NAT、LVS-DR的工作原理并实现配置
- LVS-NAT的工作原理为将请求报文中的目标地址和目标端口修改为选定到的真实服务器的Ip和端口,从而实现报文的转发。
- 实现配置:
- 1)查看内核支持协议,应都为Y
- grep -i -C 10 "ipvs" /boot/config-VERSION-RELEASE.x86_64
- 2)修改内核支持转发
- sysctl -w net.ipv4.ip_forward=1
- 3)配置ipvsadm
- ipvsadm -A -t 172.16.0.1:80 -s rr
- ipvsadm -a -t 172.16.0.1:80 -r 192.168.1.1:80 -s wrr -w 1 -m
- ipvsadm -a -t 172.16.0.1:80 -r 192.168.1.2:80 -s wrr -w 1 -m
- 1)查看内核支持协议,应都为Y
- 实现配置:
- LVS-DR的工作原理为通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变;
- 实现配置:
- 修改内核
-
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
-
- 增加一个lo:0接口,作为vip
- ifconfig eno:0 172.168.1.1 network 255.255.255.255 broadcast 172.168.1.1 up
- 配置ipvsadm
- ipvsadm -A -t 172.168.1.1:80 -s rr
- ipvsadm -a -t 172.168.1.1:80 -r 192.168.1.1:80 -g
- ipvsadm -a -t 172.168.1.1:80 -r 192.168.1.2:80 -g
- 修改内核
- 实现配置: