【运维知识进阶篇】集群架构-Nginx动静分离详解

我们先前将静态资源放到NFS,动态资源放到MySQL,一是为了提高我们Web服务器性能,减轻它的压力,另一面如果Web宕机了,我们的静态和动态资源还可以访问到。但是之前方式不管是静态还是动态文件,都是走的代码文件,通过代码文件调取的资源,那么我们越过代码文件去访问我们的资源,效率不是更高吗,如果服务器没出问题,但是代码出了问题,我们依旧可以访问到我们的资源。

本篇文章介绍Nginx动静分离,通过中间件将动态请求和静态请求进行分离,减少不必要的请求和请求时长,这样做提升了服务器运行效率,即使动态服务不可用了,但是静态资源不会收到影响。

使用Web01配置静态资源的文件

[root@Web01 wordpress]# vim /etc/nginx/conf.d/jing.conf
server {
        listen 80;
        server_name jing.koten.com;
        root /code;
        index index.html;

        location ~* .*\.(jpg|png|gif)$ {
                root /code/images;
        }
}
~                                                  
~                                                  
~                                                  
~                                                  
~                                                  
~                                                  
 /code/index.html
[root@Web01 wordpress]# mkdir /code/images/
[root@Web01 wordpress]# cd /code/images/
[root@Web01 images]# rz

[root@Web01 images]# 

【运维知识进阶篇】集群架构-Nginx动静分离详解_第1张图片

 ​​​​​​【运维知识进阶篇】集群架构-Nginx动静分离详解_第2张图片

 使用Web02配置动态资源的文件

[root@web02 ~]# yum install -y tomcat
[root@web02 ~]# mkdir /usr/share/tomcat/webapps/ROOT
[root@web02 ~]# cat /usr/share/tomcat/webapps/ROOT/java_test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

    
        koten JSP Page
    
    
        <%
            Random rand = new Random();
            out.println("

随机数:

"); out.println(rand.nextInt(99)+100); %> [root@web02 webapps]# systemctl start tomcat

 【运维知识进阶篇】集群架构-Nginx动静分离详解_第3张图片

 LB01负载均衡上调度静态文件和动态文件的配置文件

[root@LB01 conf.d]# vim proxy_jingdong.conf 
upstream webs {
	server 172.16.1.7;
}

upstream static {
        server 172.16.1.7:80;
}

upstream java {
        server 172.16.1.8:8080;
}

server {
        listen 80;
        server_name jingdong.koten.com;
	
	    location / {
		    proxy_pass http://webs;
	    }

        location ~* \.(jpg|png|gif)$ {
                proxy_pass http://static;
                proxy_set_header Host $http_host;
        }

        location ~ \.jsp {
                proxy_pass http://java;
                proxy_set_header Host $http_host;
        }
}
 

[root@lb01 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 conf.d]# systemctl restart nginx

修改本地hosts后测试 

【运维知识进阶篇】集群架构-Nginx动静分离详解_第4张图片【运维知识进阶篇】集群架构-Nginx动静分离详解_第5张图片

【运维知识进阶篇】集群架构-Nginx动静分离详解_第6张图片

修改LB01的配置文件并在LB01上整合动态和静态的html文件

[root@LB01 ~]# cat /etc/nginx/conf.d/proxy_jingdong.conf 
upstream static {
        server 172.16.1.7:80;
}

upstream java {
        server 172.16.1.8:8080;
}

server {
        listen 80;
        server_name jingdong.koten.com;
	
	location / {
		root /code;
		index index.html;	
	}

        location ~* \.(jpg|png|gif)$ {
                proxy_pass http://static;
                proxy_set_header Host $http_host;
        }

        location ~ \.jsp {
                proxy_pass http://java;
                proxy_set_header Host $http_host;
        }
}
[root@LB01 ~]# systemctl restart nginx
[root@LB01 ~]# cat /code/index.html


        
        测试ajax和跨域访问
        


        
                

测试动静分离

【运维知识进阶篇】集群架构-Nginx动静分离详解_第7张图片

动静分离测试

关闭Web01的静态资源服务,查看动态资源是否收到影响

[root@Web01 code]# systemctl stop nginx

关闭Web02的动态资源服务,查看静态资源是否收到影响

[root@Web01 code]# systemctl start nginx
[root@Web02 conf.d]# systemctl stop tomcat

【运维知识进阶篇】集群架构-Nginx动静分离详解_第8张图片

 Nginx负载均衡实现手机和PC调度至不同的后端节点

1、准备一台LB01(10.0.0.5、172.16.1.5)一台Web01(172.16.1.7)开发9090、9091、9092端口分别为安卓、苹果、电脑提供服务。

2、配置Web的Nginx文件

[root@Web01 ~]# cat /etc/nginx/conf.d/phone.conf
server {
        listen 9090;
        location / {
                root /code/android;
                index index.html;
        }
}

server {
        listen 9091;
        location / {
                root /code/iphone;
                index index.html;
        }
}

server {
        listen 9092;
        location / {
                root /code/pc;
                index index.html;
        }
}
[root@Web01 ~]# systemctl restart nginx

 3、在Web上创建对应网站目录及代码

[root@Web01 ~]# mkdir /code/{android,iphone,pc}
[root@Web01 ~]# echo '我是安卓' > /code/android/index.html
[root@Web01 ~]# echo '我是苹果' > /code/iphone/index.html
[root@Web01 ~]# echo '我是电脑' > /code/pc/index.html

4、配置负载均衡服务

[root@LB01 ~]# cat /etc/nginx/conf.d/proxy_phone.conf
upstream android {
        server 172.16.1.7:9090;
}

upstream iphone {
        server 172.16.1.7:9091;
}

upstream pc {
        server 172.16.1.7:9092;
}

server {
        listen 80;
        server_name phone.koten.com;
        charset 'utf-8';

        location / {

                #如果客户端来源是Android则跳转到Android的资源;
                if ($http_user_agent ~* "Android") {    #只要是日志里的都可以进行判断
                        proxy_pass http://android;
                }

                #如果客户端来源是Iphone则跳转到Iphone的资源;
                if ($http_user_agent ~* "Iphone") {
                        proxy_pass http://iphone;
                }

                #如果客户端是IE浏览器则返回403错误;
                if ($http_user_agent ~* "Edg") {
                        return 403;
                }

                #默认跳转pc资源;
                proxy_pass http://pc;
        }
}

也可以进行如下设置

server {
        listen 80;
        server_name   www.koten.com;
        if ($http_user_agent ~* "Android|Iphone") {
                rewrite ^/$ http://m.koten.com redirect;
        }       
}

5、用浏览器进行测试

电脑端

【运维知识进阶篇】集群架构-Nginx动静分离详解_第9张图片

 安卓端 

【运维知识进阶篇】集群架构-Nginx动静分离详解_第10张图片

苹果端

【运维知识进阶篇】集群架构-Nginx动静分离详解_第11张图片


我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!

你可能感兴趣的:(进阶运维知识,运维知识分享,运维,架构,nginx,linux,java)