当前位置: 首页 > news >正文

Linux系统之Nginx反向代理与缓存

目录

一、正向代理和反向代理

1.1 正向代理概述

1.1.1 什么是正向代理

1.1.2 正向代理的作用

1.1.3 正向代理的基本格式

1.2 反向代理概述

1.2.1 什么是反向代理

1.2.2 反向代理可实现的功能

1.2.3 反向代理的可用模块

二、配置反向代理

2.1 反向代理配置参数

2.1.1 proxy_pass

2.1.2 其他参数

三、配置实战

3.1 反向代理单台web服务器

3.2 指定主机实现反向代理动静分离

3.3 缓存功能

3.4 实现反向代理客户端IP透传

3.4.1 基本原理

3.4.2 一级代理​编辑

3.4.3 多级代理

3.5 实现反向代理负载均衡

3.5.1 基本原理

3.5.2 常见配置参数

3.5.2 调度算法

3.5.2.1 轮询(Round Robin)

3.5.2.2 轮询权值(Weighted Round Robin)

3.5.2.3 ip_hash (source hash)

3.5.2.4 fair(第三方)

3.5.2.5 url_hash(第三方)

3.5.2.6 least_conn(最小连接数)

3.5.2.7 最少响应时间(Least Time)

3.6 实战

3.6.1 使用轮询算法实现负载均衡

3.6.2 使用加权轮询算法实现负载均衡

四、 Nginx配置跨域 CORS

4.1 跨域的定义

4.2 同源的定义

4.3 不同源的限制

4.4 Nginx 解决跨域的原理

4.5 案例

五、Nginx防盗链设置

5.1 什么是盗链

5.2 Referer解析

5.3 配置防盗链案例

5.4 测试


一、正向代理和反向代理

1.1 正向代理概述

1.1.1 什么是正向代理

正向代理代理的是客户端

正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从目标服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转发请求,将获得的内容返回给客户端

1.1.2 正向代理的作用
  • 为在防火墙内的局域网客户端提供访问Internet的途径

  • 可以使用缓冲特性减少网络使用率

  • 访问受地理位置限制的网络

  • 使用代理后会隐藏真实的IP地址

