目录

  • 一、LNMP架构简介
  • 1、原理
  • 2、FastCGI介绍
  • 3、 PHP缓存加速器
  • 二、反向代理&负载均衡
  • 1、介绍
  • 2、功能作用
  • 3、配置文件及各模块功能介绍
  • (1)Nginx upstream 模块
  • (2)http_proxy_module 模块
  • 二、keepalived高可用
  • 1、Keepalived介绍
  • 2、Keepalived服务的三个重要功能
  • 3、keeppalived的安装与配置说明


一、LNMP架构简介

1、原理

LNMP即:linux、nginx、mysql、php

工作原理:

当LNMP组合工作时,首先是用户通过浏览器输入域名请求Nginx Web服务,如果请求是静态资源,则由Nginx解析返回给用户;如果是动态请求(.php结尾),那么Nginx 就会把它通过FastCGI接口(生产常用方法)发送给PHP引擎服务(FastCGI进程php-fpm)进行解析,如果这个动态请求要读取数据库数据,那么PHP就会继续向后请求MySQL数据库,以读取需要的数据,并最终通过Nginx服务把获取的数据返回给用户,这就是LNMP环境的基本请求顺序流程。

逻辑关系:

LNMP架构图解 lnmp技术栈_nginx


LNMP组合FastCGI方式调用PHP、Mysql:

LNMP架构图解 lnmp技术栈_负载均衡_02

2、FastCGI介绍

CGI
   CGI的全称为“通用网关接口”(Common Gateway Interface),为HTTP服务器与其他机器上的程序服务通信交流的一种工具,CGI程序须运行在网络服务器上。传统CGI接口方式的主要缺点是性能较差,无法实现高可用,所以就出现了FastCGI。

FastCGI
   FastCGI是一个可伸缩地、高速地在HTTP服务器和动态脚本语言间通信的接口(在Linux下,FastCGI接口即为socket,这个socket可以是文件socket,也可以是IPsocket),主要优点是把动态语言和HTTP服务器分离开来。多数流行的HTTP服务器都支持FastCGI,包括Apache、Nginx和Lighttpd等。

特点:

FastCGI的重要特点如下:

1、HTTP服务器和动态脚本语言间通信的接口或工具。
2、可把动态语言解析和HTTP服务器分离开。
3、Nginx、Apache、Lighttpd,以及多数动态语言都支持FastCGI。
4、FastCGI接口方式采用C/S结构,分为客户端(HTTP服务器)和服务器端(动态语言解析服务器)。
5、PHP动态语言服务器端可以启动多个FastCGI的守护进程(例如php-fpm(fcgiprocess mangement))。
6、HTTP服务器通过(例如Nginx fastcgi pass)FastCGI客户端和动态语言FastCGI服务器端通信(例如php-fpm)。

工作原理

