专栏名称: SegmentFault思否
SegmentFault (www.sf.gg)开发者社区,是中国年轻开发者喜爱的极客社区,我们为开发者提供最纯粹的技术交流和分享平台。
目录
相关文章推荐
OSC开源社区  ·  Bun ... ·  昨天  
程序员的那些事  ·  OpenAI ... ·  昨天  
程序员的那些事  ·  印度把 DeepSeek ... ·  3 天前  
程序猿  ·  “我真的受够了Ubuntu!” ·  3 天前  
51好读  ›  专栏  ›  SegmentFault思否

Nginx 入门到实战(2):场景实现篇

SegmentFault思否  · 公众号  · 程序员  · 2018-05-28 08:00

正文

上一章了解了nginx的基础理论与配置,这一章将介绍nginx在各种不同场景下的不同使用方法。

一、静态资源WEB服务

1.静态资源类型

非服务器动态运行生成的文件,换句话说,就是可以直接在服务器上找到对应文件的请求:

  1. 浏览器端渲染:HTML,CSS,JS

  2. 图片:JPEG,GIF,PNG

  3. 视频:FLV,MPEG

  4. 文件:TXT,任意下载文件

2.静态资源服务场景-CDN

什么是CDN?例如一个北京用户要请求一个文件,而文件放在的新疆的资源存储中心,如果直接请求新疆距离太远,延迟久。使用nginx静态资源回源,分发给北京的资源存储中心,让用户请求的动态定位到北京的资源存储中心请求,实现传输延迟的最小化。

3.nginx静态资源配置

  1. 配置域:httpserverlocation

  2. #文件高速读取

  3. http {  

  4.     sendfile   on;

  5. }

  6. #在 sendfile 开启的情况下,开启 tcp_nopush 提高网络包传输效率

  7. #tcp_nopush 将文件一次性一起传输给客户端,就好像你有十个包裹,快递员一次送一个,来回十趟,开启后,快递员讲等待你十个包裹都派件,一趟一起送给你

  8. http {  

  9.     sendfile   on;

  10.     tcp_nopush on;

  11. }

  12. #tcp_nodelay 开启实时传输,传输方式与 tcp_nopush 相反,追求实时性,但是它只有在长连接下才生效

  13. http {  

  14.     sendfile   on;

  15.     tcp_nopush on;

  16.     tcp_nodelay on;

  17. }

  1. #将访问的文件压缩传输 (减少文件资源大小,提高传输速度)

  2. #当访问内容以gif或jpg结尾的资源时

  3. location ~ .*\.(gif|jpg)$ {  

  4.    gzip on ; #开启

  5.    gzip_http_version 1.1; #服务器传输版本

  6.    gzip_comp_level 2; #压缩比,越高压缩越多,压缩越高可能会消耗服务器性能

  7.    gzip_types   text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss image/jpeg image/gif image/png;     #压缩文件类型

  8.    root /opt/app/code;     #对应目录(去该目录下寻找对应文件)

  9. }

  10. #直接访问已压缩文件

  11. #当访问路径以download开头时,如www.baidu.com/download/test.img

  12. #去/opt/app/code目录下寻找test.img.gz文件,返回到前端时已是可以浏览的img文件

  13. location ~ load^/download {  

  14.    gzip_static on #开启;

  15.    tcp_nopush on;

  16.    root /opt/app/code;

  17. }

二、浏览器缓存

HTTP协议定义的缓存机制(如:Expires; Cache-control等 ):减少服务端的消耗,降低延迟。

1.浏览器无缓存

浏览器请求 -> 无缓存 -> 请求WEB服务器 -> 请求相应 -> 呈现。

呈现 阶段会根据缓存的设置在浏览器中生成缓存。

2.浏览器有缓存

浏览器请求 -> 有缓存 -> 校验本地缓存时间是否过期 -> 没有过期 -> 呈现。

若过期从新请求WEB服务器。

3.语法配置

  1. location ~ .*\.(html|htm)$ {  

  2.    expires 12h;    #缓存12小时

  3. }

服务器响应静态文件时,请求头信息会带上 etag 和 last modified since 2个标签值,浏览器下次去请求时,头信息发送这两个标签,服务器检测文件有没有发生变化,如无,直接头信息返 etag 和last modified since,状态码为 304 ,浏览器知道内容无改变,于是直接调用本地缓存,这个过程也请求了服务,但是传着的内容极少。

三、跨站访问

开发nginx跨站访问设置:

  1. location ~ .*\.(html|htm)$ {  

  2.     add_header Access-Control-Allow-Origin *;

  3.     add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;

  4.     #Access-Control-Allow-Credentials true #允许cookie跨域

  5. }

在响应中指定 Access-Control-Allow-Credentials 为 true 时,Access-Control-Allow-Origin 不能指定为 *,需要指定到具体域名。

相关跨域内容可参考 Laravel 跨域功能中间件 使用代码实现跨域,原理与nginx跨域配置相同。

四、防盗链

防止服务器内的静态资源被其他网站所套用。此处介绍的 nginx 防盗链为基础方式,其它更加深入的方式将在之后的文章介绍。

首先,需要理解一个nginx变量:

  1. $http_referer

表示当前请求上一次页面访问的地址,换句话说,访问 www . baidu . com 主页,这是第一次访问,所以 $http_referer 为空,但是 访问此页面的时候还需要获取一张首页图片,再请求这张图片的时候 $http_referer 就为 www . baidu . com

然后配置:

  1. location ~ .*\.(jpg|gif)$ {  

  2.    #valid_referers 表示我们允许哪些 $http_referer 来访问

  3.    #none 表示没有带 $http_referer,如第一次访问时 $http_referer 为空

  4.    #blocked 表示 $http_referer 不是标准的地址,非正常域名等

  5.    #只允许此ip

  6.    valid_referers none blocked 127.xxx.xxx.xx

  7.    if ($invalid_referer) {     #不满足情况下变量值为1

  8.        return 403;

  9.    }

  10. }

五、HTTP代理服务

Nginx可以实现多种代理方式:

  • HTTP

  • ICMP\POP\IMAP

  • HTTPS

  • RTMP

1. 代理区别







请到「今天看啥」查看全文