目录
频道首页
📚 Nginx续 重写和防盗链
收藏
0
xy20118 最近修改于 2024-06-13 17:44:13

#重写 rewrite

通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,rewrite主要是针对用户请求的URL或者是URI做具体处理

优点: 1:缩短url,隐藏实际路径提高安全性。 2:易于用户记忆和键入。 3:易于被搜索引擎收录。

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

语法:

rewrite    <regex>    <replacement>     flag(可选)
关键字       正则        替代内容         标记(可选)

标记选项:

last      -基本上都用这个
break     -终止Rewirte,不继续匹配
redirect  -返回临时重定向的HTTP状态302
permanent -返回永久重定向的HTTP状态301
break  last #为了防止死循环 标志 匹配后立即停止。

明细可以查看官方文档:https://nginx.org/en/docs/http/ngxhttprewrite_module.html#rewrite

正则表达格式

. #匹配除换行符以外的任意字符
\w #匹配字母或数字或下划线或汉字
\s #匹配任意的空白符
\d #匹配数字    [0-9]   
\b #匹配单词的开始或结束
^ #匹配字付串的开始
$ #匹配字符串的结束
* #匹配重复零次或更多次
+ #匹配重复一次或更多次
? #匹配重复零次或一次
(n) #匹配重复n次
{n,} #匹配重复n次或更多次
{n,m} #匹配重复n到m次
*? #匹配重复任意次,但尽可能少重复
+? #匹配重复1次或更多次,但尽可能少重复
?? #匹配重复0次或1次,但尽可能少重复
{n,m}? #匹配重复n到m次,但尽可能少重复
{n,}? #匹配重复n次以上,但尽可能少重复
\W &nbsp;#匹配任意不是字母,数字,下划线,汉字的字符
\S #匹配任意不是空白符的字符
\D #匹配任意非数字的字符
\B #匹配不是单词开头或结束的位置
[^x] #匹配除了x以外的任意字符
[^kgc] #匹配除了kgc 这几个字母以外的任意字符

实操

访问 bj 跳转到 beijing 修改子配置文件

[root@xyy1 beijing]# vim /apps/nginx/conf.d/jpg.conf
server {
   listen 80; #监听端口
   server_name www.test.com; #域名
   root /data/html/; #主目录
   location /bj {   #location模块 匹配url /bj开头的
    root /apps/nginx/test;  #主目录
   rewrite ^/bj/(.*)  /beijing/$1  permanent;  #重写 ,/bj/开头的任意字符串 永久重定向 访问/beijing/开头的任意rul  
   #注意:beijing的主目录是server模块下的root。 
   # $1代表后项引用 
   }
}
[root@xyy1 beijing]# mkdir /data/html/beijing -p
[root@xyy1 beijing]# echo beijingbeijing > /data/html/beijing/index.html

验证: image

防盗链

防盗链基于客户端携带的referer实现,referer是记录打开一个页面之前记录是从哪个页面跳转过来的标记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗链

none:#请求报文首部没有referer首部,比如用户直接在浏览器输入域名访问web网站,就没有referer信息。
blocked:#请求报文有referer首部,但无有效值,比如为空。
server_names:#referer首部中包含本主机名及即nginx 监听的server_name。
arbitrary_string:#自定义指定字符串,但可使用*作通配符。示例: *.kgc.org www.kk.*
regular expression:#被指定的正则表达式模式匹配到的字符串,要使用~开头,例如:~.*\.kk\.com 

场景: 客户A 向服务器B请求访问图片a.jpg B服务器上本身是没有图片的 但是可以直接将服务器C上a.jpg图片 盗取下来进行使用 点击量和C服务器没有任何关系 仍旧是B服务器获得。 通俗可以看理解为 酒驾被抓了 交警罚款副驾拿!

C服务器:192.168.64.17 B服务器:192.168.64.10 A客户:本机

#C服务器上有一个可以访问的图片a.jgp 
http://192.168.64.17/a.jpg 

B服务器

