1 动静分离简介

  为了提高网站的响应速度,减轻程序服务器(Tomcat,Jboss等)的负载,对于静态资源,如图片、js、css等文件,可以在反向代理服务器中进行缓存,这样浏览器在请求一个静态资源时,代理服务器就可以直接处理,而不用将请求转发给后端服务器。对于用户请求的动态文件,如servlet、jsp,则转发给Tomcat,Jboss服务器处理,这就是动静分离。即动态文件与静态文件的分离。

2 图示

 

3 配置

  动静分离可通过location对请求url进行匹配,将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。通常将静态资源放到nginx中,动态资源转发到tomcat服务器中

 

3.1 服务

  现在在计算机上有两个服务可访问

  192.168.28.1:8081;
  192.168.28.1:8082;

  

3.2 nginx

  在虚拟机上有一个nginx

  192.168.28.110

  配置如下,做了反向代理和负载均衡

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
keepalive_timeout
65; upstream httpadr{ server 192.168.28.1:8081; server 192.168.28.1:8082; } server { listen 80; server_name nginx1.com; location / { proxy_pass http://httpadr; #root /usr/local/mynginx/nginx1; #index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }

 

3.3 现在把静态文件加images放到nginx所在的服务器下

   

 

3.4 修改nginx的配置文件

  添加location配置

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    upstream httpadr{
      server  192.168.28.1:8081;
      server  192.168.28.1:8082;
   }


    server {
        listen       80;
        server_name  nginx1.com;

        location / {
            proxy_pass   http://httpadr;
            #root   /usr/local/mynginx/nginx1;
            #index  index.html index.htm;
        }
        #添加的配置 到时192.168.28.110/images/xxx 都会直接从nginx去取,而不会去两个服务那里取
        location /images {
            root   /www/resources;
            index  index.html index.htm;
        }
        

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

 

3.5 配置完成后,重新加载nginx

  systemctl reload nginx

 

3.6 访问

  192.168.28.110

  此时,会访问到两个服务,但是images静态资源都会直接从nginx的images文件夹下取

 

4 location

4.1 常见写法(支持正则)

 (1)location = / {}
=为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配
再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location  /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。

(2)location / {}
因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配, /data 也匹配,
但若后面是正则表达式会和最长字符串优先匹配(最长匹配)

(3)location /documents/ {}
匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条

(4)location /documents/abc {}
匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条

(5)location ^~ /images/ {}
匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条

(6)location ~* \.(gif|jpg|jpeg)$ {}
匹配所有以 gif、jpg或jpeg 结尾的请求
然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则

(7)location /images/abc {}
最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在

(8)location ~ /images/abc {}
匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条

(9)location /images/abc/1.html {}
匹配/images/abc/1.html 文件,如果和正则 ~ /images/abc/1.html 相比,正则优先级更高

优先级总结:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (location /)

 

4.2 使用时,一般至少有三个location匹配规则定义

1)第一个必选规则

  直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。这里是直接转发给后端应用服务器了,也可以是一个静态首页

location = / {
    proxy_pass http://127.0.0.1:8080/; 
}

 

2)第二个必选规则

  处理静态文件请求,这是nginx作为http服务器的强项,有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用

location ^~ /static/ {
    root /webroot/static/;
}

location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}

 

3)第三个规则

  通用规则,用来转发动态请求到后端应用服务器

location /api/ {
    proxy_pass http://127.0.0.1:3000/api/
}