> 文档中心 > 【初探篇】nginx动静分离及Rewrite实战

【初探篇】nginx动静分离及Rewrite实战

文章目录

    • 动静分离
      • 动静分离原理
      • Nginx动静分离配置
      • 使用正则配置动静分离
    • URLRewrite
      • URLRewrite的优缺点
      • 实例
    • 负载均衡+URLRewrite实战

动静分离

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

动静分离原理

【初探篇】nginx动静分离及Rewrite实战

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

Nginx动静分离配置

首先使用宝塔面板安装tomcat:

【初探篇】nginx动静分离及Rewrite实战

安装成功访问http://192.168.8.101:8080/:

【初探篇】nginx动静分离及Rewrite实战

将charts-project.zip解压并放入如下位置,charts-project.zip下载地址:https://pan.baidu.com/s/1baD910BQD1DGdwdMmK0qTg?pwd=aaaa

【初探篇】nginx动静分离及Rewrite实战

访问http://192.168.8.101:8080/:
【初探篇】nginx动静分离及Rewrite实战

配置102的反向代理:

  • nginx.cfg
worker_processes  1;events {    worker_connections  1024;}http {    includemime.types;    default_type  application/octet-stream;    sendfile on;    keepalive_timeout  65;    server { listen80; server_name  localhost; location / {     proxy_pass http://192.168.8.101:8080; } error_page   500 502 503 504  /50x.html; location = /50x.html {     root   html; }    }}

访问http://192.168.8.102/:

【初探篇】nginx动静分离及Rewrite实战

将images文件夹删除:

【初探篇】nginx动静分离及Rewrite实战

访问http://192.168.8.102/,发现图片访问不到了:

【初探篇】nginx动静分离及Rewrite实战

接下来将静态资源配置到代理服务器102:

【初探篇】nginx动静分离及Rewrite实战

配置102的nginx.cfg

#user  nobody;worker_processes  1;events {    worker_connections  1024;}http {    includemime.types;    default_type  application/octet-stream;    sendfile on;    keepalive_timeout  65;    server { listen80; server_name  localhost; location / {     proxy_pass http://192.168.8.101:8080; }  location /images {     root   /www/resources;     index  index.html index.htm; }  error_page   500 502 503 504  /50x.html; location = /50x.html {     root   html; }    }}

访问192.168.8.102,发现图片又出现了:

【初探篇】nginx动静分离及Rewrite实战

使用正则配置动静分离

常见的Nginx正则表达式

^ :匹配输入字符串的起始位置$ :匹配输入字符串的结束位置* :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”+ :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}. :匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式\ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”\d :匹配纯数字{n} :重复 n 次{n,} :重复 n 次或更多次{n,m} :重复 n 到 m 次[] :定义匹配的字符范围[c] :匹配单个字符 c[a-z] :匹配 a-z 小写字母的任意一个[a-zA-Z0-9] :匹配所有大小写字母或数字() :表达式的开始和结束位置| :或运算符  //例(js|img|css)

location正则:

//location大致可以分为三类精准匹配:location = /{}一般匹配:location /{}正则匹配:location ~/{}//location常用的匹配规则:= :进行普通字符精确匹配,也就是完全匹配。^~ :表示前缀字符串匹配(不是正则匹配,需要使用字符串),如果匹配成功,则不再匹配其它 location。~ :区分大小写的匹配(需要使用正则表达式)。~* :不区分大小写的匹配(需要使用正则表达式)。!~ :区分大小写的匹配取非(需要使用正则表达式)。!~* :不区分大小写的匹配取非(需要使用正则表达式)。//优先级首先精确匹配 =其次前缀匹配 ^~其次是按文件中顺序的正则匹配 ~~*然后匹配不带任何修饰的前缀匹配最后是交给 / 通用匹配

注意:

  • 精确匹配: = , 后面的表达式中写的是纯字符串
  • 字符串匹配: ^~无符号匹配 , 后面的表达式中写的是纯字符串
  • 正则匹配: ~~*!~!~* , 后面的表达式中写的是正则表达式

location的说明

 (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 /)

实际网站使用中,至少有三个匹配规则定义:

  • 第一个必选规则

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

location = / {    proxy_pass http://127.0.0.1:8080/; }
  • 第二个必选规则

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

location ^~ /static/ {    root /webroot/static/;}location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {    root /webroot/res/;}
  • 第三个规则

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

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

URLRewrite

rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到repacement,结尾是flag标记。

格式:

【初探篇】nginx动静分离及Rewrite实战

URLRewrite的优缺点

优点:掩藏真实的url以及url中可能暴露的参数,以及隐藏web使用的编程语言,提高安全性便于搜索引擎收录

缺点:降低效率,影响性能。如果项目是内网使用,比如公司内部软件,则没有必要配置。

实例

配置nginx.cfg

【初探篇】nginx动静分离及Rewrite实战

代码:

rewrite ^/test.html$ /index.html?testParam=3 break;//也可以用正则表达式的形式:rewrite ^/[0-9]+.html$ /index.html?testParam=$1 break; //$1表示第一个匹配的字符串 

测试,访问http://192.168.8.102/test.html

【初探篇】nginx动静分离及Rewrite实战

负载均衡+URLRewrite实战

开启101的防火墙

systemctl start firewalld

重载规则

firewall-cmd --reload

查看已配置规则

firewall-cmd --list-all

添加指定端口和ip访问(添加之后记得重新启动防火墙)

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.8.102" port protocol="tcp" port="8080" accept"

移除规则

firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.8.102" port protocol="tcp" port="8080" accept"

重启防火墙

firewall-cmd --reload

测试:

直接访问:http://192.168.8.101:8080/

【初探篇】nginx动静分离及Rewrite实战

访问:http://192.168.8.102:8888/test.html

【初探篇】nginx动静分离及Rewrite实战

使用负载均衡的方式访问:

【初探篇】nginx动静分离及Rewrite实战

测试,访问http://192.168.8.102/test.html

【初探篇】nginx动静分离及Rewrite实战