[root@localhost ~]# systemctl stop firewalld.service  #关闭防火墙
[root@localhost ~]# setenforce 0 #关闭selinux
[root@localhost ~]# yum install epel-release.noarch -y #安装epel源 (为了安装nginx)
# 遇见无法安装的时候 可以yum clean all 清理下元信息 或者 rm -rf  /var/cache/yum 重新安装在epel源
[root@localhost cache]# cd /usr/share/nginx/html/ # 切换到页面编辑文件下
[root@localhost html]# vim index.html #编辑index.html 
<html>
<body>
<h1>this is daotu  </h1>
<img src="http:192.168.64.17/a.jpg"/> #图片源 
</body>
</html>
[root@localhost html]# vim /etc/nginx/nginx.conf #编辑nginx主配置文件 
编辑主域名 自定义 一会访问测试需要使用。
[root@localhost html]# systemctl restart nginx.service #重启nginx服务

image

A客户(真机)

添加dns  解析
路径:C:\Windows\System32\drivers\etc   
配置hosts
IP   www.mm.com

测试:www.mm.com  可以直接打开图片  域名地址是10  图片地址是17.

image

在C服务器上设置防盗链

[root@xyy1 ~]# vim /apps/nginx/conf.d/jpg.conf #切换至子配置文件 进行编辑
server {
   listen 80; #监听80端口
   server_name www.test.com; #主域名
   root /opt/html/; #主目录
   location ~* \.(jpg|gif|swf|jpeg|bmp)$ {  #以jpg等结尾的 
        root /apps/nginx/html;  #主目录
       valid_referers none block *.test.com pc.com; #设置可以信任的网站 显示图片 
      if ( $invalid_referer ) { 
        #rewrite ^/ http://www.test.com/error/png; 如果请求来源不在以上这是的网站  跳转至错误页面图片
        return 403;  #直接反馈403.     } 

image

反向代理

ngx_http_proxy_module: #将客户端的请求以http协议转发至指定服务器进行处理
ngx_http_upstream_module #用于定义为proxy_pass,fastcgi_pass,uwsgi_pass等指令引用的后端服务器分组
ngx_stream_proxy_module:#将客户端的请求以tcp协议转发至指定服务器处理
ngx_http_fastcgi_module:#将客户端对php的请求以fastcgi协议转发至指定服务器助理
ngx_http_uwsgi_module: #将客户端对Python的请求以uwsgi协议转发至指定服务器处理

image image 同构代理:用户和nginx向后端服务器发起请求使用的协议一致。 异构代理:用户和nginx向后端服务器发起的请求使用协议不一致

官网文档详细配置介绍: https://nginx.org/en/docs/http/ngxhttpproxy_module.html

1.单机反向代理配置

代理服务器配置64.17

[root@xyy1 ~]# vim /apps/nginx/conf.d/jpg.conf #打开子配置文件
server {
   listen 80;
   server_name www.test.com;
   root /apps/nginx/pc; #主目录
   location / { #匹配uri
   root /apps/nginx/pc;#主目录
   proxy_pass http://192.168.64.11; #设置真实服务器地址 
    }
#  proxy_pass http://192.168.91.11/; 加了/代表是置换   不加代表追加
[root@xyy1 ~]# echo "proxy server" > /apps/nginx/pc/index.html 

真实服务器配置

[root@localhost ~]# yum install  httpd -y #安装httpd 
[root@localhost ~]# cd /var/www/html/  #切换到主页面目录下面
echo "真实服务器,没错我就是" > index.html #设置主页面 自定义
systemctl  start httpd #启动httpd 

客户端

1.真机 可以设置本机的hosts 在C盘,windows/system32/divers/etc/hosts 
IP  www.test.com
2.直接找一个客户机 vim/etc/hosts 
IP www.test.com

验证:image

负载均衡

1.概念

Nginx可以将客户端的请求转发至单台后端服务器但是无法转发至特定的一组的服务器,而且不能对后端服务器提供相应的服务器状态监测,Nginx 可以基于ngxhttpupstream_module模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能

负载均衡:英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。 官方文档: https://nginx.org/en/docs/http/ngxhttpup

硬件负载均衡器常见的有 F5、A10、Array,它们的优缺点都比较明显,优点是功能强大,有专门的售后服务团队,性能比较好;缺点是缺少定制的灵活性,维护成本较高。这个不多提

一般软件负载均衡来实现,这样可以满足各种定制化需求,常见的软件负载均衡有 LVS、Nginx、Haproxy。

2.Nginx负载均衡策略

软件负载均衡:

轮询(round robin)

:平均分配,每人一次。 image

设置在全局模块 http 
  upstream  servergp {  # upstream模块 反向代理群组 设置名称
   server 192.168.64.10;   # 群组成员 ip
   server 192.168.64.11;   # 群组成员 ip
   } 
   location / {
  proxy_pass http://servergp/;  #设置代理  可以写在子配置文件
   }

   }

加权轮询

:本质其实是能者多劳的思想 比如可以根据服务器性能不同 进行配置

http模块
 upstream  servergp {
   server 192.168.64.10;
   server 192.168.64.11;
   server 192.168.64.15  weight=2; 加权重是2  默认是1  三台服务器组成的负载均衡 任务分配比例就是1:1:2
#配置一个后端web服务器,配置在upstream内,至少要有一个server服务器配置。
#server支持的parameters如下:
weight=number #设置权重,默认为1,实现类似于LVS中的WRR,WLC等
max_conns=number &nbsp;#给当前后端server设置最大活动链接数,默认为0表示没有限制
max_fails=number &nbsp;#后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务
器连续进行检测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测
fail_timeout=time #后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒
backup &nbsp;#设置为备份服务器,当所有后端服务器不可用时,才会启用此备用服务器 sorry server   自己不能转自己
down &nbsp; &nbsp;#标记为down状态
resolve #当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx
#最大的重试次数,和重试时间间隔 重试次数2,重试时间间隔30s
upstream servergp {
server 192.168.64.11 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.64.10 weight=2 max_fails=2 fail_timeout=30s; 
server 192.168.64.17 backup;  
}
当所有的非备机(non-backup)都宕机(down)或者繁忙(busy)的时候,就会使用由 backup 标注的备机。必须要注意的是,backup 不能和 ip_hash 关键字一起使用。



hash KEY [consistent];
#基于指定请求报文中首部字段或者URI等key做hash计算,使consistent参数,将使用ketama一致性

哈希(hash)算法

image

IP 哈希(client IP) :根据ip地址来决定客户端请求服务器 请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

for(i = 0;i < 3;i++){hash = (hash * 113 + iphp->addr[i]) % 6271;}p = hash % iphp->rrp.peers->number;    #hash值既与ip有关又与后端机器的数量有关
http模块
 upstream  servergp {
   ip_hash;
   server 192.168.64.10;
   server 192.168.64.11;
   server 192.168.64.15; 
   }

URL哈希 (hash) 根据客户访问的url决定访问服务器 cookie哈希: 根据cookie值来决定访问的服务器 一致性哈希:采用了nginx内置的一致性hash环,可以支持memcache(分布式高速缓存)

最小连接数

image 根据实时的负载情况,进行动态负载均衡的方式。,根据取最小连接数的返回即可

fair策略

fair策略是扩展策略,默认不被编译进nginx内核。其原理是根据后端服务器的响应时间判断负载情况,从中选出负载最轻的机器进行分流。这种策略具有很强的自适应性,但是实际的网络环境往往不是那么简单,因此要慎用。 在预览区点击图片重新编辑draw.io{data-type=drawio data-xml=%3CmxGraphModel%20dx=%22871%22%20dy=%22478%22%20grid=%221%22%20gridSize=%2210%22%20guides=%221%22%20tooltips=%221%22%20connect=%221%22%20arrows=%221%22%20fold=%221%22%20page=%221%22%20pageScale=%221%22%20pageWidth=%22827%22%20pageHeight=%221169%22%3E%3Croot%3E%3CmxCell%20id=%220%22/%3E%3CmxCell%20id=%221%22%20parent=%220%22/%3E%3CmxCell%20id=%222%22%20value=%22%22%20style=%22shape=cylinder;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;%22%20vertex=%221%22%20parent=%221%22%3E%3CmxGeometry%20x=%22380%22%20y=%22130%22%20width=%2260%22%20height=%22120%22%20as=%22geometry%22/%3E%3C/mxCell%3E%3CmxCell%20id=%223%22%20value=%22%E8%AF%B7%E6%B1%82%E8%BF%9B%E6%9D%A5%22%20style=%22text;html=1;resizable=0;points=%5B%5D;autosize=1;align=left;verticalAlign=top;spacingTop=-4;fontSize=17;%22%20vertex=%221%22%20parent=%221%22%3E%3CmxGeometry%20x=%22380%22%20y=%2225%22%20width=%2260%22%20height=%2220%22%20as=%22geometry%22/%3E%3C/mxCell%3E%3CmxCell%20id=%224%22%20value=%22%22%20style=%22endArrow=classic;html=1;entryX=0.5;entryY=0;%22%20edge=%221%22%20parent=%221%22%20target=%222%22%3E%3CmxGeometry%20width=%2250%22%20height=%2250%22%20relative=%221%22%20as=%22geometry%22%3E%3CmxPoint%20x=%22410%22%20y=%2240%22%20as=%22sourcePoint%22/%3E%3CmxPoint%20x=%22430%22%20y=%2250%22%20as=%22targetPoint%22/%3E%3C/mxGeometry%3E%3C/mxCell%3E%3CmxCell%20id=%225%22%20value=%221%22%20style=%22text;html=1;resizable=0;points=%5B%5D;autosize=1;align=left;verticalAlign=top;spacingTop=-4;%22%20vertex=%221%22%20parent=%221%22%3E%3CmxGeometry%20x=%22420%22%20y=%2247%22%20width=%2220%22%20height=%2220%22%20as=%22geometry%22/%3E%3C/mxCell%3E%3CmxCell%20id=%226%22%20value=%222%22%20style=%22text;html=1;resizable=0;points=%5B%5D;autosize=1;align=left;verticalAlign=top;spacingTop=-4;fontSize=15;%22%20vertex=%221%22%20parent=%221%22%3E%3CmxGeometry%20x=%22420%22%20y=%2257%22%20width=%2220%22%20height=%2220%22%20as=%22geometry%22/%3E%3C/mxCell%3E%3CmxCell%20id=%227%22%20value=%223%22%20style=%22text;html=1;resizable=0;points=%5B%5D;autosize=1;align=left;verticalAlign=top;spacingTop=-4;fontSize=15;%22%20vertex=%221%22%20parent=%221%22%3E%3CmxGeometry%20x=%22420%22%20y=%2273%22%20width=%2220%22%20height=%2220%22%20as=%22geometry%22/%3E%3C/mxCell%3E%3CmxCell%20id=%228%22%20value=%224%22%20style=%22text;html=1;resizable=0;points=%5B%5D;autosize=1;align=left;verticalAlign=top;spacingTop=-4;fontSize=15;%22%20vertex=%221%22%20parent=%221%22%3E%3CmxGeometry%20x=%22420%22%20y=%2284%22%20width=%2220%22%20height=%2220%22%20as=%22geometry%22/%3E%3C/mxCell%3E%3CmxCell%20id=%229%22%20value=%225%22%20style=%22text;html=1;resizable=0;points=%5B%5D;autosize=1;align=left;verticalAlign=top;spacingTop=-4;fontSize=15;%22%20vertex=%221%22%20parent=%221%22%3E%3CmxGeometry%20x=%22420%22%20y=%2294%22%20width=%2220%22%20height=%2220%22%20as=%22geometry%22/%3E%3C/mxCell%3E%3CmxCell%20id=%2210%22%20value=%2210ms%22%20style=%22ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#FFFF99;%22%20vertex=%221%22%20parent=%221%22%3E%3CmxGeometry%20x=%22160%22%20y=%22360%22%20width=%2280%22%20height=%2280%22%20as=%22geometry%22/%3E%3C/mxCell%3E%3CmxCell%20id=%2211%22%20value=%2220ms%22%20style=%22ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#B3FF66;%22%20vertex=%221%22%20parent=%221%22%3E%3CmxGeometry%20x=%22370%22%20y=%22440%22%20width=%2280%22%20height=%2280%22%20as=%22geometry%22/%3E%3C/mxCell%3E%3CmxCell%20id=%2212%22%20value=%22100ms%22%20style=%22ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#66FFB3;%22%20vertex=%221%22%20parent=%221%22%3E%3CmxGeometry%20x=%22560%22%20y=%22360%22%20width=%2280%22%20height=%2280%22%20as=%22geometry%22/%3E%3C/mxCell%3E%3CmxCell%20id=%2215%22%20style=%22edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=1;exitY=1;exitPerimeter=0;entryX=1;entryY=0.5;jettySize=auto;orthogonalLoop=1;%22%20edge=%221%22%20parent=%221%22%20source=%2214%22%20target=%2210%22%3E%3CmxGeometry%20relative=%221%22%20as=%22geometry%22/%3E%3C/mxCell%3E%3CmxCell%20id=%2217%22%20style=%22edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=1;exitY=0;exitPerimeter=0;entryX=0;entryY=0.5;jettySize=auto;orthogonalLoop=1;%22%20edge=%221%22%20parent=%221%22%20source=%2214%22%20target=%2212%22%3E%3CmxGeometry%20relative=%221%22%20as=%22geometry%22/%3E%3C/mxCell%3E%3CmxCell%20id=%2218%22%20style=%22edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.541;exitY=0.49;exitPerimeter=0;entryX=0.5;entryY=0;jettySize=auto;orthogonalLoop=1;%22%20edge=%221%22%20parent=%221%22%20source=%2214%22%20target=%2211%22%3E%3CmxGeometry%20relative=%221%22%20as=%22geometry%22/%3E%3C/mxCell%3E%3CmxCell%20id=%2214%22%20value=%22%22%20style=%22shape=mxgraph.flowchart.annotation_2;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#000000;strokeWidth=2;direction=south;%22%20vertex=%221%22%20parent=%221%22%3E%3CmxGeometry%20x=%22361%22%20y=%22250%22%20width=%2298%22%20height=%22100%22%20as=%22geometry%22/%3E%3C/mxCell%3E%3CmxCell%20id=%2220%22%20value=%221%22%20style=%22text;html=1;resizable=0;points=%5B%5D;autosize=1;align=left;verticalAlign=top;spacingTop=-4;fontSize=17;%22%20vertex=%221%22%20parent=%221%22%3E%3CmxGeometry%20x=%22190%22%20y=%22330%22%20width=%2220%22%20height=%2220%22%20as=%22geometry%22/%3E%3C/mxCell%3E%3CmxCell%20id=%2221%22%20value=%222%22%20style=%22text;html=1;resizable=0;points=%5B%5D;autosize=1;align=left;verticalAlign=top;spacingTop=-4;labelBackgroundColor=none;fontSize=17;%22%20vertex=%221%22%20parent=%221%22%3E%3CmxGeometry%20x=%22459%22%20y=%22470%22%20width=%2220%22%20height=%2220%22%20as=%22geometry%22/%3E%3C/mxCell%3E%3CmxCell%20id=%2222%22%20value=%223%22%20style=%22text;html=1;resizable=0;points=%5B%5D;autosize=1;align=left;verticalAlign=top;spacingTop=-4;fontSize=17;%22%20vertex=%221%22%20parent=%221%22%3E%3CmxGeometry%20x=%22647%22%20y=%22369%22%20width=%2220%22%20height=%2220%22%20as=%22geometry%22/%3E%3C/mxCell%3E%3CmxCell%20id=%2223%22%20value=%224%22%20style=%22text;html=1;resizable=0;points=%5B%5D;autosize=1;align=left;verticalAlign=top;spacingTop=-4;fontSize=17;%22%20vertex=%221%22%20parent=%221%22%3E%3CmxGeometry%20x=%22223%22%20y=%22342%22%20width=%2220%22%20height=%2220%22%20as=%22geometry%22/%3E%3C/mxCell%3E%3CmxCell%20id=%2224%22%20value=%225%22%20style=%22text;html=1;resizable=0;points=%5B%5D;autosize=1;align=left;verticalAlign=top;spacingTop=-4;labelBackgroundColor=none;fontSize=17;%22%20vertex=%221%22%20parent=%221%22%3E%3CmxGeometry%20x=%22489%22%20y=%22470%22%20width=%2220%22%20height=%2220%22%20as=%22geometry%22/%3E%3C/mxCell%3E%3C/root%3E%3C/mxGraphModel%3E}

总结: image

内容大纲
批注笔记
📚 Nginx续 重写和防盗链
ArticleBot
z
z
z
z
主页
会议室
Git管理
文章
云文档
看板