5种不同的I/O模型,Nginx详解,(第28天)
http回顾
web服务器:http协议
http协议一般使用80端口,HyperText Transfer Procotol
http协议支持文本和MIME类型的数据。
MIME类型:major/minor: 比如 text/plain, text/html, image/jpeg
web资源的表示方式:URL (scheme://server:port/path/to/source)
http事务:request <----> response
request:
<method> <URL> <version>
<HEADERS>
<body>
response:
<version> <status> <reason phrase>
<HEADERS>
<body>
协议格式:文本,二进制
HTTP支持的方法:GET, HEAD, POST, (WEBDAV) PUT, DELETE, TRACE, OPTIONS
status code:
1xx: 信息类
2xx: 成功类,200
3xx: 重定向,301(永久), 302(临时), 304(Not modified)
4xx: 客户端类错误,403, 401, 404,405不支持的方法,412,413
5xx: 服务端类错误,500,502,503
HEADER 首部:
通用首部:
请求首部:
If-Modified-Since
If-None-Match
如上的2个请求首部在反向代理的缓存功能中会用到
响应首部:
实体首部:描述body的属性的首部
扩展首部:非标准的首部
web页面:一个页面通常有多个资源(image,js,css等)
页面中通过超链接引用多个资源。
请求一个页面时,客户端浏览器加载这些资源,所以需要向服务器发起多个连接请求(每个连接都要完成TCP 3次握手)。请求完这些资源之后,客户端浏览器就保存了这些资源的缓存副本(如果可以缓存)。当下一次再访问这个页面的时候,浏览器可能就会发起条件式请求(If-Modified-Since, If-None-Match),如果资源未改变,服务器端就告知客户端可以使用客户端自身的本地缓存。
浏览器可以多线程工作,一次发起多个http请求。
浏览器对于单个域名(www.blogger.com)假设限制4个线程同时发起请求,那么www.blogger.com的开发者就可能将图片放置在另外的域名之下,比如3.bp.blogspot.com的不同的域名之下,如此一来,浏览器对于3.bp.blogspot.com域名也可以启用4个线程同时发起请求。这也是网站的用户体验优化之一。
PV:page view,例如请求首页,只能表示1次pv,其他的页面也是类似
UV:user view 独立IP
HTTP的认证:
基于IP的认证
基于用户和密码的认证:basic和digest
资源映射:有alias和document
Alias:路径别名
Document
httpd: MPM 多道处理模块
prefork, worker, event
I/O类型:如下4种
同步和异步:synchronous, asyncrhonous
关注的是消息通知机制
同步:调用发出不会立即返回,但一旦返回就可以返回最终结果;
异步:调用发出之后,被调用方立即返回消息,但返回的非最终结果;被调用者通过状态、通知机制来通知调用者,或通过回调函数来处理结果;
阻塞和非阻塞:block, nonblock
关注的是调用者等待被调用者返回结果(消息、返回值)时的状态
阻塞:调用结果返回之前,调用者(调用线程)会被挂起;调用者只有在得到结果之后才会返回;
非阻塞:调用结果返回之前,调用者(调用线程)不会被挂起,调用不会阻塞当前线程;
5种I/O模型:
blocking IO 阻塞型IO
nonblocking IO 非阻塞型IO
IO multiplexing 复用型IO
signal driven IO 事件驱动IO
asyncrhonous IO 异步IO
举个例子:一个read操作:
(1) 等数据准备好;
(2) 从内核内存向进程内存复制数据;
read操作会发生系统调用,也就是请求内核来完成读取硬盘的操作(只有内核可以直接操作硬件)。此时,内核收到系统调用请求,把数据从磁盘读到内核内存中,然后从内核内存copy到特定进程内存中。所以呢,这个过程有2个IO等待,一个是从磁盘到内核内存中,一个是从内核内存到进程内存中,我们这里的IO模型说的就是数据从内核内存到进程内存的这种情况。
阻塞型IO:进程发出IO请求之后,就挂起了(进入不可中断睡眠状态),要一直等到内核完成该请求之后才恢复该进程
左边表示调用者,右边表示内核,即被调用者。右边的上半部分表示数据从磁盘到内核内存,下半部分表示数据从内核内存到调用者用户态进程。
非阻塞型IO:进程发出IO请求之后,进程不会挂起,但是会忙等待,向内核轮询请求是否已经完成,当请求的数据从磁盘到内核内存之后,数据从内核内存中到用户态进程内存的过程仍是阻塞的。
复用型IO:select(), poll() select由BSD研发,poll由SysV研发, 这2个差别不大。httpd的prefork模型和worker模型就是基于select的。
当IO请求到来时,请求是被内核代理人(select)接收的,内核代理人再发送给内核。select最多可以注册1024个IO(1024是一个性能拐点),这个数字由内核决定的(应该是写死在内核代码中了)。所以调用者此时还是阻塞的,阻塞在select上。但是对于数据从内核内存中到用户态进程内存的过程,仍是阻塞的,阻塞在内核自己的调用等待中。
事件型驱动IO: httpd的event模型使用该IO模型 epoll
调用者发送IO请求时,被调用者立即返回信息,让调用者不需阻塞,该干嘛干嘛去。会由被调用者通过某种通知机制(一般是通过callback函数)告知调用者IO请求的前半部分(就是数据已经从磁盘读取到内核内存中了)已完成。这样一来,服务的进程就可以接收多个连接请求。一旦调用者接收到被调用的通知,调用者就必须阻塞起来等待IO请求的后半部分,因为调用者必须阻塞等待内核将数据从内核内存复制到用户态进程内存中。所以这种模型的IO第一阶段属于非阻塞,但是第二阶段依然阻塞。httpd的event模型和nginx使用的是事件型驱动IO。
通知机制:水平触发(多次通知),边缘触发 (只通知一次)
异步IO:当调用者发起IO请求时,被调用者返回信息,让调用者该干嘛干嘛去。然后被调用者就去处理IO请求了,直到整个IO请求处理完成(包括IO的整个事件,即数据已从内核内存复制到进程内存中)之后被调用者才通知调用者将数据接收回去。nginx可以使用异步IO。
总结:
--------------------------------华丽的分割线--------------------------------------------
Nginx:
作者:Igor Sysoev, Rambler Media(俄罗斯三大门户之一)
engine X
Tengine(taobao基于Nginx修改而来)
Registry
libevent: 高性能的网络库,实现了 epoll,nginx使用该类库
Nginx的特性:
模块化设计、较好扩展性 (但是不支持模块的动态装载和卸载,Tengine支持动态装载卸载模块)
高可靠性
master-->worker
低内存消耗
10000个keep-alive连接在Nginx仅消耗2.5MB
支持热部署
不停机而更新配置文件、更换日志文件、更新服务器程序版本
支持事件驱动,AIO,MMAP(内存映射)
Nginx基本功能:
静态资源的web服务器,能缓存打开的文件的描述符
http, smtp, pop3协议的反向代理服务器,反向代理服务器一般吧自己当作某个网站的代理服务者。正向代理一般把自己当作是所有网站的代理服务者。代理可以有多级的。
支持缓存、负载均衡;这2个功能主要在nginx作为反向代理服务器的时候使用。
支持FastCGI (fpm), uWSGI(python)
模块化,非DSO机制,过滤器zip,SSI及图像大小调整;
支持SSL
Nginx扩展功能:
基于名称和IP的虚拟主机;
支持keepalive
支持平滑升级
定制访问日志 ,支持使用日志缓冲区提高日志存储性能
支持url rewrite
支持路径别名
支持基于IP及用户的访问控制
支持速率限制,支持并发数限制
Nginx的基本架构:
一个master进程,生成一个或多个worker
事件驱动: epoll(linux), kqueue(BSD,unix), /dev/poll (event ports)(Solaris)
复用器:select, poll, rt signals(实时信号)
支持sendfile, sendfile64
支持AIO
支持mmap,也就是内存映射
sendfile详解:服务器进程接收到一个客户端的http请求的时候,当请求报文到到服务器端的网卡时,由内核接收,然后向上传递到相应的用户态进程httpd,假设httpd进程发现该请求是一个静态资源,那么httpd进程就要发起系统调用,等待内核完成IO,内核会把数据从磁盘读取到内核内存,再把数据从内核内存copy到httpd进程内存中。这之后,httpd进程获取到静态资源的数据,将这些数据构建成响应报文发给内核,内核送往网卡。这里有一个优化步骤,内核从磁盘读取数据到内核内存之后,直接把数据发送网卡。
nginx的工作机制:
非阻塞、事件驱动、一个master生成一个或多个worker, 每个worker响应n个请求;
Nginx模块类型:
核心模块
Standard HTTP modules
Optional HTTP modules
Mail modules
3rd party modules
Nginx安装方法:
rpm(位于epel源中 yum list nginx && yum -y install nginx)及源码安装:
nginx源码安装的步骤如下所示:
yum -y install pcre-devel
useradd -r nginx
./configure --help (这里边的--with-XXXX表示可能默认没有启用,如果要使用这些功能使用--with-XXXX启用之,--without-XXXX表示可能默认启用了,如果你不想启用这些功能,可以使用--without-XXXX来表示禁用这些功能)
# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --with-debug
# make && make install
mkdir -pv /var/tmp/nginx/{client,proxy,fastcgi,uwsgi} 创建相关目录
要启动nginx,直接运行nginx命令即可。
Tmalloc, gperftools
http://nginx.org/ nginx主页面
http://nginx.org/en/docs/ nginx文档页面
nginx的配置文件: /etc/nginx/nginx.conf
main配置段 :表示全局配置段
events{ 定义event模型的工作特性
}
http { 定义http协议相关的配置
}
配置指令要以分号结尾,语法格式:
directive value1 [value2...];
支持使用变量:包括模块变量和自定义的变量
由模块提供的内置变量
自定义变量 set var_name value
主配置段的指令的类别: ngx_core_module 模块中
用于调试、定位问题类指令
正常运行必备的配置类指令
优化性能的配置类指令
事件相关的配置类指令
正常运行的必备配置:ngx_core_module 模块中
1、user USERNAME [GROUPNAME];
指定运行worker进程的用户 和组,例如:
user nginx nginx;
2、pid /path/to/pid_file;
指定nginx的pid文件;例如
pid /run/nginx.pid;
3、worker_rlimit_nofile #; 覆盖掉ulimit -n
指定所有worker进程所能够打开的最大文件句柄数目;
同时连接的数量受限于系统上可用的文件描述符的数量,因为每个套接字将打开一个文件描述符。 如果NGINX尝试打开比可用文件描述符更多的套接字,会发现error.log中出现Too many opened files的信息。使用ulimit检查文件描述符的数量:$ ulimit -n
现在,将此值增加到大于worker_processes * worker_connections的值。 应该是增加当前worker运行用户的最大文件打开数值。NGINX提供了worker_rlimit_nofile指令,这是除了ulimit的一种设置可用的描述符的方式。 该指令与使用ulimit对用户的设置是同样的效果。此指令的值将覆盖ulimit的值。
4,worker_rlimit_core size; 很少设置
更改所有的worker进程的核心文件(RLIMIT_CORE)的最大大小限制。用于在不重新启动main进程的情况下增加限制。
4、worker_rlimit_sigpending #;
指定每个用户能够发往worker进程的信号的数量;
优化性能相关的配置:ngx_core_module 模块中
1、worker_processes #:
worker线程的个数;通常应该为物理CPU核心个数减1;支持设置为auto,表示自动设定
2、worker_cpu_affinity cpumask ...;
绑定worker进程至指定的CPU核心上,表示该worker进程只能运行在某个特定的CPU核心上,不会被调度到其他的CPU核心上; 虽然无法避免切换进程时,将该worker进程切换出去,但是可以提高CPU的高速缓存的命中率(一级指令缓存,一级数据缓存等)
CPUMASK
0001
0010
0100
1000
例如:
worker_cpu_affinity 00000001 00000010 00000100; 支持设置为auto
3、timer_resolution t;
计时器解析度,降低此值,导致减少worker进程的对gettimeofday()系统调用的次数。By default, gettimeofday() is called each time a kernel event is received。
4、worker_priority nice;
nice的取值范围 -20, 19,nice值越小,优先级越高
事件相关的配置:这些配置要写在events{}段中 ngx_core_module 模块中
1、accept_mutex [on|off] mutex表示互斥锁
内部调用用户 请求至各worker时用的负载均衡锁;打开时,也就是设置为on,表示能让多个worker进程轮流地、序列化地去响应新请求;关闭时,表示当请求到来之时,所有的waitting状态的worker进程被唤醒一拥而上去争抢处理到来的请求(惊群效应),但是只有一个worker进程可以抢到该请求。
2、lock_file /path/to/lock_file;互斥锁锁文件的路径 这是放在main配置段中的
3、accept_mutex_delay #ms;
4、use [epoll | rgsig | select | poll | kqueue | /dev/poll/ | eventport ];
定义使用的事件模型;建议让Nginx自动选择;
5、worker_connections #;
每个worker进程所能够响应的最大并发请求数;
例如 worker_connections 51200
总的并发请求数量是worker_connections × worker_processes
用于调试、定位问题(编译nginx时,要使用--with-debug选项): ngx_core_module 模块中
1、daemon [off|on]
是否以守护进程方式启动nginx;调试时可以设置为off
2、master_process on|off;
是否以master/worker模型来运行nginx;调试时可以设置为off
3、error_log /path/to/error_log level;
错误日志文件及其级别;出于调试的目的,可以使用debug级别,但此级别只有在编译nginx时使用了--with-debug选项才有效;
总结:最常用的需要修改的配置参数:
worker_processes
worker_connections
worker_cpu_affinity
worker_priority
nginx -s signal : send signal to a master process: stop, quit, reopen, reload
Nginx作为web服务器时使用的配置:
http {} 由ngx_http_core_module模块引入
http {}的配置框架如下所示:
http {
upstream {
.,..
} 负载均衡和反向代理使用
server {
listen IP:PORT;
# 虚拟主机
location /URL {
if ...{
...
}
root "/path/to/somewhere";
...
}每个location类似于httpd的Location,用于定义URL与本地文件系统的映射关系,location可以有多个,localtion定义在server中
}
server {
,,.
} 每个server类似于httpd的VirtualHost
}
注意:与http配置相关的指令必须放在http、server、location、upstream、if块中;有些指令只能配置在其中的某些块中。
1、server {} server只能定义在http的上下文中
nginx定义虚拟主机;
例如:
server {
listen 8080;
root "/vhosts/www/web1"; html文档存放目录
server_name www.magedu.com;
}
例子:如下的2个server即可配置为2个基于主机名(host)的虚拟主机
server {
listen 80;
root /vhosts/www/web1/;
server_name www.aa.com;
}
server {
listen 80;
root /vhosts/www/web2/;
server_name www.bb.com;
}
2、listen
监听的端口
完整格式 :listen address[:port] [default_server] [ssl] [spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen address[:port] [default_server] ssl
backlog=number: 指明TCP协议backlog队列的大小。默认为-1,表示不设置;
rcvbuf=size:设定监听句柄的SO_RCVBUF参数;
例如:
listen 172.16.100.8:8080
3、server_name name [...]; server_name只能定义在server的上下中
后可跟多个主机名;名称还可以使用通配符和正则表达式(正则表达式以~开头);
有多个server_name的时候,server_name的匹配顺序如下:
(1) 先做精确匹配;www.magedu.com:
(2) 左侧通配符匹配,例如:*.magedu.com;
(3) 右侧通配符匹配,例如:www.*;
(4) 正则表达式匹配,例如: ~^.*\.magedu\.com$
(5) default_server
4、location [=|~|~*|^~] /uri {...} location第一种用法 略微复杂
location @name location第二种用法
功能:允许根据用户请求的URI来匹配定义的各个location,匹配到时,此请求将被相应的location块中的配置所处理,例如做访问控制等功能;
=: 精确匹配检查;
^~:URI的前半部分匹配,并且不检查正则表达式;
~: 正则表达式模式匹配,区分字符大小写;
~*:正则表达式模式 匹配,不区分字符大小写;
匹配优先级:精确匹配(=)、^~、~和~*、不带符号的URL进行左侧匹配;
例如:
server {
listen 80;
server_name www.magedu.com;
location / {
root /vhosts/web1/;
}
location /images/ {
root /vhosts/images/;
}
location ~* \.php$ {
fcgipass;
}
}
http://www.magedu.com/index.php
5、root path 类似于httpd的document
设置web资源路径映射;用于指明请求的URL所对应的文档在文件系统上的根目录路径;root可以放在http,server,location,if上下文中
location /images/ {
root "/web/imgs/";
}
6、alias path
用于location配置段,定义路径的别名
location /images/ {
alias /www/pictures/;
}
访问http://www.magedu.com/images/a.jpg 对应于 文件系统上的/www/pictures/a.jpg
注意:root表示指明路径为对应location的“ /” URL;alias表示路径映射,即location中的URL是相对于alias所指明的路径而言;
7、index file 位于ngx_http_index_module 模块中,可以 http, server, location上下文中
默认主页面
index index.html;
8、error_page code [...] [=code] URI | @name
根据http状态码重定向到指定的错误页面,可以放置于http, server, location, if上下文中
error_page 404 /404.html;
=[code]: 以指定的响应码进行响应;省略code表示以新资源的响应码为响应码;
error_page 404 =200 /404.html; 以200响应码响应404错误
9、try_files
try_files path1[,path2,...] URI
10:基于IP的访问控制 使用allow和deny,这2个指令可以用于http,server,location等上下文中
例如:下面的例子表示,拒绝所有ip访问,仅开放172.16.0.0/16网段的地址访问,allow和deny后面可以直接跟单个ip地址或者是网络地址段。
allow 172.16.0.0/16;
deny all;
11:基于用户的basic认证配置:使用auth_basic和auth_basic_user_file指令,这2个指令可以用于http,server,location等上下文中
例如:
auth_basic "Only for VIP"; 这个描述文字说明对此目录的访问需要认证的原因
auth_basic_user_file /etc/nginx/users/.htpasswd;
htpasswd命令创建用户账号文件; htpasswd -c -m /etc/nginx/users/.htpasswd jerry 创建一个jerry用户和密码,并把用户名和密码哈希写入/etc/nginx/users/.htpasswd文件中
12:配置nginx使之支持SSL:
首先要生成服务器(比如www.magedu.com)证书,这个步骤请查阅之前的文章。之后,在server上下文中配置如下的选项:
linsten 443 ssl;
server_name www.magedu.com;
ssl_certificate "/etc/pki/nginx/server.crt"; 服务器证书文件
ssl_certificate_key "/etc/pki/nginx/private/server.key"; 证书的key文件
ssl_session_cache shared:SSL:1m; SSL会话缓存
ssl_session_timeout 10m; SSL会话超时时间
ssl_ciphers HIGH:!aNULL:!MD5; SSL使用哪种加密方式传输报文
ssl_prefer_server_ciphers on;
13:开启状态页,使用stub_status指令仅能用于location上下文中。
例如:
location /status {
stub_status on;
allow 172.16.100.6;
deny all;
}
响应结果示例:
Active connections: 8 表示活动的连接数量
server accepts handled requests
241 241 431 第1个表示已经接受的连接数,第2已经处理过的连接数,第3个表示已经处理的请求数量,注意一个请求可能会有上百个连接,在保持连接(keeplive)的模式下,请求数量可能高于连接数量
Reading: 0 Writing: 1 Waiting: 5 Reading表示正处于接收请求状态的连接数,Writing表示请求已经接收完成,正处于处理请求或者发送响应的过程中的连接数,Waiting表示处于保持连接模式,且处于活动状态的连接数。
14:rewrite指令,用于URL重写,一般用于localtions上下文中
rewrite regex replacement flag;
例如:
...
rewrite ^/images/(.*\.jpg)$ /imgs/$1 last;
rewrite ^/imgs/(.*\.jpg)$ /images/$1 last;
...
假设访问http://www.magedu.com/images/a/b/c/1.jpg 会变成访问http://www.magedu.com/imgs/a/b/c/1.jpg
flage:有如下取值
last 此rewrite规则重写完成之后,不再被后面其他的rewrite规则进行处理,而是由浏览器重新对重写后的URL再一次发起请求,并从头开始执行类似的过程。
break 一旦此rewrite规则重写完成之后,由User Agent对新的URL重新发起请求,且不再会被当前location内的任何rewrite规则所检查。
redirect 以302响应码(临时重定向)返回新的URL
permanent 以301响应码(永久重定向)返回新的URL
15:if指令,一般用在server,location上下文中
if (condition) {
...
}
condition的取值有如下等情形来判断:
1:变量名,变量名为空字符串或0,则为false,其他的为true
2: condition支持的比较表达式有如下几种:
= 等于
!= 不等于
~ 正则表达式的模式匹配操作,区分大小写
~* 正则表达式的模式匹配操作,不区分大小写
!~ 对~取反
!~* 对~*取反
-f, !-f 测试路径是否为文件
-d, !-d 测试路径是否为目录
-e, !-e 测试文件是否存在
-x, !-x 测试文件是否可执行
例如:
if ($http_user_agent ~* MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
16:防止盗链
location ~* \.(jpg|gif|jpeg|png)$ {
valid_referer non blocked www.magedu.com; 定义合法引用是www.magedu.com
if ($invalid_referer) {
rewrite ^/ http://www.magedu.com/403.html redirect;
}
}
17:定制访问日志使用log_format和access_log指令
例如:
log_format main ' $remote_addr - $remote_user [$time_local] "$request" '
' $status $body_bytes_sent "$http_referer" '
' "$http_user_agent" "$http_x_forwarded_for" ';
access_log /var/log/nginx/access.log main;
注意:此处使用的变量可以取自nginx的各个模块的内建变量
网络连接相关的配置:
1、keepalive_timeout time;
保持连接(长连接)的超时时长,默认为75s;
2、keepalive_requests #;
在一次保持连接上允许承载的最大资源请求数;
3、keepalive_disable [msie6|safari|none]
为指定类型的User_Agent禁用长连接;
4、tcp_nodelay on|off
对长连接是否使用TCP_NODELAY选项;表示TCP不延迟
5、client_header_timeout time;
服务器端读取http请求报文首部的超时时长;
6、client_body_timeout time;
服务器读取http请求报文body部分的超时时长;
7、send_timeout time;
服务器发送响应报文的超时时长;
nginx的fastcgi的相关配置:
LNMP:php启用为fpm模型
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params; 包含/etc/nginx/fastcgi_params文件
}
[root@hp-laptop nginx]# cat /etc/nginx/fastcgi_params
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
将$query_string的值赋值给QUERY_STRING,大写的QUERY_STRING是在fastcgi中使用的。
对客户端请求进行限制:
1、limit_except METHOD {...}
指定对范围之外的其它方法的访问控制;
limit_except GET {
allow 172.16.0.0/16;
deny all;
}
2、client_body_max_size SIZE;
限制请求报文中body部分的上限;通过检测请求报文首部中的"Content_Length"来判定;
3、limit_rate speed;
限制客户端每秒种传输的字节数,默认为0,表示无限制;
对内存或磁盘资源进行分配
1、client_body_in_file_only on|clean|off;
请求报文的body部分是否可暂存于磁盘;on表示允许,并且即使请求结束,也不会删除暂存的内容;clean表示会删除;off不允许暂存;
2、client_body_in_single_buffer on|off
3、client_body_buffer_size size;
4、client_body_temp_path DIR [level1 [level2 [level3 [level4]]]]
例如:client_body_temp_path /var/tmp/nginx/client 1 2
5、client_header_buffer_size size:
MIME类型相关的配置:
1、types {}
定义MIME types至文件的扩展名;
types {
text/html .html;
image/jpeg .jpg;
}
2、default_type MIME-TYPE;
文件操作优化相关的配置:
1、sendfile on|off;
2、aio on|off;
3、directio size|off;
是否使用O_DIRECT选项去请求读取文件;与sendfile功能互斥;
4、open_file_cache max=N[inactive=time] | off;
nginx可以缓存以下三种信息:
(1) 文件句柄、文件大小和最近一次修改时间;
(2) 打开目录的目录结构;
(3) 没有找到的或者没有权限操作的文件的相关信息;
max=N表示可缓存的最大条目上限;一旦到达上限,则会使用LRU从缓存中删除最近最少使用的条目;
inactive=time: 在inactive指定的时长内没有被访问过的缓存条目就会淘汰;
5、open_file_cache_errors on|off;
是否缓存在文件缓存中缓存打开文件时出现找不到路径,没有权限等的错误信息;
6、open_file_cache_min_uses time;
每隔多久检查一次缓存中缓存条目的有效性;默认60s;
重点关注:server{}, location{}, listen, server_name, root, alias, keepalive_timeout, keepalive_requests, error_page
web服务器:http协议
http协议一般使用80端口,HyperText Transfer Procotol
http协议支持文本和MIME类型的数据。
MIME类型:major/minor: 比如 text/plain, text/html, image/jpeg
web资源的表示方式:URL (scheme://server:port/path/to/source)
http事务:request <----> response
request:
<method> <URL> <version>
<HEADERS>
<body>
response:
<version> <status> <reason phrase>
<HEADERS>
<body>
协议格式:文本,二进制
HTTP支持的方法:GET, HEAD, POST, (WEBDAV) PUT, DELETE, TRACE, OPTIONS
status code:
1xx: 信息类
2xx: 成功类,200
3xx: 重定向,301(永久), 302(临时), 304(Not modified)
4xx: 客户端类错误,403, 401, 404,405不支持的方法,412,413
5xx: 服务端类错误,500,502,503
HEADER 首部:
通用首部:
请求首部:
If-Modified-Since
If-None-Match
如上的2个请求首部在反向代理的缓存功能中会用到
响应首部:
实体首部:描述body的属性的首部
扩展首部:非标准的首部
web页面:一个页面通常有多个资源(image,js,css等)
页面中通过超链接引用多个资源。
请求一个页面时,客户端浏览器加载这些资源,所以需要向服务器发起多个连接请求(每个连接都要完成TCP 3次握手)。请求完这些资源之后,客户端浏览器就保存了这些资源的缓存副本(如果可以缓存)。当下一次再访问这个页面的时候,浏览器可能就会发起条件式请求(If-Modified-Since, If-None-Match),如果资源未改变,服务器端就告知客户端可以使用客户端自身的本地缓存。
浏览器可以多线程工作,一次发起多个http请求。
浏览器对于单个域名(www.blogger.com)假设限制4个线程同时发起请求,那么www.blogger.com的开发者就可能将图片放置在另外的域名之下,比如3.bp.blogspot.com的不同的域名之下,如此一来,浏览器对于3.bp.blogspot.com域名也可以启用4个线程同时发起请求。这也是网站的用户体验优化之一。
PV:page view,例如请求首页,只能表示1次pv,其他的页面也是类似
UV:user view 独立IP
HTTP的认证:
基于IP的认证
基于用户和密码的认证:basic和digest
资源映射:有alias和document
Alias:路径别名
Document
httpd: MPM 多道处理模块
prefork, worker, event
I/O类型:如下4种
同步和异步:synchronous, asyncrhonous
关注的是消息通知机制
同步:调用发出不会立即返回,但一旦返回就可以返回最终结果;
异步:调用发出之后,被调用方立即返回消息,但返回的非最终结果;被调用者通过状态、通知机制来通知调用者,或通过回调函数来处理结果;
阻塞和非阻塞:block, nonblock
关注的是调用者等待被调用者返回结果(消息、返回值)时的状态
阻塞:调用结果返回之前,调用者(调用线程)会被挂起;调用者只有在得到结果之后才会返回;
非阻塞:调用结果返回之前,调用者(调用线程)不会被挂起,调用不会阻塞当前线程;
5种I/O模型:
blocking IO 阻塞型IO
nonblocking IO 非阻塞型IO
IO multiplexing 复用型IO
signal driven IO 事件驱动IO
asyncrhonous IO 异步IO
举个例子:一个read操作:
(1) 等数据准备好;
(2) 从内核内存向进程内存复制数据;
read操作会发生系统调用,也就是请求内核来完成读取硬盘的操作(只有内核可以直接操作硬件)。此时,内核收到系统调用请求,把数据从磁盘读到内核内存中,然后从内核内存copy到特定进程内存中。所以呢,这个过程有2个IO等待,一个是从磁盘到内核内存中,一个是从内核内存到进程内存中,我们这里的IO模型说的就是数据从内核内存到进程内存的这种情况。
阻塞型IO:进程发出IO请求之后,就挂起了(进入不可中断睡眠状态),要一直等到内核完成该请求之后才恢复该进程
左边表示调用者,右边表示内核,即被调用者。右边的上半部分表示数据从磁盘到内核内存,下半部分表示数据从内核内存到调用者用户态进程。
非阻塞型IO:进程发出IO请求之后,进程不会挂起,但是会忙等待,向内核轮询请求是否已经完成,当请求的数据从磁盘到内核内存之后,数据从内核内存中到用户态进程内存的过程仍是阻塞的。
复用型IO:select(), poll() select由BSD研发,poll由SysV研发, 这2个差别不大。httpd的prefork模型和worker模型就是基于select的。
当IO请求到来时,请求是被内核代理人(select)接收的,内核代理人再发送给内核。select最多可以注册1024个IO(1024是一个性能拐点),这个数字由内核决定的(应该是写死在内核代码中了)。所以调用者此时还是阻塞的,阻塞在select上。但是对于数据从内核内存中到用户态进程内存的过程,仍是阻塞的,阻塞在内核自己的调用等待中。
事件型驱动IO: httpd的event模型使用该IO模型 epoll
调用者发送IO请求时,被调用者立即返回信息,让调用者不需阻塞,该干嘛干嘛去。会由被调用者通过某种通知机制(一般是通过callback函数)告知调用者IO请求的前半部分(就是数据已经从磁盘读取到内核内存中了)已完成。这样一来,服务的进程就可以接收多个连接请求。一旦调用者接收到被调用的通知,调用者就必须阻塞起来等待IO请求的后半部分,因为调用者必须阻塞等待内核将数据从内核内存复制到用户态进程内存中。所以这种模型的IO第一阶段属于非阻塞,但是第二阶段依然阻塞。httpd的event模型和nginx使用的是事件型驱动IO。
通知机制:水平触发(多次通知),边缘触发 (只通知一次)
异步IO:当调用者发起IO请求时,被调用者返回信息,让调用者该干嘛干嘛去。然后被调用者就去处理IO请求了,直到整个IO请求处理完成(包括IO的整个事件,即数据已从内核内存复制到进程内存中)之后被调用者才通知调用者将数据接收回去。nginx可以使用异步IO。
总结:
--------------------------------华丽的分割线--------------------------------------------
Nginx:
作者:Igor Sysoev, Rambler Media(俄罗斯三大门户之一)
engine X
Tengine(taobao基于Nginx修改而来)
Registry
libevent: 高性能的网络库,实现了 epoll,nginx使用该类库
Nginx的特性:
模块化设计、较好扩展性 (但是不支持模块的动态装载和卸载,Tengine支持动态装载卸载模块)
高可靠性
master-->worker
低内存消耗
10000个keep-alive连接在Nginx仅消耗2.5MB
支持热部署
不停机而更新配置文件、更换日志文件、更新服务器程序版本
支持事件驱动,AIO,MMAP(内存映射)
Nginx基本功能:
静态资源的web服务器,能缓存打开的文件的描述符
http, smtp, pop3协议的反向代理服务器,反向代理服务器一般吧自己当作某个网站的代理服务者。正向代理一般把自己当作是所有网站的代理服务者。代理可以有多级的。
支持缓存、负载均衡;这2个功能主要在nginx作为反向代理服务器的时候使用。
支持FastCGI (fpm), uWSGI(python)
模块化,非DSO机制,过滤器zip,SSI及图像大小调整;
支持SSL
Nginx扩展功能:
基于名称和IP的虚拟主机;
支持keepalive
支持平滑升级
定制访问日志 ,支持使用日志缓冲区提高日志存储性能
支持url rewrite
支持路径别名
支持基于IP及用户的访问控制
支持速率限制,支持并发数限制
Nginx的基本架构:
一个master进程,生成一个或多个worker
事件驱动: epoll(linux), kqueue(BSD,unix), /dev/poll (event ports)(Solaris)
复用器:select, poll, rt signals(实时信号)
支持sendfile, sendfile64
支持AIO
支持mmap,也就是内存映射
sendfile详解:服务器进程接收到一个客户端的http请求的时候,当请求报文到到服务器端的网卡时,由内核接收,然后向上传递到相应的用户态进程httpd,假设httpd进程发现该请求是一个静态资源,那么httpd进程就要发起系统调用,等待内核完成IO,内核会把数据从磁盘读取到内核内存,再把数据从内核内存copy到httpd进程内存中。这之后,httpd进程获取到静态资源的数据,将这些数据构建成响应报文发给内核,内核送往网卡。这里有一个优化步骤,内核从磁盘读取数据到内核内存之后,直接把数据发送网卡。
nginx的工作机制:
非阻塞、事件驱动、一个master生成一个或多个worker, 每个worker响应n个请求;
Nginx模块类型:
核心模块
Standard HTTP modules
Optional HTTP modules
Mail modules
3rd party modules
Nginx安装方法:
rpm(位于epel源中 yum list nginx && yum -y install nginx)及源码安装:
nginx源码安装的步骤如下所示:
yum -y install pcre-devel
useradd -r nginx
./configure --help (这里边的--with-XXXX表示可能默认没有启用,如果要使用这些功能使用--with-XXXX启用之,--without-XXXX表示可能默认启用了,如果你不想启用这些功能,可以使用--without-XXXX来表示禁用这些功能)
# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --with-debug
# make && make install
mkdir -pv /var/tmp/nginx/{client,proxy,fastcgi,uwsgi} 创建相关目录
要启动nginx,直接运行nginx命令即可。
Tmalloc, gperftools
http://nginx.org/ nginx主页面
http://nginx.org/en/docs/ nginx文档页面
nginx的配置文件: /etc/nginx/nginx.conf
main配置段 :表示全局配置段
events{ 定义event模型的工作特性
}
http { 定义http协议相关的配置
}
配置指令要以分号结尾,语法格式:
directive value1 [value2...];
支持使用变量:包括模块变量和自定义的变量
由模块提供的内置变量
自定义变量 set var_name value
主配置段的指令的类别: ngx_core_module 模块中
用于调试、定位问题类指令
正常运行必备的配置类指令
优化性能的配置类指令
事件相关的配置类指令
正常运行的必备配置:ngx_core_module 模块中
1、user USERNAME [GROUPNAME];
指定运行worker进程的用户 和组,例如:
user nginx nginx;
2、pid /path/to/pid_file;
指定nginx的pid文件;例如
pid /run/nginx.pid;
3、worker_rlimit_nofile #; 覆盖掉ulimit -n
指定所有worker进程所能够打开的最大文件句柄数目;
同时连接的数量受限于系统上可用的文件描述符的数量,因为每个套接字将打开一个文件描述符。 如果NGINX尝试打开比可用文件描述符更多的套接字,会发现error.log中出现Too many opened files的信息。使用ulimit检查文件描述符的数量:$ ulimit -n
现在,将此值增加到大于worker_processes * worker_connections的值。 应该是增加当前worker运行用户的最大文件打开数值。NGINX提供了worker_rlimit_nofile指令,这是除了ulimit的一种设置可用的描述符的方式。 该指令与使用ulimit对用户的设置是同样的效果。此指令的值将覆盖ulimit的值。
4,worker_rlimit_core size; 很少设置
更改所有的worker进程的核心文件(RLIMIT_CORE)的最大大小限制。用于在不重新启动main进程的情况下增加限制。
4、worker_rlimit_sigpending #;
指定每个用户能够发往worker进程的信号的数量;
优化性能相关的配置:ngx_core_module 模块中
1、worker_processes #:
worker线程的个数;通常应该为物理CPU核心个数减1;支持设置为auto,表示自动设定
2、worker_cpu_affinity cpumask ...;
绑定worker进程至指定的CPU核心上,表示该worker进程只能运行在某个特定的CPU核心上,不会被调度到其他的CPU核心上; 虽然无法避免切换进程时,将该worker进程切换出去,但是可以提高CPU的高速缓存的命中率(一级指令缓存,一级数据缓存等)
CPUMASK
0001
0010
0100
1000
例如:
worker_cpu_affinity 00000001 00000010 00000100; 支持设置为auto
3、timer_resolution t;
计时器解析度,降低此值,导致减少worker进程的对gettimeofday()系统调用的次数。By default, gettimeofday() is called each time a kernel event is received。
4、worker_priority nice;
nice的取值范围 -20, 19,nice值越小,优先级越高
事件相关的配置:这些配置要写在events{}段中 ngx_core_module 模块中
1、accept_mutex [on|off] mutex表示互斥锁
内部调用用户 请求至各worker时用的负载均衡锁;打开时,也就是设置为on,表示能让多个worker进程轮流地、序列化地去响应新请求;关闭时,表示当请求到来之时,所有的waitting状态的worker进程被唤醒一拥而上去争抢处理到来的请求(惊群效应),但是只有一个worker进程可以抢到该请求。
2、lock_file /path/to/lock_file;互斥锁锁文件的路径 这是放在main配置段中的
3、accept_mutex_delay #ms;
4、use [epoll | rgsig | select | poll | kqueue | /dev/poll/ | eventport ];
定义使用的事件模型;建议让Nginx自动选择;
5、worker_connections #;
每个worker进程所能够响应的最大并发请求数;
例如 worker_connections 51200
总的并发请求数量是worker_connections × worker_processes
用于调试、定位问题(编译nginx时,要使用--with-debug选项): ngx_core_module 模块中
1、daemon [off|on]
是否以守护进程方式启动nginx;调试时可以设置为off
2、master_process on|off;
是否以master/worker模型来运行nginx;调试时可以设置为off
3、error_log /path/to/error_log level;
错误日志文件及其级别;出于调试的目的,可以使用debug级别,但此级别只有在编译nginx时使用了--with-debug选项才有效;
总结:最常用的需要修改的配置参数:
worker_processes
worker_connections
worker_cpu_affinity
worker_priority
nginx -s signal : send signal to a master process: stop, quit, reopen, reload
Nginx作为web服务器时使用的配置:
http {} 由ngx_http_core_module模块引入
http {}的配置框架如下所示:
http {
upstream {
.,..
} 负载均衡和反向代理使用
server {
listen IP:PORT;
# 虚拟主机
location /URL {
if ...{
...
}
root "/path/to/somewhere";
...
}每个location类似于httpd的Location,用于定义URL与本地文件系统的映射关系,location可以有多个,localtion定义在server中
}
server {
,,.
} 每个server类似于httpd的VirtualHost
}
注意:与http配置相关的指令必须放在http、server、location、upstream、if块中;有些指令只能配置在其中的某些块中。
1、server {} server只能定义在http的上下文中
nginx定义虚拟主机;
例如:
server {
listen 8080;
root "/vhosts/www/web1"; html文档存放目录
server_name www.magedu.com;
}
例子:如下的2个server即可配置为2个基于主机名(host)的虚拟主机
server {
listen 80;
root /vhosts/www/web1/;
server_name www.aa.com;
}
server {
listen 80;
root /vhosts/www/web2/;
server_name www.bb.com;
}
2、listen
监听的端口
完整格式 :listen address[:port] [default_server] [ssl] [spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen address[:port] [default_server] ssl
backlog=number: 指明TCP协议backlog队列的大小。默认为-1,表示不设置;
rcvbuf=size:设定监听句柄的SO_RCVBUF参数;
例如:
listen 172.16.100.8:8080
3、server_name name [...]; server_name只能定义在server的上下中
后可跟多个主机名;名称还可以使用通配符和正则表达式(正则表达式以~开头);
有多个server_name的时候,server_name的匹配顺序如下:
(1) 先做精确匹配;www.magedu.com:
(2) 左侧通配符匹配,例如:*.magedu.com;
(3) 右侧通配符匹配,例如:www.*;
(4) 正则表达式匹配,例如: ~^.*\.magedu\.com$
(5) default_server
4、location [=|~|~*|^~] /uri {...} location第一种用法 略微复杂
location @name location第二种用法
功能:允许根据用户请求的URI来匹配定义的各个location,匹配到时,此请求将被相应的location块中的配置所处理,例如做访问控制等功能;
=: 精确匹配检查;
^~:URI的前半部分匹配,并且不检查正则表达式;
~: 正则表达式模式匹配,区分字符大小写;
~*:正则表达式模式 匹配,不区分字符大小写;
匹配优先级:精确匹配(=)、^~、~和~*、不带符号的URL进行左侧匹配;
例如:
server {
listen 80;
server_name www.magedu.com;
location / {
root /vhosts/web1/;
}
location /images/ {
root /vhosts/images/;
}
location ~* \.php$ {
fcgipass;
}
}
http://www.magedu.com/index.php
5、root path 类似于httpd的document
设置web资源路径映射;用于指明请求的URL所对应的文档在文件系统上的根目录路径;root可以放在http,server,location,if上下文中
location /images/ {
root "/web/imgs/";
}
6、alias path
用于location配置段,定义路径的别名
location /images/ {
alias /www/pictures/;
}
访问http://www.magedu.com/images/a.jpg 对应于 文件系统上的/www/pictures/a.jpg
注意:root表示指明路径为对应location的“ /” URL;alias表示路径映射,即location中的URL是相对于alias所指明的路径而言;
7、index file 位于ngx_http_index_module 模块中,可以 http, server, location上下文中
index index.html;
8、error_page code [...] [=code] URI | @name
根据http状态码重定向到指定的错误页面,可以放置于http, server, location, if上下文中
error_page 404 /404.html;
=[code]: 以指定的响应码进行响应;省略code表示以新资源的响应码为响应码;
error_page 404 =200 /404.html; 以200响应码响应404错误
9、try_files
try_files path1[,path2,...] URI
10:基于IP的访问控制 使用allow和deny,这2个指令可以用于http,server,location等上下文中
例如:下面的例子表示,拒绝所有ip访问,仅开放172.16.0.0/16网段的地址访问,allow和deny后面可以直接跟单个ip地址或者是网络地址段。
allow 172.16.0.0/16;
deny all;
11:基于用户的basic认证配置:使用auth_basic和auth_basic_user_file指令,这2个指令可以用于http,server,location等上下文中
例如:
auth_basic "Only for VIP"; 这个描述文字说明对此目录的访问需要认证的原因
auth_basic_user_file /etc/nginx/users/.htpasswd;
htpasswd命令创建用户账号文件; htpasswd -c -m /etc/nginx/users/.htpasswd jerry 创建一个jerry用户和密码,并把用户名和密码哈希写入/etc/nginx/users/.htpasswd文件中
12:配置nginx使之支持SSL:
首先要生成服务器(比如www.magedu.com)证书,这个步骤请查阅之前的文章。之后,在server上下文中配置如下的选项:
linsten 443 ssl;
server_name www.magedu.com;
ssl_certificate "/etc/pki/nginx/server.crt"; 服务器证书文件
ssl_certificate_key "/etc/pki/nginx/private/server.key"; 证书的key文件
ssl_session_cache shared:SSL:1m; SSL会话缓存
ssl_session_timeout 10m; SSL会话超时时间
ssl_ciphers HIGH:!aNULL:!MD5; SSL使用哪种加密方式传输报文
ssl_prefer_server_ciphers on;
13:开启状态页,使用stub_status指令仅能用于location上下文中。
例如:
location /status {
stub_status on;
allow 172.16.100.6;
deny all;
}
响应结果示例:
Active connections: 8 表示活动的连接数量
server accepts handled requests
241 241 431 第1个表示已经接受的连接数,第2已经处理过的连接数,第3个表示已经处理的请求数量,注意一个请求可能会有上百个连接,在保持连接(keeplive)的模式下,请求数量可能高于连接数量
Reading: 0 Writing: 1 Waiting: 5 Reading表示正处于接收请求状态的连接数,Writing表示请求已经接收完成,正处于处理请求或者发送响应的过程中的连接数,Waiting表示处于保持连接模式,且处于活动状态的连接数。
14:rewrite指令,用于URL重写,一般用于localtions上下文中
rewrite regex replacement flag;
例如:
...
rewrite ^/images/(.*\.jpg)$ /imgs/$1 last;
rewrite ^/imgs/(.*\.jpg)$ /images/$1 last;
...
假设访问http://www.magedu.com/images/a/b/c/1.jpg 会变成访问http://www.magedu.com/imgs/a/b/c/1.jpg
flage:有如下取值
last 此rewrite规则重写完成之后,不再被后面其他的rewrite规则进行处理,而是由浏览器重新对重写后的URL再一次发起请求,并从头开始执行类似的过程。
break 一旦此rewrite规则重写完成之后,由User Agent对新的URL重新发起请求,且不再会被当前location内的任何rewrite规则所检查。
redirect 以302响应码(临时重定向)返回新的URL
permanent 以301响应码(永久重定向)返回新的URL
15:if指令,一般用在server,location上下文中
if (condition) {
...
}
condition的取值有如下等情形来判断:
1:变量名,变量名为空字符串或0,则为false,其他的为true
2: condition支持的比较表达式有如下几种:
= 等于
!= 不等于
~ 正则表达式的模式匹配操作,区分大小写
~* 正则表达式的模式匹配操作,不区分大小写
!~ 对~取反
!~* 对~*取反
-f, !-f 测试路径是否为文件
-d, !-d 测试路径是否为目录
-e, !-e 测试文件是否存在
-x, !-x 测试文件是否可执行
例如:
if ($http_user_agent ~* MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
16:防止盗链
location ~* \.(jpg|gif|jpeg|png)$ {
valid_referer non blocked www.magedu.com; 定义合法引用是www.magedu.com
if ($invalid_referer) {
rewrite ^/ http://www.magedu.com/403.html redirect;
}
}
17:定制访问日志使用log_format和access_log指令
例如:
log_format main ' $remote_addr - $remote_user [$time_local] "$request" '
' $status $body_bytes_sent "$http_referer" '
' "$http_user_agent" "$http_x_forwarded_for" ';
access_log /var/log/nginx/access.log main;
注意:此处使用的变量可以取自nginx的各个模块的内建变量
网络连接相关的配置:
1、keepalive_timeout time;
保持连接(长连接)的超时时长,默认为75s;
2、keepalive_requests #;
在一次保持连接上允许承载的最大资源请求数;
3、keepalive_disable [msie6|safari|none]
为指定类型的User_Agent禁用长连接;
4、tcp_nodelay on|off
对长连接是否使用TCP_NODELAY选项;表示TCP不延迟
5、client_header_timeout time;
服务器端读取http请求报文首部的超时时长;
6、client_body_timeout time;
服务器读取http请求报文body部分的超时时长;
7、send_timeout time;
服务器发送响应报文的超时时长;
nginx的fastcgi的相关配置:
LNMP:php启用为fpm模型
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params; 包含/etc/nginx/fastcgi_params文件
}
[root@hp-laptop nginx]# cat /etc/nginx/fastcgi_params
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
将$query_string的值赋值给QUERY_STRING,大写的QUERY_STRING是在fastcgi中使用的。
对客户端请求进行限制:
1、limit_except METHOD {...}
指定对范围之外的其它方法的访问控制;
limit_except GET {
allow 172.16.0.0/16;
deny all;
}
2、client_body_max_size SIZE;
限制请求报文中body部分的上限;通过检测请求报文首部中的"Content_Length"来判定;
3、limit_rate speed;
限制客户端每秒种传输的字节数,默认为0,表示无限制;
对内存或磁盘资源进行分配
1、client_body_in_file_only on|clean|off;
请求报文的body部分是否可暂存于磁盘;on表示允许,并且即使请求结束,也不会删除暂存的内容;clean表示会删除;off不允许暂存;
2、client_body_in_single_buffer on|off
3、client_body_buffer_size size;
4、client_body_temp_path DIR [level1 [level2 [level3 [level4]]]]
例如:client_body_temp_path /var/tmp/nginx/client 1 2
5、client_header_buffer_size size:
MIME类型相关的配置:
1、types {}
定义MIME types至文件的扩展名;
types {
text/html .html;
image/jpeg .jpg;
}
2、default_type MIME-TYPE;
文件操作优化相关的配置:
1、sendfile on|off;
2、aio on|off;
3、directio size|off;
是否使用O_DIRECT选项去请求读取文件;与sendfile功能互斥;
4、open_file_cache max=N[inactive=time] | off;
nginx可以缓存以下三种信息:
(1) 文件句柄、文件大小和最近一次修改时间;
(2) 打开目录的目录结构;
(3) 没有找到的或者没有权限操作的文件的相关信息;
max=N表示可缓存的最大条目上限;一旦到达上限,则会使用LRU从缓存中删除最近最少使用的条目;
inactive=time: 在inactive指定的时长内没有被访问过的缓存条目就会淘汰;
5、open_file_cache_errors on|off;
是否缓存在文件缓存中缓存打开文件时出现找不到路径,没有权限等的错误信息;
6、open_file_cache_min_uses time;
每隔多久检查一次缓存中缓存条目的有效性;默认60s;
重点关注:server{}, location{}, listen, server_name, root, alias, keepalive_timeout, keepalive_requests, error_page
评论
发表评论