Nginx不支持对外部动态程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。
  FastCGI接口在Linux下是socket,为了调用CGI程序,还需要一个FastCGI的wrapper(可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定的socket上,如端口或文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后派生出一个新的线程,这个线程调用解释器或外部程序处理脚本来读取返回的数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。

LNMP架构图解 lnmp技术栈_负载均衡_03

3、 PHP缓存加速器

操作码(opcode)和操作码缓存
操作码: 当客户请求一个PHP程序时,服务器的引擎会解析该PHP程序,并将其编译为特定的操作码(opcode),是执行PHP代码后的一种二进制表示形式。
操作码缓存: 将操作后的操作码缓存下来,并放到共享内存中,以便在下一次调用PHP页面时重用它,避免了相同代码的重复复制。

PHP缓存加速器的原理

1、nginx接收客户端的PHP程序访问请求;
2、nginx根据扩展名等过滤规则PHP程序请求提给解析PHP的FCGI (php-fpm) 进程;
3、PHP FPM进程调用PHP解析器读取站点磁盘上面的PHP文件,并加载到内存当中;
4、PHP解析器将PHP程序编译成为opcode(操作码)文件,然后把opcode缓存起来
5、PHP FPM引擎执行opcode树后,返回数据给Nginx,进而返回给客户端;
6、Nginx接收客户新的PHP程序请求,PHP FPM会直接读取缓存中的code并执行,将结果返回。该过程中无需第四步的操作从而提升PHP编译解析效率。

LNMP架构图解 lnmp技术栈_服务器_04

二、反向代理&负载均衡

1、介绍

  Nginx作为Nginx Proxy反向代理使用,因为这个反向代理功能表现的效果是负载均衡集群的效果,所以称之为Nginx负载均衡。
  普通负载均衡软件,例如的LVS,其功能只是对请求数据包的转发(也可能会改写数据包)、传递,其中DR模式明显的特征是从负载均衡下面的节点服务器来看,接收到的请求还是来自访问负载均衡器的客户端的真实用户,而反向代理就不一样了,反向代理接收访问用户的请求后,会代理用户重新发起请求代理下的节点服务器,最后把数据返回给客户端用户,在节点服务器看来,访问的节点服务器的客户端用户就是反向代理服务器了,而非真实的网站访问用户。
  总而言之就是LVS等的负载均衡是转发用户请求的数据包,而Nginx反向代理是接收用户的请求然后重新发起请求去请求其后面的节点。

2、功能作用

1 )把单台计算机无法承受的大规模并发访问或数据流量分担到多台节点设备上,分别进行处理,减少用户等待响应的时间,提升用户体验。
2) 单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统处理能力得到大幅度提高。
3) 7x24小时的服务保证,任意一个或多个有限后面节点设备宕机,不能影响业务。

3、配置文件及各模块功能介绍

配置文件:nginx.conf

