一、前提 企业中,随着用户的增长,数据量也几乎成几何增长,数据越来越大,随之也就出现了各种应用的瓶颈问题。 问题出现了,我们就得想办法解决,一般网站环境,均会使用LAMP或者LNMP,而我们对于网站环境的优化,除了对源代码进行优化、SQL慢查询优化、SQL创建索引等之外,我们还可以对环境架构进行优化与扩展。 因此,我们引入了Nginx对站点实现负载均衡和动静分离,来加快访问速度。二、Nginx动静分离与负载均衡的实现机制 Nginx动静分离与负载均衡的的实现离不开反向代理,什么是反向代理呢?反向代理主要应用于集群环境中,有多个客户端给Nginx服务器发送的请求,当Nginx服务器接收到之后,会按照一定的规则将请求分发给了后端的业务处理服务器,此时,请求的来源也就是客户端,是明确的,但是请求具体由哪台服务器处理,并不明确,在这里,Nginx所扮演的就是一个反向代理角色。通过反向代理,我们无法直接看到后端服务器的服务器信息,因此反向代理具有隐藏业务服务器的作用!三、Nginx反向代理实现 1、网络拓扑 2、环境准备 我们准备好7台服务器,2台MySQL数据库做高可用,4台Web服务器,其中2台装NginxPHP做动态页面的负载均衡,另外2台装ApachePHP做静态页面的负载均衡,1台Nginx服务器,做反向代理服务器。 至于,服务器环境的安装部署,这里就不进行操作了,如有疑问的,可以留言或者查看小弟前面的文章。 3、Nginx服务器中Nginx服务配置文件修改 修改http部分 〔rootnginx〕vimusrlocalnginxconfnginx。conf 1、重新定义Nginx服务的日志记录格式,关于关键字的释义,大佬们可以参阅官网。 2、使用upstream关键字定义后端服务器 格式:uptream后端节点组名称(可自定义) serverIP地址权重最大失败次数失败超时时间意思是:当后端节点连续两次在3秒内无法连接时,将放弃连接该节点,Nginx将客户端请求发送给下一节点。 修改server部分,这里配置为Nginx虚拟机 〔rootnginx〕vimwdatanginxconfig80。conf 1、配置Nginxlocation匹配 分别配置以。html、。jpeg、。jpg、。gif、。png、。php为扩展名的文件的location规则。 proxysetheader:允许重新定义或添加字段传递给代理服务器的请求头。该值可以包含文本、变量和它们的组合。在本例中意思将真实的客户端地址添加到代理服务器的请求头中。 proxypass:设置反向代理的连接,格式为:proxypasshttp:后端节点组的名称;。 XForwardedFor:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP代理或者负载均衡服务器时才会添加该项。 remoteaddr:远端地址,也就是客户端IP地址 2、配置站点日志,这里将日志格式指定为我们在HTTP部分配置为的main规则。 Nginx反向代理的配置请参照图中进行修改,其他详细的配置参数,请参阅官网,后续继续更新。四、后端Nginx服务节点配置 后端Nginx服务器节点主要用来做以。php扩展名结尾的站点文件的访问和图片文件的访问,做到将图片资源单独剥离,以降低服务器负载。 1、配置以。php为扩展名的站点服务器 〔rootwebaconfig〕vim80。conf 如上图: a、listen:配置监听端口,这里配置为80端口,在生产环境中,我们可能会配置成443端口。 servername:配置域名,这里是实验环境,因此采用默认未配置域名。 index:配置支持的文件类型 root:配置全局站点路径 b、配置局部站点路径、fastcgi的地址端口(指的是phpfpm的监听地址及端口)、所支持的文件类型等 c、配置日志文件 Nginx站点的配置大概做到这种配置,基本就可以进行访问,如果在企业中需要更复杂的配置,请参考官方文档。 2、配置单独的图片资源站点 〔rootwebaconfig〕vim81。conf 如上图: 配置方式跟1的配置完全一样,只是修改一下图片资源的路径即可。 WebA和WebB的配置完全一样。最后修改完配置别忘了刷新,用命令:servicenginxreload即可五、后端Apache服务节点配置 1、Apache服务节点的配置基本也跟Nginx差不多,我们这里使用命令修改Apache配置文件。〔rootwebc〕sedishomewwwrootdefaultwdatahttpwwwgusrlocalapacheconfhttpd。conf 〔rootwebc〕sedishomewwwrootdefaultwdatahttpwwwgusrlocalapacheconfextrahttpdvhosts。conf 〔rootwebc〕sedisvarlogwwwlogsvarlogwwwlogsgusrlocalapacheconfhttpd。conf 〔rootwebc〕sedisvarlogwwwlogsvarlogwwwlogsgusrlocalapacheconfextrahttpdvhosts。conf 〔rootwebc〕sedisvarwwwwdatahttpwwwgusrlocalapacheconfextrahttpdvhosts。conf 在WebC和WebD中分别执行,主要设置网站根目录和日志目录。 2、修改Apache的端口和监听地址 〔rootwebc〕vimusrlocalapacheconfhttpd。conf 找到Listen行,修改为0。0。0。0:80 如图: 3、修改Apache日志文件格式,方便我们更好阅读Apache日志,也可以保持默认。 找到lt;IfModulelogconfigmodulegt;行,在下面的注释下面添加 LogFormataAtBb{Foobar}CfhH{Foobar}im{Foobar}n{Foobar}opPqrsTuUvVXmain 如图: 至于所添加的参数的含义,大家可参阅Apache官方文档。 到此Apache配置完成,还有一些关于Apache的权限配置等,这里就先不做特殊说明,后期再做更新。 启动httpd服务: servicehttpdstart六、添加或者上传站点文件 1、在WebA中的网站根目录下添加index。php文件,内容如下:lt;htmlgt; lt;titlegt; ThisisaPHPpage lt;titlegt; lt;bodygt; RealServerA lt;imgsrca2020imgdataimg。jpgdatasrc1。jpgalt1height200width200gt; lt;imgsrca2020imgdataimg。jpgdatasrc2。jpgalt2height200width300gt; lt;imgsrca2020imgdataimg。jpgdatasrc3。pngalt3height200width200gt; lt;imgsrca2020imgdataimg。jpgdatasrc4。gifalt4height200width380gt; ThisisaPHPpage! lt;bodygt; lt;htmlgt; lt;?php linknewmysqli(192。168。20。150,root,123456); if(!link)echoFAILD!连接错误,用户名密码不对; elseechoOK!MySQL可以连接。; linkgt;close(); ?gt; 2、在WebB中的网站根目录下添加index。php文件,内容如下:lt;htmlgt; lt;titlegt; ThisisaPHPpage lt;titlegt; lt;bodygt; RealServerB lt;imgsrca2020imgdataimg。jpgdatasrc1。jpgalt1height200width200gt; lt;imgsrca2020imgdataimg。jpgdatasrc2。jpgalt2height200width300gt; lt;imgsrca2020imgdataimg。jpgdatasrc3。pngalt3height200width200gt; lt;imgsrca2020imgdataimg。jpgdatasrc4。gifalt4height200width380gt; ThisisaPHPpage! lt;bodygt; lt;htmlgt; lt;?php linknewmysqli(192。168。20。150,root,123456); if(!link)echoFAILD!连接错误,用户名密码不对; elseechoOK!MySQL可以连接。; linkgt;close(); ?gt; 说明:这里,我们并没有严格按照PHP文件的格式来书写,只是简单的为了验证负载均衡和反向代理来书写的PHP文件。 3、在WebA和WebB的image(图片资源目录)目录上传1。jpg、2。jpg、3。png、4。gif文件,如图: 4、在WebC的站点根目录添加index。html文件,内容如下:lt;htmlgt; lt;titlegt; ThisisaHTMLpage lt;titlegt; lt;bodygt; RealServerC lt;imgsrca2020imgdataimg。jpgdatasrc1。jpgalt1height200width200gt; lt;imgsrca2020imgdataimg。jpgdatasrc2。jpgalt2height200width300gt; lt;imgsrca2020imgdataimg。jpgdatasrc3。pngalt3height200width200gt; lt;imgsrca2020imgdataimg。jpgdatasrc4。gifalt4height200width380gt; ThisisaHTMLpage! lt;bodygt; lt;htmlgt; 5、在WebD的站点根目录添加index。html文件,内容如下:lt;htmlgt; lt;titlegt; ThisisaHTMLpage lt;titlegt; lt;bodygt; RealServerD lt;imgsrca2020imgdataimg。jpgdatasrc1。jpgalt1height200width200gt; lt;imgsrca2020imgdataimg。jpgdatasrc2。jpgalt2height200width300gt; lt;imgsrca2020imgdataimg。jpgdatasrc3。pngalt3height200width200gt; lt;imgsrca2020imgdataimg。jpgdatasrc4。gifalt4height200width380gt; ThisisaHTMLpage! lt;bodygt; lt;htmlgt; 文件添加和上传完成,下面我们开始验证我们配置的动静分离和负载均衡是否成功。七、验证动静分离和负载均衡 1、在浏览中打开http:192。168。20。138index。php,效果如下图: 2、在浏览器http:192。168。20。138index。html,效果如下图: 3、查看Nginx负载均衡器的Nginx日志。 访问http:192。168。20。138index。php日志如下图: 如图可以看出,当我们访问http:192。168。20。138index。php时,服务器会将客户端请求按照我们配置的后端节点组中的顺序或者权重依次发给WebA和WebB,当网页中有图片请求时,也会按照顺序进行访问WebA和WebB的图片节点。 访问http:192。168。20。138index。html日志如下图: 如图可以看出,当我们访问http:192。168。20。138index。html时,对于html的请求,会依次发给WebC和WebD节点服务,而对于图片资源的访问,会将请求发给两台图片服务器。 由以上日志可以看出,Nginx配置动静分离和负载均衡时一件很简单的工作,配置过程,需要我们认真对待。八、总结 经过前面配置与测试,我们发现,Nginx反向代理动静分离、负载均衡很简单,只需要我们会使用两个关键字:upstream和proxypass即可,会使用这两个关键字,基本的反向代理动静分离、负载均衡是完全可以实现,但是在实际的生产环境中,需要我们做的还有很多。