Nginx的HTTP内核模块

  • Nginx的HTTP内核模块已关闭评论
  • 115,220 views
  • A+

认识Nginx的HTTP功能首先要从它的HTTP核心模块(HttpCoreModule)开始,在安装Nginx的过程中对于一个提供HTTP的访问的Nginx服务器,该模块是不能够被禁用的
1:aio
语法:aio[on|off|sendfile]
默认值:off
使用环境:http,server,location

该指令支持的linux 内核2.6.1922以上版本可以使用

Nginx性能优异在于善于利用操作系统内核的各种特性,比如aio/epoll/sendfile(Linux) /kqueue(FreeBSD)等。对于使用VPS做图片站的站长来说,使用nginx的aio特性会大大提高性能,图片站的特点是大量的读io操 作,nginx aio不用等待每次io的结果,有助于并发处理大量io和提高nginx处理效率。如果包里的nginx没有包含Linux-native aio(asynchronous I/O)的支持,那么需要下载nginx源代码并带上参数--with-file-aio编译。除了要带参数外,Linux内核还必须有支持这一特性的 api-eventfd(),否则在nginx错误日志(/var/log/nginx/error.log)里会看到类似的报错

Nginx代码

  1. eventfd() failed (38: Function not implemented)
  2. worker process 1858 exited with fatal code 2 and can not be respawn

解决方法很简单,升级内核就可以了。

要让nginx使用aio特性还需要修改nginx配置文件:

Nginx代码

  1. # vim /usr/local/nginx/conf/nginx.conf
  2. ...
  3. location / {
  4.   aio on;
  5.   directio 1;
  6.   output_buffers 1 128k;
  7. }
  8. ...

 

Linux-native aio比传统的POSIX aio功能更丰富一些,重要的一点是能通过内核加速提供高性能。直接用Linux-native aio API比较晦涩,为了方便使用和开发Linux-native aio应用程序,我们可以用libaio/libaio-devel库。不过nginx的作者没有用这些库,因为nginx需要eventfd(),而 libaio库里只有0.3.107版本起才支持eventfd,nginx也没有用glibc,因为glibc要到2.8版本才支持 eventfd(),为了减少对库的依赖性,nginx干脆直接用Linux-native aio API。

Nginx代码
  1. $ vim nginx/src/event/modules/ngx_epoll_module.c
  2. ...
  3. #if (NGX_HAVE_FILE_AIO)
  4. /*
  5.  * We call io_setup(), io_destroy() io_submit(), and io_getevents() directly
  6.  * as syscalls instead of libaio usage, because the library header file
  7.  * supports eventfd() since 0.3.107 version only.
  8.  *
  9.  * Also we do not use eventfd() in glibc, because glibc supports it
  10.  * since 2.8 version and glibc maps two syscalls eventfd() and eventfd2()
  11.  * into single eventfd() function with different number of parameters.
  12.  */
  13. ...

 

这里说到了eventfd(),eventfd是Linux-native aio其中的一个API,用来生成file descriptors,这些file descriptors可为应用程序提供更高效“等待/通知”的事件机制。和pipe作用相似,但比pipe更好,一方面它只用到一个file descriptor(pipe要用两个),节省了内核资源,另一方面,eventfd的缓冲区管理要简单得多,pipe需要不定长的缓冲区,而 eventfd全部缓冲只有定长8 bytes。

2:alias

语法:alias file-path|directory-path

默认值:on

使用环境:location

功能:该指令用于指定一个路径,但是它不同于root指令

Nginx 貌似没有虚拟目录的说法,因为它本来就是完完全全根据目录来设计并工作的。如果非要给nginx安上一个虚拟目录的说法,那就只有alias标 签比较"像",干脆来说说alias标签和root标签的区别吧。最基本的区别:alias指定的目录是准确的,root是指定目录的上级目录,并且该上 级目录要含有location指定名称的同名目录。另外,根据前文所述,使用alias标签的目录块中不能使用rewrite的break。

说不明白,看下配置:

location /abc/ {
    alias /home/html/abc/;
}

在这段配置下,http://test/abc/a.html就指定的是/home/html/abc/a.html。这段配置亦可改成

location /abc/ {
    root /home/html/;
}

这样,nginx就会去找/home/html/目录下的abc目录了,得到的结果是相同的。但是,如果我把alias的配置改成:

location /abc/ {
    alias /home/html/def/;
}

那么nginx将会从/home/html/def/取数据,这段配置还不能直接使用root配置,如果非要配置,只有在/home/html/下建立 一个 def->abc的软link(快捷方式)了。一般情况下,在location /中配置root,在location /other中配置alias是一个好习惯。至于alias和root的区别,我估计还没有说完全,如果在配置时发现奇异问题,不妨把这两者换换试试。

nginx alias的设置

nginx也有像apache的别名功能,格式为:

