五、静态资源 Web 服务
1. 静态资源类型
非服务器动态运行生成的文件,换句话说,就是可以直接在服务器上找到对应文件的请求
2. 静态资源服务场景-CDN
什么是CDN?例如一个北京用户要请求一个文件,而文件放在的新疆的资源存储中心,如果直接请求新疆距离太远,延迟久。使用nginx静态资源回源,分发给北京的资源存储中心,让用户请求的动态定位到北京的资源存储中心请求,实现传输延迟的最小化
2. nginx静态资源配置
配置域:http、server、location
http {
sendfile on;
}
http {
sendfile on;
tcp_nopush on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
}
location ~ .*\.(gif|jpg)$ {
gzip on;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss image/jpeg image/gif image/png;
root /opt/app/code;
}
location ~ load^/download {
gzip_static on
tcp_nopush on;
root /opt/app/code;
}
六、浏览器缓存
HTTP协议定义的缓存机制(如:Expires; Cache-control等 ),减少服务端的消耗,降低延迟
1. 浏览器无缓存
浏览器请求 -> 无缓存 -> 请求WEB服务器 -> 请求相应 -> 呈现
在呈现阶段会根据缓存的设置在浏览器中生成缓存
2. 浏览器有缓存
浏览器请求 -> 有缓存 -> 校验本地缓存时间是否过期 -> 没有过期 -> 呈现
若过期从新请求WEB服务器
3. 语法配置
location ~ .*\.(html|htm)$ {
expires 12h;
}
服务器响应静态文件时,请求头信息会带上 etag 和 last_modified_since 2个标签值,浏览器下次去请求时,头信息发送这两个标签,服务器检测文件有没有发生变化,如无,直接头信息返 etag 和last_modified_since,状态码为 304 ,浏览器知道内容无改变,于是直接调用本地缓存,这个过程也请求了服务,但是传着的内容极少。
七、跨站访问
开发 nginx 跨站访问设置
location ~ .*\.(html|htm)$ {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
#Access-Control-Allow-Credentials true #允许cookie跨域
}
在响应中指定 Access-Control-Allow-Credentials 为 true 时,Access-Control-Allow-Origin 不能指定为 *,需要指定到具体域名。
相关跨域内容可参考 Laravel 跨域功能中间件 使用代码实现跨域,原理与nginx跨域配置相同
八、防盗链
防止服务器内的静态资源被其他网站所套用,此处介绍的 nginx 防盗链为基础方式,其它更加深入的方式将在之后的文章介绍
首先,需要理解一个nginx变量
$http_referer #表示当前请求上一次页面访问的地址,换句话说,访问 www.baidu.com 主页,这是第一次访问,所以 $http_referer 为空,但是 访问此页面的时候还需要获取一张首页图片,再请求这张图片的时候 $http_referer 就为 www.baidu.com。
然后配置
location ~ .*\.(jpg|gif)$ {
valid_referers none blocked 127.xxx.xxx.xx
if ($invalid_referer) {
return 403;
}
}
九、HTTP代理服务
Nginx可以实现多种代理方式
1. 代理区别
区别在于代理的对象不一样,正向代理代理的对象是客户端,反向代理代理的对象是服务端
2. 反向代理
语法:proxy_pass URL
默认:——
位置:loaction
server {
listen 80;
location / {
proxy_pass http://127.0.0.1:8080/;
proxy_redirect default;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffer_size 32k;
proxy_buffering on;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;
}
}