利用nginx实现网站动静分离及nginx实现负载均衡集群

动静分离

一个受用户喜欢的网站常常网页都非常漂亮又方便阅读,为了让网站更加的漂亮我们的web前端工程师会给网站加上各种各样的如图片这样的装饰,但是诸如图片这样的静态文件所消耗的带宽又大而且服务器也不需要额外的处理就能将图片直接推送至客户端,这样的话无疑对带宽是个很大的考验,如果这个时候服务器上又需要处理动态内容,那么服务器在处理好动态内容要推送至客户端的时候带宽却被因图片被反复访问而占用,那无疑速度上会大打折扣,用户的体验感就会非常不好。

那如果我们用一台专门的服务器来提供图片和其他静态内容服务,一台服务器来提供诸如php这样的动态服务那么客户在访问网站的时候动态内容会很快就加载出来,网页很快就显示出来然后图片文件再慢慢加载完成,这样的好处是网页相应速度很快,给客户的体验是比较好的,客户感觉到的是网页瞬间相应只是图片加载的速度稍慢而已,这比客户等半天然后网页连带图片一起出现要好得多。

实现就非常简单了。说了这么多,下面开始实现吧。


操作

环境

三台CentOS7.3分别为:
1,nginx代理服务器,hostname:nginx,IP172.16.250.135
2,httpd服务器,hostname:html,IP172.16.254.235
3,httpd+php服务器,hostname:php,IP172.16.250.39


第一步,搭建httpd服务器并创建测试页

[root@html ~]# yum -y install httpd #安装包
[root@html ~]# echo '<h1>html server</h1>' > /var/www/html/index.html #创建测试页面
[root@html ~]# systemctl start httpd #启动服务

如上面简单三步就完成了静态内容服务器的配置,下面配置动态内容服务器

[root@php ~]# yum -y install httpd php #安装包
[root@php ~]# echo '<?php phpinfo(); ?>' > /var/www/html/index.php #创建测试页面
[root@php ~]# systemctl start httpd #启动服务

第二步,配置nginx服务器

[root@nginx ~]# yum -y install nginx #安装包
[root@nginx ~]# vim /etc/nginx/conf.d/test.conf #创建并写入以下内容
server {
        listen 80; #监听端口
        server_name 172.16.250.135; #服务名
        location ~* \.html{ #这里的意思是只要是以.html结尾的请求都发往172.16.254.235主机
        proxy_pass http://172.16.254.235:80;
        }
        location ~* \.php { #这里的意思是只要是以.php结尾的请求都发往172.16.250.39主机
        proxy_pass http://172.16.250.39:80;
        }
}
[root@nginx ~]# systemctl start nginx #启动服务

这样的话架构基本完成


第三步,测试

首先我先单独访问两个主机看看页面是否正常

访问172.16.254.235(静态)

如图,页面正常

访问172.16.250.39(动态)

如图,php的信息页面

那么现在直接访问172.16.250.135/index.html和index.php看看

访问index.html

访问index.php

如图,一切正常,那么这样就算是成功实现了。

我以上的动静分离实现是一个非常简单的演示,在实际环境中静态内容肯定不止图片,而且一个页面也不止一个链接,该博客意在理解动静分离的原理。


负载均衡

上面我简单演示了动静分离的实现,那么我这里再接着演示一下nginx负载均衡的实现。


操作

环境

注意:为了排除任何干扰因素,我将刚才的虚拟机全部恢复了一下重新开始做。

依然是刚才的那三台CentOS7.3:
1,nginx代理服务器,hostname:nginx,IP172.16.250.135
2,httpd1服务器,hostname:html1,IP172.16.254.235
3,httpd1服务器,hostname:html2,IP172.16.250.39


第一步,配置httpd服务器

[root@html1 ~]# yum -y install httpd #安装包
[root@html1 ~]# echo 'html1 test server' > /var/www/html/index.html #创建测试页
[root@html1 ~]# systemctl start httpd #启动服务

html1服务器配置完成,接下来配置html2

[root@html2 ~]# yum -y install httpd #安装包
[root@html2 ~]# echo 'html2 test server' > /var/www/html/index.html #创建测试页
[root@html2 ~]# systemctl start httpd #启动服务

第二步,配置nginx

不管是实现动静分离还是做负载均衡主要还是nignx的配置方法,所以nginx的配置才是关键。

[root@nginx ~]# yum -y install nginx #安装包
[root@nginx ~]# vim /etc/nginx/nginx.conf #打开nginx的主配置文件在http下加入
upstream httpdsrvs { #定义服务器组命名为httpdsrvs
    server 172.16.254.235:80;
    server 172.16.250.39:80;
}
[root@nginx ~]# vim /etc/nginx/conf.d/test.conf #创建并写入
server {
        listen 80;
        server_name 172.16.250.135;
        location / {
                proxy_pass http://httpdsrvs; #其他的地方都相同,这里要注意要写刚才定义的服务器组名
        }
}

到这里就基本完成,下一步就开始测试


第三步,测试

因为定义的主页只有一串字符,所以直接用另外一台CentOS机器测试。

[root@mini7 ~]# for i in {1..10};do curl http://172.16.250.135;done
html1 test server
html2 test server
html1 test server
html2 test server
html1 test server
html2 test server
html1 test server
html2 test server
html1 test server
html2 test server
[root@mini7 ~]# 

如上图,连续访问十次Nginx服务器,得到的是两台httpd服务器轮询的结果,其实这里还可以更改权重实现不同权重的服务器分摊的访问不同。只需要在Nginx服务器上更改之前定义的服务器组。

[root@nginx ~]# vim /etc/nginx/nginx.conf
upstream httpdsrvs {
    server 172.16.254.235:80 weight=2; #html1设置权重为2
    server 172.16.250.39:80 weight=1; #html2设置权重为1
}
[root@nginx ~]# nginx -s reload #重载配置文件

配置完毕,然后我们再次测试

[root@mini7 ~]# for i in {1..10};do curl http://172.16.250.135;done
html1 test server
html2 test server
html1 test server
html1 test server
html2 test server
html1 test server
html1 test server
html2 test server
html1 test server
html1 test server
[root@mini7 ~]# 

可以明显地看到html1在html2被访问一次后要被访问2次,这就是刚才设置的权重的效果,这样就可以让不同性能的服务器能够合理的利用性能。


演示完毕,要转载的朋友请注明源地址,谢谢。