1.1.3 正向代理的基本格式
server {listen 192.164.65.100:80;server_name ....;#客户端访问的域名
​location / {proxy_pass http://目标服务器地址;}}

1.2 反向代理概述

1.2.1 什么是反向代理

反向代理代理的是服务端

反向代理:(reverse proxy),指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式 客户端不直接与后端服务器进行通信,而是与反向代理服务器进行通信,隐藏了后端服务器的 IP 地址

1.2.2 反向代理可实现的功能

反向代理的主要作用是提供负载均衡和高可用性。

负载均衡:Nginx可以将传入的请求分发给多个后端服务器,以平衡服务器的负载,提高系统性能和可靠性。

缓存功能:Nginx可以缓存静态文件或动态页面,减轻服务器的负载,提高响应速度。

动静分离:将动态生成的内容(如 PHP、Python、Node.js 等)和静态资源(如 HTML、CSS、JavaScript、图片、视频等)分别存放在不同的服务器或路径上。

多站点代理:Nginx可以代理多个域名或虚拟主机,将不同的请求转发到不同的后端服务器上,实现多个站点的共享端口。

1.2.3 反向代理的可用模块
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协议转发至指定服务器处理

二、配置反向代理

#官方文档:https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass 

2.1 反向代理配置参数

2.1.1 proxy_pass
proxy_pass 地址:端口的方式 ;  
#用来设置将客户端请求转发给的后端服务器的主机,可以是主机名(将转发至后端服务做为主机头首部)、IP
#也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支持
proxy_pass http://10.0.0.18:8080; 
#8080后面无uri,即无 / 符号,需要将location后面url 附加到proxy_pass指定的url后面,此行为类似于root
#proxy_pass指定的uri不带斜线将访问的/web,等于访问后端服务器
​
proxy_pass http://10.0.0.18:8080/;   
#8080后面有uri,即有 / 符号,相当于置换,即访问/web时实际返回proxy_pass后面uri内容.此行为类似于alias 
#proxy_pass指定的uri带斜线,等于访问后端服务器的http://10.0.0.18:8080/index.html 内容返回给客户端
#如果location定义其uri时使用了正则表达式模式(包括~,~*,但不包括^~),则proxy_pass之后必须不能使用uri; 即不能有/ ,用户请求时传递的uri将直接附加至后端服务器之后
2.1.2 其他参数
proxy_hide_header field;
#用于nginx作为反向代理的时候,在返回给客户端http响应时,隐藏后端服务器相应头部的信息,可以设置proxy_hide_header field;
​
proxy_pass_header field;
#默认nginx在响应报文中不传递后端服务器的首部字段Date, Server, X-Pad, X-Accel等参数,如果要传递的话则要使用 proxy_pass_header field声明将后端服务器返回的值传递给客户端
​
#field 首部字段大小不敏感
#示例:透传后端服务器的Server和Date首部给客户端,同时不再响应报中显示前端服务器的Server字段
proxy_pass_header Server;
proxy_pass_header Date;
​
​
proxy_pass_request_body on | off; 
#是否向后端服务器发送HTTP实体部分,可以设置在http,server或location块,默认即为开启
​
​
proxy_pass_request_headers on | off; 
#是否将客户端的请求头部转发给后端服务器,可以设置在http,server或location块,默认即为开启

三、配置实战

3.1 反向代理单台web服务器

所需配置

#代理服务器
vim /apps/nginx/conf.d/pc.conf
#编辑子配置文件
server{listen 192.164.65.100:80;server_name  www.pc.com;root    /apps/nginx/html/pc;location  / {proxy_pass http://192.164.65.101;
}
​
}
nginx -t
nginx -s reload
#重新加载

#真实服务端
yum  install   httpd  -y #安装服务
​
cd  /var/www/html
echo   "Hi~"  > index.html #主页内容
​
systemctl start httpd #开启服务
​
vim /etc/hosts
#添加地址映射
​
192.164.65.100 www.pc.com

#客户机
​
vim  /etc/hosts
192.164.65.100  www.pc.com

测试

客户机访问代理服务器curl 192.164.65.100

3.2 指定主机实现反向代理动静分离

因为nginx无法处理动态资源,所以要动静分离。

所需配置

#代理服务器
​
vim /apps/nginx/conf.d/pc.conf
#编辑子配置文件
​location  /api {proxy_pass http://192.164.65.101;
}
​location  /static {proxy_pass http://192.164.65.103;
}
nginx -t
nginx -s reload
#重新加载

#动态资源服务器
​
#关闭防火墙和selinux
systemctl stop firewalld
setenforce 0
​
#安装nginx服务
yum install -y epel-release
yum install nginx -y
systemctl start nginx 
​
#创建动态资源目录
cd /usr/share/nginx/html
​
mkdir api
echo this is api > ./api/index.html

#静态资源服务器
​
#关闭防火墙和selinux
systemctl stop firewalld 
setenforce 0
​
#安装服务
yum install -y epel-release 
yum install nginx -y 
systemctl start nginx 
​
#创建静态资源目录
cd /usr/share/nginx/html
mkdir static
echo this is static > ./static/index.html

测试

#客户机
#关闭防火墙和selinux
systemctl stop firewalld 
setenforce 0
​
#动态资源
curl 192.164.65.100/api -L
​
#静态资源
curl 192.164.65.100/static -L

 

3.3 缓存功能

反向代理可以缓存静态资源。

当客户端再次请求访问相同资源时,反向代理可以直接返回缓存中的响应,无需二次请求,减少对后端服务器的请求压力,并加快响应速度。

proxy_cache zone_name on | off; 默认off
#指明调用的缓存,或关闭缓存机制;Context:http, server, location
#zone_name 表示缓存的名称.需要由proxy_cache_path事先定义
proxy_cache_key string;
#缓存中用于“键”的内容,默认值:proxy_cache_key $scheme$proxy_host$request_uri;
proxy_cache_valid [code ...] time;
#定义对特定响应码的响应内容的缓存时长,定义在http{...}中示例:proxy_cache_valid 200 302 10m;proxy_cache_valid 404 1m;proxy_cache_path;
#定义可用于proxy功能的缓存;Context:http   必须放在http语句中
proxy_cache_path path [levels=levels] [use_temp_path=on|off] 
keys_zone=zone_name:size [inactive=time] [max_size=size] [manager_files=number] 
[manager_sleep=time] [manager_threshold=time] [loader_files=number] 
[loader_sleep=time] [loader_threshold=time] [purger=on|off] 
[purger_files=number] [purger_sleep=time] [purger_threshold=time];
​
​
#示例:在http配置定义缓存信息proxy_cache_path /var/cache/nginx/proxy_cache #定义缓存保存路径,proxy_cache会自动创建levels=1:2:2 #定义缓存目录结构层次,1:2:2可以生成2^4x2^8x2^8=2^20=1048576个目录keys_zone=proxycache:20m #指内存中缓存的大小,主要用于存放key和metadata(如:使用次数),一般1M可存放8000个左右的keyinactive=120s  #缓存有效时间  max_size=10g; #最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值#调用缓存功能,需要定义在相应的配置段,如server{...};或者location等
proxy_cache proxycache;
proxy_cache_key $request_uri; #对指定的数据进行MD5的运算做为缓存的key
proxy_cache_valid 200 302 301 10m; #指定的状态码返回的数据缓存多长时间
proxy_cache_valid any 1m;   #除指定的状态码返回的数据以外的缓存多长时间,必须设置,否则不会缓存
​
​
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ; #默认是off
#在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端
​
#示例
proxy_cache_use_stale error http_502 http_503;
​
​
proxy_cache_methods GET | HEAD | POST ...;
#对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存
proxy_cache_path /data/nginx/proyxcache   levels=1:1:1 keys_zone=proxycache:20m inactive=120s max_size=1g;
​
​
#http  语句
#1:1:1  16个二进制     2^16/2^16/2^16       2^48
​
​
server {listen 80;proxy_cache proxycache;proxy_cache_key $request_uri;#proxy_cache_key $host$uri$is_args$args;proxy_cache_valid 200 302 301 10m;proxy_cache_valid any 5m;server_name www.kgc.com;root /data/nginx/pc;location / {root /data/nginx/pc;}location /api {proxy_pass http://192.164.91.101:9527;}location ~* \.(jpg|png|gif|html)$ {proxy_pass http://192.164.91.102;}
}

清理缓存

方法1: rm -rf 缓存目录
方法2: 第三方扩展模块ngx_cache_purge

3.4 实现反向代理客户端IP透传

3.4.1 基本原理

反向代理客户端IP透传是指在使用反向代理服务器时,将客户端的真实IP地址传递给后端服务器。

这可以通过一些特定的 如X-Forwarded-For 等HTTP 头字段来实现 头字段。

当请求经过反向代理服务器时,代理服务器会将客户端的真实IP地址添加到 XFF 头字段中,然后转发给后端服务器。

后台服务端开启main日志格式调用!!!

3.4.2 一级代理

所需配置

#代理服务器
​
vim /apps/nginx/conf.d/pc.conf
#编辑子配置文件
server{listen 192.164.65.100:80;server_name  www.pc.com;root    /apps/nginx/html/pc;location  / {proxy_pass http://192.164.65.101;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
​
}
​
######
`$proxy_add_x_forwarded_for` 是一个 nginx 变量,用于获取客户端的真实 IP 地址并将其添加到请求中的 `X-Forwarded-For` 头字段中,后端服务器可以通过检查该头字段来获取请求的真实客户端 IP 地址。

#后端服务器
​
#关闭防火墙和selinux
systemctl stop firewalld
setenforce 0
​
#安装服务
yum install -y epel-release #依赖
yum install nginx -y 
systemctl start nginx 

测试

#客户端
curl 192.164.65.100
#后端服务器
cat /var/log/nginx/access.log |tail -f -n2

3.4.3 多级代理

所需配置

#一级代理服务器
​
#编辑子配置文件
vim /apps/nginx/conf.d/pc.conf
#反向代理指向二级代理服务器的IP
​
nginx -t
nginx -s reload
#重新加载

#yum安装nginx
yum install -y epel-release 
yum install nginx -y 
​
systemctl start nginx 
​
vi /etc/nginx/nginx.conf
#编辑主配置文件
​
server {
location / {
proxy_pass http://192.164.65.102;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
​
systemctl restart nginx
#重新加载

#后端服务器
​
#关闭防火墙和selinux
systemctl stop firewalld
setenforce 0
​
#安装nginx服务
yum install -y epel-release 
yum install nginx -y 
systemctl start nginx 

测试

#客户端,访问代理服务器
curl 192.164.2.100
#后端服务器,查看日志
cat /var/log/nginx/access.log | tail -n -1

3.5 实现反向代理负载均衡

Nginx 可以基于ngx_http_upstream_module模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能

#官方文档:
https://nginx.org/en/docs/http/ngx_http_up
3.5.1 基本原理

NGINX的负载均衡原理是基于反向代理和事件驱动的机制。

当客户端发送请求时,NGINX作为反向代理服务器接收请求,并根据配置的负载均衡算法将请求转发到后端的多个服务器上,实现负载均衡。

3.5.2 常见配置参数
server address [parameters];
#配置一个后端web服务器,配置在upstream内,至少要有一个server服务器配置。
#server支持的parameters如下:
​
weight=number #设置权重,默认为1,实现类似于LVS中的WRR,WLC等
​
max_conns=number  #给当前后端server设置最大活动链接数,默认为0表示没有限制
​
max_fails=number  #后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测
​
fail_timeout=time #后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒
​
sorry server   #自己不能转自己
down    #标记为down状态
resolve #当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx
backup  #设置为备份服务器,当所有后端服务器不可用时,才会启用此备用服务器
​
upstream backend {server backend1.example.com;server backend2.example.com backup;server backend3.example.com;
}
3.5.2 调度算法
3.5.2.1 轮询(Round Robin)

每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。

#示例
upstream bakend {  server 192.164.65.1;    server 192.164.65.2;  
}
3.5.2.2 轮询权值(Weighted Round Robin)

weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

#示例
upstream bakend {  server 192.164.65.1 weight=10;  server 192.164.65.2 weight=20;  
}
3.5.2.3 ip_hash (source hash)

每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

#示例
upstream bakend {  ip_hash;  server 192.164.65.1:88;  server 192.164.65.2:80;  
} 
3.5.2.4 fair(第三方)

比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。

Nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair模块。

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream backend {  server 192.164.0.67:88;  server 192.164.0.67:80;  fair;  
}
3.5.2.5 url_hash(第三方)

按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。

Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

upstream backend {  server 192.164.65.1:88;  server 192.164.65.2:80;  hash $request_uri;  hash_method crc32;  
}
​
#注:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
3.5.2.6 least_conn(最小连接数)

根据后端服务器的连接状况进行分配客户请求,连接最少的服务器将被有限分配客户端请求。

#示例upstream backend {least_conn;server backend1.example.com;server backend2.example.com;}
3.5.2.7 最少响应时间(Least Time)

根据服务器的响应时间进行选择,将请求分配给响应时间最短的服务器。

3.6 实战

要启用负载均衡,需要在Nginx主配置文件中添加一个upstream块来定义后端服务器的列表。

然后,在相应的location块中使用proxy_pass指令指定负载均衡的上游服务器。

3.6.1 使用轮询算法实现负载均衡

所需配置

#代理服务器
​
vim /apps/nginx/conf/nginx.conf
#编辑主配置文件
​
upstream group1{server 192.164.65.102;server 192.164.65.103;}

vim /apps/nginx/conf.d/pc.com
#修改子配置文件
#修改location部分,加入pass_proxy http://group1;
​
nginx -t
nginx -s reload
#重新加载

测试

#修改102、103主页文件
vi /usr/share/nginx/html/index.html

#转到客户端
curl 192.164.65.100   #x2

3.6.2 使用加权轮询算法实现负载均衡

所需配置

#代理服务器
​
#修改主配置文件
vim /apps/nginx/conf/nginx.conf
​
upstream group1{server 192.164.65.102 weight=2;server 192.164.65.103 weight=3;
}

nginx -t
nginx -s reload
#重新加载

测试

#转到客户端
curl 192.164.65.100   #x2

四、 Nginx配置跨域 CORS

4.1 跨域的定义

同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。通常不允许不同源间的读操作。

4.2 同源的定义

如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源。

与 URL http://store.company.com/dir/page.html 的源进行对比的示例:

  • http://store.company.com/dir2/other.html 同源

  • https://store.company.com/secure.html 不同源,协议不同

  • http://store.company.com:81/dir/etc.html 不同源,端口不同

  • http://news.company.com/dir/other.html 不同源,主机不同

4.3 不同源的限制

  • Web 数据层面,同源策略限制了不同源的站点读取当前站点的 Cookie 、 IndexDB 、 LocalStorage 等数据;

  • DOM 层面,同源策略限制了来自不同源的 JavaScript 脚本对当前 DOM 对象读和写的操作;

  • 网络层面,同源策略限制了通过 XMLHttpRequest 等方式将站点的数据发送给不同源的站点。

4.4 Nginx 解决跨域的原理

浏览器的同源策略限制了跨域请求,但当使用 Nginx 作为代理服务器时,浏览器发送的请求实际上是发送到与前端页面同源的 Nginx 服务器。然后 Nginx 将请求转发到真正的目标服务器,目标服务器返回的响应再通过 Nginx 返回给浏览器。从浏览器的角度看,它只与同源的 Nginx 服务器进行交互,从而绕过了 CORS 限制

4.5 案例

前端 server 的域名为:fe.server.com

后端服务的域名为:dev.server.com

现在在 fe.server.com 对 dev.server.com 发起请求一定会出现跨域。

现在我们只需要启动一个 Nginx 服务器,将 server_name 设置为 fe.server.com 然后设置相应的 location 以拦截前端需要跨域的请求,最后将请求代理回 dev.server.com 。

如下面的配置:

server {listen        80;server_name  fe.server.com;location / {proxy_pass dev.server.com;proxy_set_cookie_domain target-domain.com your-domain.com;proxy_set_header Host target-domain.com;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 可选的配置,用于处理响应头proxy_set_header Access-Control - Allow - Origin http://fe.server.com;proxy_set_header Access-Control - Allow - Methods GET,POST,PUT,DELETE;proxy_set_header Access-Control - Allow - Headers Content - Type,Authorization;}
}
​

配置解析:

  • proxy_set_header

    • Host backend - domain.com:设置转发请求的Host头信息。这是因为后端服务器可能会根据Host头来区分不同的虚拟主机或服务,所以需要将正确的Host信息传递给后端服务器,使其能够正确处理请求。

    • X-Real-IP $remote_addr和X-Forwarded-For $proxy_add_x_forwarded_for:这两个指令用于传递客户端的真实 IP 地址。$remote_addr是 Nginx 记录的客户端 IP 地址,$proxy_add_x_forwarded_for是一个包含了客户端 IP 以及中间代理服务器 IP(如果有的话)的变量。这样后端服务器可以获取到正确的客户端 IP 信息,用于日志记录、访问控制等目的。

    • Origin http://frontend - domain.com:这是关键的一个设置,用于在转发请求时,将Origin头信息设置为前端页面的域名。后端服务器在收到这个请求时,会认为请求来自于同源的http://frontend - domain.com,从而避免了 CORS 限制。这样后端服务器就可以正常处理请求并返回响应,响应会通过 Nginx 再返回给浏览器。

    • proxy_set_header Access-Control - Allow - Origin

      这个指令用于在 Nginx 作为代理服务器返回响应时,设置Access - Control - Allow - Origin响应头。通过将其设置为前端页面的域名(http://frontend - domain.com),浏览器会认为这个响应是来自同源的服务器,从而允许前端 JavaScript 代码访问这个响应,有效地绕过了 CORS 限制。

    • proxy_set_header Access-Control - Allow - Methods

      用于设置Access - Control - Allow - Methods响应头,指定允许的 HTTP 请求方法。在这里列举了GET、POST、PUT和DELETE,表示后端服务器允许前端通过这些方法进行跨域请求。可以根据实际的后端 API 支持的方法进行调整。

    • proxy_set_header Access-Control - Allow - Headers

      设置Access - Control - Allow - Headers响应头,指定允许的请求头。Content - Type头通常用于指定请求或响应的内容类型,如application/json或text/plain等;Authorization头用于传递认证信息,如令牌或用户名 / 密码等。这确保了前端在跨域请求中可以发送这些必要的请求头,并且后端会认可这些请求头。

这样可以完美绕过浏览器的同源策略:fe.server.com 访问 Nginx 的 fe.server.com 属于同源访问,而 Nginx 对服务端转发的请求不会触发浏览器的同源策略。

五、Nginx防盗链设置

5.1 什么是盗链

  • 在实际生产过程中,我们线上的图片等静态资源,经常会被其他网站盗用,他们发大财的同时,成本确实我们在买单,下面来说下,如何杜绝这种行为。

  • 应该说只要是静态资源都是可以防盗链的,只需要在Server字段加上几行代码即可。众所周知网站出名了后,会有各种刁民来找茬的,最常见的就是爬你网站的东西。

  • 关于防盗链这里不得不提一下网页的加载顺序是先加载HTML相关的内容,然后解析HTML的内容,那些需要加载图片,那些需要加载文件,是逐步加载的,所以可以在加载静态资源的时候做防盗链的操作,例如:在加载图片的时候直接跳转去其他链接,或者直接返回404,403等错误代码,拒绝它的请求。

如何区分哪些是不正常的用户?

  • HTTP Referer是Header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理,例如防止未经允许的网站盗链图片、文件等。因此HTTP Referer头信息是可以通过程序来伪装生成的,所以通过Referer信息防盗链并非100%可靠,但是,它能够限制大部分的盗链情况.

  • 比如在www.google.com 里有一个 www.baidu.com 链接,那么点击这个www.baidu.com ,它的header 信息里就有:Referer=http://www.google.com

5.2 Referer解析

  • HTTP 协议中有一个用来表示“页面或资源”来源的“请求头”,这个请求头叫做 Referer --> Referer是表示请求是从哪个网址发出的防盗链功能基于HTTP协议支持的 Referer 机制,通过Referer跟踪来源,对来源进行识别和判断

5.3 配置防盗链案例

为了模拟盗链,让192.168.166.9为网站服务站点,192.168.166.10访问192.168.166.9进行盗链。

修改Nginx的字符集以支持中文:

charset utf-8;
修改 192.168.166.10 Nginx 默认访问文件:<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>产生盗链</title>
</head>
<body><a href='http://192.168.166.9/photos/1.png'>站点</a>
</body>
</html>

此时在浏览器输入192.168.166.10,可以正常访问192.168.166.9站点的图片资源。

如果不想被盗链,则对192.168.166.9站点服务修改Nginx配置文件,防盗链的配置可以在任意的 location 模块下设置,不能在 server 下,不想让别人盗链哪个资源就在那个资源的 location 模块下设置防盗链。

防盗链设置格式:

valid_referers none | blocked | server_names | strings ....;
  • --none:允许没有http_refer的请求访问资源,检测 Referer 头域不存在的情况,则可以访问。

  • --blocked:检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以 “http://” 或 “https://” 开头。允许不是http://开头的,不带协议的请求访问资源。

  • --server_names :只允许指定ip/域名来的请求访问资源(白名单)。可设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。在生产环境中尽量使用域名,不使用ip。

举例

valid_referers 192.168.44.101;
if ($invalid_referer) {
return 403;
}

192.168.166.9设置防盗链

server {listen 80;server_name localhost;location / {root   /usr/local/nginx1273/html;index  index.html index.htm;}location ~* \.(js|img|css|png)${valid_referers 192.168.166.9; #只允许192.168.166.9访问静态资源,其他人访问则会返回403if ($invalid_referer){return 403;}root html;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location =/50x.html {root html;}
}

5.4 测试

浏览器测试

用192.168.166.10去访问,css等静态资源返回403,获取不到数据。

点击”站点“,跳转到192.168.166.9站点资源是显示:

http://www.lqws.cn/news/519481.html

相关文章:

  • Aurora MySQL 3.05/3.06/3.07版本即将停用,全局数据库升级实战指南
  • 逆序对的数量
  • 基于MATLAB的BP神经网络的心电图分类方法应用
  • pyhton基础【16】函数进阶二
  • 仿Apple官网设计风格
  • HCIA-IP路由基础
  • 鸿蒙OH南向开发 轻量系统内核(LiteOS-M)【Shell】
  • 实测对比:用 Lynx 做网页,效率比传统工具提升 270% 的底层逻辑
  • 【Oracle学习笔记】4.索引(Index)
  • 【大厂机试题解法笔记】可以组成网络的服务器
  • FPGA基础 -- Verilog 格雷码(Gray Code)计数器设计与原理解析
  • 开疆智能CCLinkIE转ModbusTCP网关连接脉冲计数器配置案例
  • MySQL之存储过程详解
  • 自动化测试--Appium和ADB及常用指令
  • 分布式环境下 Spring Boot 项目基于雪花算法的唯一 ID 生成方案
  • php后台增加权限控制
  • LangGraph开篇-LangGraph 核心元素简介(官网文档解读)
  • Spring Web MVC ①
  • 用 Boost 库解析 .ini 和 .json 文件时的“坑”:注释导致的解析错误与解决方案
  • 湖北理元理律师事务所:债务规划中的法律与心理双轨模型
  • 如何在 Manjaro Linux 上安装 Docker 容器
  • OpenCV——cv::floodFill
  • 卷积神经网络(Convolutional Neural Network, CNN)
  • 使用pyflink编写demo并将任务提交到yarn集群
  • 大塘至浦北高速:解锁分布式光伏“交能融合”密码,引领绿色交通革命
  • Redis HyperLogLog误差率0.81%的由来:从算法原理到Redis实现
  • UNIAPP入门基础
  • 如何快速将iPhone中的文本保存到电脑上
  • [架构之美]在Linux上通过源码编译安装Nginx(十四)
  • golang实现一个mysql中随机获取cookies的API