今天我们开始学习nginx缓存功能,CORS以及nginx防盗链
缓存功能
反向代理可以缓存静态资源
作为代理端配置能够缓存的静态页面
其中的核心配置如下:
#http 语句
proxy_cache_path /data/nginx/proyxcache levels=1:1:1 keys_zone=proxycache:20m inactive=120s max_size=1g;
#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;
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;
#定义当前存放缓存的位置,必须放在http语句中#示例:在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个左右的key。
inactive=120s #缓存有效时间
max_size=10g; #最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值
默认情况,磁盘空间越大能创建的目录就越多
#示例:在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个左右的key
inactive=120s #缓存有效时间
max_size=10g; #最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值
#调用缓存功能,需要定义在相应的配置段,如server{...};或者location等
proxy_cache proxycache;
proxy_cache_key $request_uri; #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提交运用于不需要安全的场合它所传的参数是能被看见的#而POST提交是需要非常安全的场合(例如登录页面)
#对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存
Nginx配置跨域 CORS
跨域的定义
同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。通常不允许不同源间的读操作。
同源的定义
如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源。
与 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 不同源,主机不同
不同源的限制
-
Web 数据层面,同源策略限制了不同源的站点读取当前站点的 Cookie 、 IndexDB 、 LocalStorage 等数据;
-
DOM 层面,同源策略限制了来自不同源的 JavaScript 脚本对当前 DOM 对象读和写的操作;
-
网络层面,同源策略限制了通过 XMLHttpRequest 等方式将站点的数据发送给不同源的站点。
Nginx 解决跨域的原理
浏览器的同源策略限制了跨域请求,但当使用 Nginx 作为代理服务器时,浏览器发送的请求实际上是发送到与前端页面同源的 Nginx 服务器。然后 Nginx 将请求转发到真正的目标服务器,目标服务器返回的响应再通过 Nginx 返回给浏览器。从浏览器的角度看,它只与同源的 Nginx 服务器进行交互,从而绕过了 CORS 限制
记住nginx能解决不同源的问题,可以实现同源策略访问。
Nginx防盗链设置
什么是盗链
盗链指的是例如:在百度网站上有好多资源,某某也建了一个网站,但是某某不喜欢收集资源,现在网站就是一个空壳,把所有访问某某网站上的资源都调用百度的。这个过程就叫盗链过程。盗用的都是前段资源,比如:图片、音频、视频......
配置防盗链案例
为了模拟盗链,让192.168.100.1为网站服务站点,192.168.100.2访问192.168.100.1进行盗链。
修改Nginx的字符集以支持中文:
charset utf-8;
修改 192.168.100.2 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.100.2/photos/1.png'>站点</a>
</body>
</html>
此时在浏览器输入192.168.100.2,可以正常访问192.168.100.1站点的图片资源。
如果不想被盗链,则对192.168.100.1站点服务修改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。
192.168.100.1设置防盗链
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.100.1; #只允许192.168.100.1访问静态资源,其他人访问则会返回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;} }