cat nginx.conf
worker_processes 1;
events {
		worker_connections 1024;
http {
		include		mime.types; 	
		default_type	application/octet-stream;
		sendfile		on;
		keepalive_timeout 65;
		
		upstream www_server_pools { # <==这里是定义Web服务器池,包含了 9,10两个Web节点
			server 10.0.0.9:80 weight=l;
			server 10.0.0.10:80 weight=l;
		}
		server {           #<==这里是定义代理的负载均衡域名虚拟主机
		listen   80;
		server_name    www.etiantian.org;
		location / {
		proxy__pass http://www_server_pools; #<==访问 www.etiantian.org,请求发送给www_server_pools里面的节点
				   }
			}
}

(1)Nginx upstream 模块

  Nginx的负载均衡功能依赖于ngx http upstream module模块,所支持的代理方式包括proxy_pass、fastcgi_pass、memcached_pass等,新版Nginx软件支持的方式所有增加。本文主要讲解proxy_pass代理方式。

语法配置案例:

upstream blog_server_pool {     	#<== upstream是关键字必须要有,后面的www_server_pools为一个Upstream集群组的名字,可以自己起名,调用时就用这个名字
	server 10.0.10.5;       #<===server关键字是固定的,后面可以接域名(门户会用)或IP。如果不指定端口,默认是80端口。weight代表权重,数值越大被分配的请求越多,结尾有分号
	server 10.0.10.6:80 weight=l max_fails=l fail_timeout=10e; #<==这一行标签和上一行是等价的,此行多余的部分就是默认配置,不写也可以
	
	server 10.0.10.7:80 weight=l max_fails=2 fail_timeout=20s backup;        # <==server最后面可以加很多参数,具体参数作用看下文表格
	server 10.0.10.8:80 weight=l max_fails=2 fail_timeout=20s backup;
}

server后面内参数

说明

server 10.0.10.8:80

  负载均衡后面的RS配置,可以是IP或域名,如果端口不写,默认是80端口。髙并发场景下,iP可换成域名,通过DNS做负载均衡

weight= 1

  代表服务器的权重,默认值是1。权重数字越大表示接受的请求比例越大

max_fails=l

  Nginx尝试连接后端主机失败的次数,这个数值是配合proxy next upstream、fastcgi next upstream 和 memcached next upstream 这三个参数来使用的,当 Nginx接收后端服务器返回这三个参数定义的态码时,会将这个请求转发给正常工作的后端服务器,例如404、502、503 Max_fails的默认值是;企业场景下建议2 - 3次。如京东1次,蓝汛10次.根据业务需求去配置

backup

  热备配置(RS节点的高可用),当前面激活的RS都失败后会自动启用热备RS。这标志着这个服务器作为备份服务器,若主服务器全部宕机了,就会向它转发请求;注意,当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight 和 backup

fail_timeout=10s

  在max_fails定义的失败次数后,距离下次检査的间隔时间,默认是10s ;如果max_fails是5,它就检测5次,如果5次都是502。那么,它就会根据failjimeout的值,等待10s再去检查,还是只检查一次,如果持续502,在不重新加载Nginx配肾的情况下,每隔10s都只检测一次。常规业务2 - 3秒比较合理,比如京东3秒,蓝汛3秒,可根据业务需求去配置

down

  这标志着服务器永远不可用,这个参数可配合ip hash使用

upstream模块调度算法
  调度算法一般分为两类,第一类为静态调度算法,即负载均衡器根据自身设定的规则进行分配,不需要考虑后端节点服务器的情况,例如:rr、wrr、ip_hash等都属于静态调度算法。第二类为动态调度算法,即负载均衡器会根据后端节点的当前状态来决定是否分发请求,例如:连接数少的优先获得请求,响应时间短的优先获得请求。例如:least,conn、fair等都属于动态调度算法。
下面介绍一下常见的调度算法。

  (1)rr轮询(默认调度算法,静态调度算法)
  按客户端请求顺序把客户端的请求逐一分配到不同的后端节点服务器,这相当于LVS中的rr算法,如果后端节点服务器宕机(默认情况下Nginx只检测80端口),宕机的服务器会被自动从节点服务器池中剔除,以使客户端的用户访问不受影响。新的请求会分配给正常的服务器。

  (2 ) wrr (权重轮询,静态调度算法)
  在rr轮询算法的基础上加上权重,即为权重轮询算法,当使用该算法时,权重和用户访问成正比,权重值越大,被转发的请求也就越多。可以根据服务器的配置和性能指定权重值大小,有效解决新旧服务器性能不均带来的请求分配问题。
  (3) ip_hash (静态调度算法)
  每个请求按客户端I P 的h a s h 结果分配, 当新的请求到达时, 先将其客户端I P 通过哈希算法哈希出一个值, 在随后的客户端请求中, 客户I P 的哈希值只要相同, 就会被分配至同一台服务器, 该调度算法可以解决动态网页的s e s s i o n 共享问题, 但有时会导致请求分配不均, 即无法保证1 : 1 的负载均衡, 因为在国内大多数公司都是NAT上网模式, 多个客户端会对应一个外部I P , 所以, 这些客户端都会被分配到同一节点服务器, 从而导致请求分配不均。L V S 负载均衡的- p 参数、K e e p a l i v e d 配置里的persistence timeout 50参数都类似这个Nginx里的ip_hash参数,其功能都可以解决动态网页的session共享问题。

(2)http_proxy_module 模块

  proxy_pass指令属于ngx_http_proxy_module模块,此模块可以将请求转发到另一
台服务器, 在实际的反向代理工作中, 会通过l o c a t i o n 功能匹配指定的U R I , 然后把接
收到的符合匹配U R 1 的请求通过p r o x y _ pass抛给定义好的upstream节点池。
http proxy模块参数

http_proxy_module 模块相关参数

说明

proxysetheader

设置http清求header项传给后端服务器节点,例如:可实现让代理后端的服务器节点获取访问客户端用户的真实IP地址

clientbodybuffersize

用于指定客户端请求主体缓冲区大小,此处如了解前文的http请求包的原理就好理解了

proxy connect timeout

表示反向代理与后端节点服务器连接的超时吋间,即发起握手等候响应的超时时间

proxysendtimeout

表示代理后端服务器的数据回传时间,即在规定时间之内后端服务器必须传完所有的数据,否则,Nginx将断开这个连接

proxyreadtimeout

设置Nginx从代理的后端服务器获取信息的时间,表示连接建立成功后,Nginx等待后端服务器的响应时间,其实是Nginx已经进人后端的排队之中等候处理的时间

proxybuffersize

设置缓冲区大小,默认该缓冲区大小等于指令proxy buffers设置的大小

proxybuffers

设置缓冲区的数量和大小。Nginx从代理的后端服务器获取的响应信息,会放置到缓冲区

proxybusybufferssize

用于设置系统很忙时可以使用的proxy_buffers大小,官方推荐的大小为proxy buffers*2

proxytempfilewritesize

指定proxy缓存临时文件的大小

二、keepalived高可用

1、Keepalived介绍

  Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现髙可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。
  Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router Redundancy Protocol (虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静路由单点故障问题的,它能够保证当个别节点宕机吋,整个网络可以不间断地运行。所以,Keepalived-方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。

2、Keepalived服务的三个重要功能

  1.管理LVS负载均衡软件
   Keepalived可以通过读取自身的配置文件,实现通过更底层的接口直接管理LVS的配置以及控制服务的启动、停止等功能,这使得LVS的应用更加简单方便了。
  2. 实现对LVS集群节点健康检查功能(healthcheck)
   Keepalived可以通过在自身的keepalived.conf文件里配置LVS的节点1P和相关参数实现对LVS的直接管理;除此之外,当LVS集群中的某一个甚至是几个节点服务器同时发生故障无法提供服务时,Keepalived服务会自动将失效的节点服务器从LVS的正常转发队列中清除出去,并将请求调度到别的正常节点服务器上,从而保证最终用户的访问不受影响;当故障的节点服务器被修复以后,Keepalived服务又会自动地把它们加人到正常转发队列中,对客户提供服务。
  3. 作为系统网络服务的高可用功能(failover)
   Keepalived可以实现任意两台主机之间,例如Master和Backup主机之间的故障转移和自动切换,这个主机可以是普通的不能停机的业务服务器,也可以是LVS负载均衡、Nginx反向代理这样的服务器。Keepalived高可用功能实现的简单原理为,两台主机同时安装好Keepalived软件并启动服务,开始正常工作时,由角色为Master的主机获得所有资源并对用户提供服务,角色为Backup的主机作为Master主机的热备;当角色为Master的主机失效或出现故障时,角色为Backup的主机将自动接管Master主机的所有工作,包括接管VIP资源及相应资源服务;而当角色为Master的主机故障修复后,又会自动接管回它原来处理的工作,角色为Backup的主机则同时释放Master主机失效时它接管的工作,此时,两台主机将恢复到最初启动时各自的原始角色及工作状态。

3、keeppalived的安装与配置说明

安装:
yum install keepalived -y
启动:
/etc/init.d/keepalived start
停止:/etc/init.d/keepalived stop

1、默认的配置文件
/etc/keepalived/keepalived.conf

(1 )全局定义(Global Definitions)部分
	这部分主要用来设置Keepalived的故障通知机制和Router ID标识。示例代码如下:
	
	[root@lb01 -]# head -13 /etc/keepalived/keepalived.conf I cat -n
	1 ! Configuration File for keepalived   ##>>>!开头和#号开头一样,都是注释。

	3 global_defs {  		##>>>3 - 8行是定义服务故障报警的Email地址。作用是当服务发生切换或RS节点
								 等有故障时,发报警邮件。这几行是可选配置,notification email指定在keepalived发
								生事件时,需要发送的Email地址,可以有多个,每行一个。
	4 notification_email { 		##>>>
	5 acassenQf irewall.loc   	##>>>
	6 failover@firewall.loc		##>>>
	7 sysadmin®firewall.loc		##>>>
	8 }
	9 notification_email_from Alexandre.Cassen@firewall•loc     ##>>>是指定发送邮件的发送人,即发件人地址,也是可选的配置
	10 smtp_server 192.168.200.1         ##>>>smtpserver指定发送邮件的smtp服务器,如果本机开启了 sendmail或
											  postfix,就可以使用上面默认配置实现邮件发送,也是可选配置。
	11 smtp_connect一timeout 30         ##>>>smtp connect timeout是连接smtp的超时时间,也是可选配置。
	12 router一id LVS_DEVEL             ##>>>是Keepalived服务器的路由标识(router id)。在一个局域网内,这个标识
											 (router_id)应该是唯一的。
	13 }

**VRRP实例定义区块(VRRP instance (s))部分**

	15 vrrp_instance VI_1 {
	16 state MASTER
	17 interface ethO
	18 virtual一router_id 51
	19 priority 100
	20 advert一int 1
	21 authentication {
	22 auth_type PASS
	23 auth_pass 1111
	24 }
	25 virtual_ipaddress {
	26 192.168.200.16
	27 192.168.200.17
	28 192.168.200.18
	29 }
	30 }

		第15行表示定义一个vnp instance实例,名字是VI I,每个vrrp instance实例可
	以认为是Keepalived服务的一个实例或者作为一个业务服务,在Keepalived服务配置
	中,这样的vrrp instance实例可以有多个。注意,存在于主节点中的vrrp instance实例
	在备节点中也要存在,这样才能实现故障切换接管。
		
		第16行state MASTER表示当前实例VI_1的角色状态,当前角色为MASTER,
	这个状态只能有M A S T E R 和B A C K U P 两种状态, 并且需要大写这些字符。其中
	MASTER为正式工作的状态,BACKUP为备用的状态。当MASTER所在的服务器故障
	或失效时,BACKUP所在的服务器会接管故障的MASTER继续提供服务。
	
		第17行interface为网络通信接口。为对外提供服务的网络接口,如ethO、ethlo
	当前主流的服务器都有2 ~ 4个网络接口,在选择服务接口时,要搞清楚了。
	
		第18行virtual_router_id为虚拟路由ID标识,这个标识最好是一个数字,并且要
	在一个keepalived.conf配置中是唯一的。但是MASTER和BACKUP配置中相同实例的
	virtual_router_id又必须是一致的,否则将出现脑裂问题。
		
		第19行priority为优先级,其后面的数值也是一个数字,数字越大,表示实例优先
	级越高。在同一个vrrp instance实例里,MASTER的优先级配置要髙于BACKUP的。
	若MASTER的priority值为150,那么BACKUP的priority必须小于150, 一般建议间
	隔50以上为佳,例如:设置BACKUP的priority为100或更小的数值。
	第20行advert_int为同步通知间隔。MASTER与BACKUP之间通信检查的时间间
	隔,单位为秒,默认为lo
	
		第21 ~ 24行authentication为权限认证配置。包含认证类型(auth type)和认证
	密码(auth_pass)。认证类型有 PASS ( Simple Passwd ( suggested))、AH (IPSEC ( not
	recommended))两种,官方推荐使用的类型为PASSO验证密码为明文方式,最好长度
	不要超过8个字符,建议用4位的数字,同一 vrrp实例的MASTER与BACKUP使用相同的密码才能正常通信。
      
        第25〜29行virtual_ipaddress为虚拟IP地址。可以配置多个IP地址,每个地址占一行,配置时最好明确指定子网掩码以及虚拟IP绑定的网络接口。否则,子网掩码
	默认是32位,绑定的接口和前面的interface参数配置的一致。注意,这里的虚拟IP就是在工作中需要和域名绑定的IP,即和配置的高可用服务监听的IP要保持一致!