location ~ /alias {
root /home/www/default;
index index.php;
}

但nginx在处理php脚本时,需要传递给fastcgi才能处理,所以比apache的别名设置多一个,下面我们以phpmyadmin别名设置为例:

location ~ ^/phpmyadmin.+.php$ {
root /home/www/default;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /phpmyadmin {
root /home/www/default;
index index.php;
}
3:chunked_transfer_encoding
语法:chunked_transfer_encoding on|off
默认值:on
使用环境:http,server,location

nginx默认提供php网页的时候   Transfer-Encoding: chunked 导致如果自己需要抓数据来用的 时候解码很麻烦。

 解决这个问题,只需要禁止 nginx 进行多余的 chunked 过程。经查,可以在 nginx 配置文件中相应网站的 location 段中加一行“chunked_transfer_encoding off;”。

  1. location / {
  2.         proxy_pass              http://10.0.0.10/;
  3.         proxy_redirect          off;
  4.         proxy_set_header        Host            $http_host;
  5.         proxy_set_header        X-Real-IP       $remote_addr;
  6.         proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  7.         chunked_transfer_encoding       off;
  8. }
4:client_body_in_file_only
语法:client_body_in_file_only on|off
默认值:off
使用环境:http,server,location
功能:该指令总是强制Nginx将客户端请求体存储到一个临时的磁盘文件,即使请求体的实际大小为0.然而需要注意的是,
在启用该指令之后,该文件在请求完成后并不会被移除。该指令可以用于调试和嵌入式Perl模块$r->request_body_file方法的使用。
5:client_body_in_single_buffer
语法:client_body_in_single_buffer
默认值:off
使用环境:http,server,location
功能:该指令在0.7.58以上的nginx版本中提供,用于指定是否将整个客户端请求体保存在单个请求体缓存中。为了减少复制操作
,当使用变量$request_body的时候,推荐使用该指令。
注意:当请求体不能被单个缓存(参考 client_body_buffer_size)容纳下的时候,那么请求体仍然将会保存到磁盘上。
6:client_body_buffer_size
语法:client_body_buffer_size the_size
默认值:8K/16K
使用环境:http,server,location
功能:该指令指定了客户端请求体缓存的大小。如果请求体大于该缓存大小,那么整个请求体或者请求体的某些部分将会被写入临时文件
默认值等于两个页面大小,页面大小依赖于所在的操作系统平台,可能是8K或者是16K。当请求头中Content-Length的值小于指定
缓存的大小时,那么Nginx将会使用较小的一个缓存,因此Nginx也并非总是为每一个请求分配指定大小的缓存。

7:client_body_temp_path
语法:client_body_temp_path dir-path [level1[level2[level3]
默认值:client_body_temp
使用环境:http,server,location
功能:该指令用于指定一个存储临时文件的目录,在这个目录中将会存储客户端请求体。按照指定的子目录等级,可能会有三级目录。

这里的client_body_temp_path是制定post上传的$_FILES上传的文件地址

后面的level1,2,3是什么意思?

因为如果所有上传的文件都放在一个文件夹下,不仅很容易文件名冲突,并且容易导致一个文件夹特别大。

所以有必要创建子目录

这里的level1,2,3如果有值就代表存在一级,二级,三级子目录。

目录名是由数字进行命名的,所以这里的具体的值就是代表目录名的数字位数

比如

client_body_temp_path /spool/nginx/client_temp 3 2; 可能创建的文件路径为 /spool/nginx/client_temp/702/45/00000123457
8: client_body_timeout
语法:client_body_timeout time
默认值:60
使用环境:http,server,location
功能:该指令用于设置读取超时,就是从客户端传入的请求体读取超时。这个超时仅指一个请求的请求头还没有进入请求头的读取步骤时的超时,如果在这个设定的时间内客户端没有发送任何数据,那么Nginx将会返回“Request time out ”(408).

9:client_max_body_size
语法:client_max_body_size size
默认值:client_max_body_size 1m
使用环境:http,server,location
功能:该指令用于设定接受客户端请求体的最大值,在客户端请求体中通过Conent-Length表明。如果客户端请求体大于指定的值,
那么客户端将会收到一个"Request Entity Too Large"(413)的错误;
10:default_type
语法:default_type MIME-type
默认值:default_type text/plain
使用环境:http,server,location
功能:该指令用于指定一个默认的MIME类型,对于没有标准MIME匹配的文件类型将会使用该类型。
nginx总是以下载方式打开页面

11:directio
语法:directio [size|off]
默认值:direction off
使用环境:http,server,location
功能:该指令用于启用O_DIRECT(FreeBSD,Linux),F_NOCACHE(Mac OS X)标志或者directio()函数(Solaris),对于大于指定大小的文件,那么将启动这种
方式读取该文件。如果启用该命令,则将禁用sendfile.

12:error_page
语法:error_page code [code...][=|=answer-code] uri|@named_location
默认值:no
使用环境:http,server,location,if in location

功能:该指令用于指定一个URI,在访问出错的时候会显示该网页。
error_page 404 = http://www.xxx.com/404.html;
error_page  500 502 503 504 = /50x.html;
error_page 404=200 /empty.gif
error_page 404=403 /forbidden.gif
error_page 404= /404.php

location / (error_page 404 @fallback;)
location @fallback(
proxy_pass http://backend;
)
13:if_modified_since
语法:if_modified_since [off|exact|before]
默认值:if_modified_since exact
使用环境:http,server,location
功能:该指令于0.7.24以上的Nginx中提供,它的功能在于定义了如何比较修改时间和请求头中“if-Modified-Since”的时间。
Off:不检测“if-Modified-Since”的请求头(0.7.34);
Exact:精确匹配;
Before:文件修改时间应该小于请求头“if-Modified-Since”的时间。
14:internal
语法:internal
默认值:no
使用环境:location

功能:该指令起到一个提示的作用,如果在一个location中使用了该指令,那么表示这个location只能由“内部”请求访问。对于外部的访问(例如 我们通过浏览器访问)则返回错误“Not found”(404)。内部请求有一下几种方法。
使用error_page重定向指令;
由“ngx_http_ssi_module”模块的include virtual指令创建的子请求;
由“ngx_http_rewrite_module”模块的rewrite指令改变的请求方向。
例如:
error_page  404 /404.html;
location /404.html{
internal;
}
这个例子中,阻止了客户端直接获取错误页,而是重定向到另一个进一步处理的Location中。

15:keepalive_disable
语法:keepalive_disable [msie6|safari|none]...
默认值:msie6 safari
使用环境:http,server,location

该指令用于禁用某些用户带来的keepalive功能,在0.9.0以上的版本中提供了该指令,默认情况下,对于MSIE(低于6.0 service pack 2)和Safari的Keepalive功能禁用。
16:keepalive_timeout
语法:keepalive_timeout[time] [time]
默认值:keepalive_timeout 75
使用环境:http,server,location
功能:该指令有两个参数,第一个参数用于设定客户端的keep-alive连接超时,在这个时间过后,服务器将会关闭连接。第二个选项是可选的,它的值决定了响应头Keep-Alive: timeout="time”的值,这个头能告诉一些浏览器关闭连接,这样服务器就不用再次关闭连接了。如果没有设定这个参数,那么Nginx将不会发送Keep-Alive头。两个参数的值可以不相同。
17:keepalive_requests
语法:keepalive_requests n
默认值:keepalive_requests 100
使用环境:http,server,location
功能:该指令用于设置Nginx服务器能够保持活跃的连接数。
18:large_client_header_buffers
语法:
large_client_header_buffers number size
默认值:
large_client_header_buffers  4  4k/8k
使用环境:http,server
该指令用于指定客户端一些比较大的请求头使用的缓冲区数量和大小。请求头行不能够大于一个缓存的大小,如果客户端发送了一个比较大的头,那么Nginx将会返回一个“Request URI too large”(414)的错误信息。最长的请求头行也必须不能超过一个缓存的大小,否则将会返回“BAd request”(400)错误信息。一个缓存的默认大小等于一个内存页面的大小,这依赖于不同的平台,有的是4K,而有的是8K,如果在请求连接的结尾状态转换为keepalive,那么所占用的这些缓存将会被释放。

19:limit_except
语法:limit_except methods {...}
默认值:no
使用环境:location

功能:该指令用于限制访问location的http方法
例如:
limit_except GET {
allow 192.168.1.0/32;
deny all;
}

20:limit_rate
语法:limit_rate speed
默认值:no
使用环境:http,server,location,if in location

功能:该指令用于指定向客户端传输数据的速度,速度的单位是每秒传输的字节数。需要明白的是,该限制只是针对一个连接的设定,也就是说,如果同时有两个连接,那么他的速度将会是该指令设置的两陪。
如果需要在Server级别对某些客户端限制速度,对于这种情况---这个指令可能并不合适,但是可设置$limit_rate变量,为该变量传递相应的值来实现,例如:
server{
if($slow){
set $limit_rate 4k;
}
}

21:limit_rate_after
语法:limit_rate_after size
默认值:limit_rate_after 1m
使用环境:http,server,location,if in location中的if字段
功能:他的意思是以最大的速度下载time时长后
例如:
location /download{
limit_rate_after 3m;
limit_rate 512k;
}
当一个客户端连接后,将以最快的速度下载3MB,然后再以512k的速度下载。

  • 安卓客户端下载
  • 微信扫一扫
  • weinxin
  • 微信公众号
  • 微信公众号扫一扫
  • weinxin
avatar