10.Nginx作为静态资源WEB服务-配置语法(sendfile、directio、aio、tcp_nopush、tcp_nodelay、gzip 、gzip_comp_level、gzip_...

静态资源WEB服务

Nginx作为静态资源WEB服务 , Nginx作为静态资源的HTTP WebServer它可以接收客户端类似于"jpg、html、css、js"这种静态资源的请求 , 然后直接通过静态资源的存储得到这些文件返回给客户端 , 这种方式是一种典型的非常高效的传输的模式 , 这种场景常常会用在我们的静态资源处理、请求以及动静分离场景下的应用。

请求一个网站的时候简单可以分为2类请求:静态请求、动态请求;

对于服务端接收静态请求和动态请求的处理是不一样的,动态请求是需要经过服务端的解析器进行一些比较复杂的逻辑运算然对然后对应的数据进行封装再返回给用户,这种数据是动态生成的叫做动态请求,对于无需服务端进行动态生成的,直接从文件系统可以找到返回给用户的这种叫做静态请求,这种文件也就叫做静态资源的文件。

静态资源服务场景-CDN

CDN是“内容分发网络”,这个“网络”不是我们常说的电信联通等网络,他是一个内容型的逻辑分发网络,Nginx在CDN这项技术里面扮演着一个非常重要的角色,Nginx作为每一个节点、资源存储中心节点以及代理前端的节点,起到一个承上启下的WebServer的作用

如下图:



Nginx静态资源WEB服务核心配置模块

sendfile      

当应用程序传输文件时,内核首先缓冲数据,然后将数据发送到应用程序缓冲区。 应用程序反过来将数据发送到目的地。 Sendfile方法是一种改进的数据传输方法,其中数据在操作系统内核空间内的文件描述符之间复制,而不将数据传输到应用程序缓冲区。 这使操作系统资源的利用率提高。

该指令可用于http,server和location代码块:

http{

     sendfile on;

}

此指令默认为off。

directio 直接I/O

操作系统内核通常尝试优化和缓存任何读/写请求。 由于数据在内核中缓存,对同一位置的任何后续读取请求将更快,因为不需要再从磁盘读取信息。

直接I/O是文件系统的一个功能,其从应用程序到磁盘直接读取和写入,从而绕过所有操作系统缓存。 这使得更好地利用CPU周期和提高缓存效率。

该方法用于数据具有较差命中率的地方。 这样的数据不需要在任何高速缓存中,并且可以在需要时加载。 它可以用于提供大文件。 directio指令启用该功能。 该指令可用于http,server和location区块:

location /video/ {

     directio 4m;

}

任何大于指令中指定的文件将由直接I/O加载。 其它情况下禁用此参数。

直接I/O取决于执行数据传输时的块大小。NGINX有directio_alignment指令来设置块大小。 该指令可用于http,server和location区块:

location /video/ {

     directio 4m;

     directio_alignment 512;

}

除了XFS文件系统,默认值512字节在所有Linux版本运行良好。在此文件系统下,大小应增加到4 KB。

aio 异步I/O

异步I/O允许进程进行不受阻塞或不需要等待I/O完成的I/O操作。

aio命令可在NGINX配置的http,server和location区块下使用。 根据在指令所在区块,该指令将为匹配的请求执行异步I/O。 该参数适用于Linux内核2.6.22+和FreeBSD 4.3。 如下代码:

location /data {

     aio on;

}

默认情况下,该参数设置为off。 在Linux上,aio需要启用direction,而在FreeBSD上,sendfile需要禁用以使aio生效。

该指令具有特殊的线程值,可以为发送和读操作启用多线程。 多线程支持仅在Linux平台上可用,并且只能与处理请求的epoll,kqueue或eventport方法一起使用。

为了使用线程值,在编译Nginx时使用–with-threads选项配置多线程支持。 在NGINX全局上下文中使用thread_pool指令添加一个线程池。 在aio配置中使用该线程池:

thread_pool io_pool threads=16;

http{

       ........

      location /data{

            sendfile    on;

            aio        threads=io_pool;

} }

tcp_nopush

作为Nagle算法的替代方案,Linux提供了TCP_CORK选项。 该选项告诉TCP堆栈附加数据包,并在它们已满或当应用程序通过显式删除TCP_CORK指示发送数据包时发送它们。 这使得发送的数据分组是最优量,并且因此提高了网络的效率。

NGINX提供了tcp_nopush指令,在连接套接字时启用TCP_CORK。 该指令可用于http,server和location区块:

http{

     tcp_nopush on;

}

该指令默认情况下禁用。

tcp_nodelay

TCP/IP网络存在“小包”问题,其中单字符消息可能在高负载网络上导致网络拥塞。 例如分组大小为41字节,其中40字节用于TCP报头,只有1字节是有用信息。 这些小包占用了大约4000%的巨大开销并且使得网络饱和。

ohn Nagle通过不立即发送小包来解决问题(Nagle的算法)。 所有这样的分组被收集一定量的时间,然后作为单个分组一次发送。 这改进了底层网络的的效率。 因此,典型的TCP/IP协议栈在将数据包发送到客户端之前需要等待200毫秒。

在打开套接字时可以使用TCP_NODELAY选项来禁用Nagle的缓冲算法,并在数据可用时立即发送。 NGINX提供了tcp_nodelay指令来启用此选项。 该指令可用于http,server和location区块:

http{

     tcp_nodelay on;

}

该指令默认情况下启用。

ngx_http_gzip_module模块

Nginx实现资源压缩的原理是通过ngx_http_gzip_module模块拦截请求,并对需要做gzip的类型做gzip,ngx_http_gzip_module是Nginx默认集成的,不需要重新编译,直接开启即可。

gzip 

这个没的说,打开或关闭gzip

syntax:gzip on | off;

default:

gzip off;

context:http, server, location, if in location

gzip_comp_level 

设置gzip压缩级别,级别越底压缩速度越快文件压缩比越小,反之速度越慢文件压缩比越大( 不是压缩级别越高越好,其实gzip_comp_level 1的压缩能力已经够用了,后面级别越高,压缩的比例其实增长不大,反而很吃处理性能。 )

syntax:gzip_comp_level level;

default:gzip_comp_level 1;

context:http, server, location

gzip_http_version

用于识别http协议的版本,早期的浏览器不支持gzip压缩,用户会看到乱码,所以为了支持前期版本加了此选项。默认在http/1.0的协议下不开启gzip压缩。

syntax:gzip_http_version 1.0 | 1.1;

default:gzip_http_version 1.1;

context:http, server, location



使用GZIP例子:

1.我们这里请求index.html,在nginx默认配置未使用gzip的情况下网络传输的index.html文件大小是466KB

2.开启gzip,并且再次请求index.html,使用gzip的情况下网络传输index.html文件大小是5.5KB,区别很明显吧(为了测试,我试过gzip_comp_level 设置gzip压缩级别 6 ,网络传输index.html文件大小是2.7KB)

location / {

        root  /usr/share/nginx/html;

        index  index.html index.htm;

        gzip on;

        gzip_http_version 1.1;

        gzip_comp_level 1;

    }






优秀的博客文献:

Nginx配置性能优化之I/O和TCP配置

https://www.cnblogs.com/felixzh/p/6283821.html

TCP_NODELAY 和 TCP_NOPUSH的解释

https://www.cnblogs.com/wajika/p/6573014.html

Nginx开启Gzip详解

http://blog.itpub.net/31541037/viewspace-2156996/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358