Nginx:
engine X
c10k
主要功能:
1.web服务器:http/https协议的应用;
2.反向代理服务器:
http reverse server
smtp/pop3/imap4 reverse server
3.负载均衡集群
nginx -- apache -- php -- MariaDB
MIME:
major/minor:
text/html, p_w_picpath/jpeg ,..., application/apx
http事务:request <--> response
web resources
一个html文档
一个图片
一个MP3片段
一个视频片段
一个样式表
一个js脚本
一个动态资源
...
URI:
URL:
scheme://host[:port]/path/to/resource
Method:
GET,HEAD
POST
PUT,DELETE(WebDAV)
OPTIONS
TRACE
resource cache
cookie, cookie2, session
request packet:
response packet:
status code:
1xx
2xx:成功类响应状态码,200,OK
3xx:重定向类响应状态码,301,302,304
4xx:客户端错误类响应状态码,403,404
5xx:服务器端错误类响应状态码,502,500
basic,digest认证
MPM:
prefork
worker
event
I/O模型:
阻塞/非阻塞:
关注资源调用者在等待结果返回之前所处的状态;
阻塞:Blocking,调用结果返回之前,调用者会被挂起;闲等待;
非阻塞:Nonblocking,调用结果返回之前,调用者不会被挂起,可以继续调用其他资源;忙等待;
同步/异步:
关注资源返回之后的消息通知的机制;
同步:synchronize,调用者一直等待调用结果;
异步:asynchronize,被调用者通过状态描述,通知或回调等方式通知调用者此次调用结果;
I/O模型:阻塞型,非阻塞型,复用型,信号驱动型,异步;
一次IO请求,通常会分成两个阶段:
第一阶段:数据从磁盘被加载到内核空间;
第二阶段:数据从内核空间被复制到应用程序所在的用户空间;
基于事件(信号)回调机制:
SELECT():1024;
POLL():
事件驱动模型的实现:
Linux:epoll,libevent程序包;
FreeBSD:kqueue
Solaris:/dev/poll
Nginx
http://nginx.org
基于nginx的二次开发:tengine,openresty
nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev. For a long time, it has been running on many heavily loaded Russian sites including Yandex, Mail.Ru, VK, and Rambler. According to Netcraft, nginx served or proxied 29.38% busiest sites in September 2017. Here are some of the success stories: Dropbox, Netflix, Wordpress.com, FastMail.FM.
基本http服务特性:
1.支持基于缓存的反向代理;负载均衡和故障倒换;
2.基于FastCGI, uwsgi, SCGI反代,可以将缓存存放于memcached servers;支持负载均衡和故障倒换;
3.模块化结构和强大的过滤器机制;
4.SSL和TLS
5.http/2.0
其他的http服务特性:
1.支持虚拟主机(名称,端口,IP地址(无实际作用));
2.支持长连接;
3.支持URL重写;
4.支持流媒体
5.对客户端响应限速;
详情请见:http://nginx.org/en/
回顾:
IO模型:
阻塞型,非阻塞型,IO复用型,信号驱动型,异步型;
nginx特性:
Nginx(2)
Nginx的程序结构:
master/worker
一个master进程:负责加载配置文件,管理worker进程;
配置的平滑升级
一个或多个worker进程:
处理并响应客户端请求;
cache:
cache loader
cache manager
nginx的功能:
1.静态的web资源服务器;
2.结合FastCGI,uwsgi,SCGI等协议反代动态资源请求;(lnmp, lamt)
3.http/https协议的反向代理;
4.smtp/pop3/imap4协议的反向代理;
5.通用的tcp/udp反向代理;
注意:nginx所有的功能的实现都必须通过模块进行;而nginx可以根据指令或这相关功能,自动加载模块;
nginx的模块类型:
核心模块:core module
标准功能模块:
Standard HTTP modiles
Optional HTTP modules
Mail modules
Stream mudules
third party modules
nginx的安装和配置:
安装:
rpm包:
官方的预制安装包:http://nginx.org/packages/centos/
EPEL源的安装包;
编译:
1.注意需要安装好编译环境;
2.openssl-devel,pcre-devel,libenvent-devel,...
3.~]# ./configure --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-threads --with-file-aio --with-http_stub_status_module
4.make -j 4 && make install
注意:启动服务需要事先创建nginx用户和nginx组;
配置:
配置的组成部分:
主配置文件:/etc/nginx/nginx.conf
片段配置文件:/etc/nginx/conf/*.conf(编译安装的默认没有,可以在主配置文件中指定)
模块配置文件:
与fcgi,uwsgi,SCGI相关的配置文件
mime.types:所有的nginx支持的mime类型;
主配置文件的配置指令:
context:上下文,指令的容器或者是指令的生效范围;
derective:指令,能够发挥nginx功能或特性的配置信息;
注意:
1.所有的指令都必须以";"结尾;
2.所有的上下文都必须使用"{}"括选起来,而且不需要使用";"结尾;
3.在设置指令时可以使用配置变量;
由模块包含并引入:内置变量
由用户引入:自定义变量
定义变量:
set var_name value;
引用变量:
$var_name
获得帮助,参考http://nginx.org/en/docs
主配置文件的结构:
全局配置段,主配置段:
main block
http相关配置
http{
context{ ... }
directive value;
...
}
mail相关配置
mail{
...
}
全局配置段的常用指令和上下文:
user nginx;
worker_processes 3;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http相关配置的常用指令和上下文:
include /etc/nginx/conf/*.conf;
sendfile on;
keepalive_timeout 65;
keepalive_request 100;
server {
listen 80;
server_name www.qhdlink.com;
include /etc/nginx/conf/*.conf;
root /myweb/vhost1
location {
root html; //相对路径是相对于nginx的安装目录而言的;
alias /bbs/ /forum/
}
}
server {
listen 8080:
server_name web.qhdlink.com;
root /myweb/vhost2;
}
全局配置段常用指令的详解:
正常服务运行必备的配置指令;
1.user user [group];
Context: main
功能:用于指定运行worker子进程的用户和组;
2.pid file;
Context: main
功能:用于指定存放nginx的master进程编号的文件的路径;
3.worker_rlimit_nofile number;
Context: main
功能:每个worker进程所能打开的文件数量的最大值;
也可以通过修改/etc/security/limits.conf完成此设置;
优化性能相关的配置指令;
4.worker_processes number | auto;
Context: main
功能:worker进程的启动数量;通常不要设置的比cpu核心数多;
5.worker_cpu_affinity cpumask ...;
worker_cpu_affinity auto [cpumask];
Context: main
功能:设置每个CPU核心和worker进程的亲缘性;
cpumask:0001 0010 0100 1000;
6.worker_priority number;
Context: main
number:[-20,19]
功能:设置每个worker进程启动时候的nice值;
用于调试和定位问题相关的配置指令;
7.daemon on | off;
Context: main
是否以独立守护进程的方式启动nginx;通常是在开发时选择使用;
8.master_process on | off;
Context: main
是否以master/worker模型启动nginx进程;
9.error_log file [level];
Context: main, http, mail, stream, server, location
功能:定义错误日志文件的位置和记录日志的日志级别;
10.thread_pool name threads=number [max_queue=number];
Context: main
功能:定义线程池的名称,线程的数量以及每个线程的后援队列长度;
默认有32个线程,队列长度为65536;
回顾:
IO模型:阻塞式,非阻塞式,IO复用,信号驱动式的IO,异步(AIO)
nginx:
master/worker
cache loader/cache manager
模块化架构:
核心模块
标准功能模块
第三方模块
配置文件:
主配置文件:/etc/nginx/nginx.conf
片段配置文件:include file;
主配置文件的结构:
全局配置段,主配置段(main)
events {
...
}
Context: main
在events上下文中可以使用的指令:
11.worker_connections number;
功能:每个worker进程所能够打开的并发连接的最大连接数;默认是512;
当前系统中所能够响应的最大并发连接数:
worker_connections * worker_processes
12.use method;
指明并发连接请求处理时使用的方法;epoll
use epoll;
注意:此指令不需要明确指定,因为nginx会选择最有效的方法;
13.accept_mutex on | off;
当此功能启用时,表示可以让多个worker进程依次轮流响应新请求,
http相关配置
http {
...
}
在http上下文中可以用到的指令:
1.定义虚拟主机及套接字相关功能指令:
server {
...
}
server上下文中专用的指令:
1) server_name name ...;
指定虚拟主机名称;后面可以使用空白字符分隔多个主机名;
主机名可以支持使用"*"匹配任意长度的任意字符;
主机名还可以支持使用~起始的正则表达式模式字符串;
2) listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
listen port [default_server] [ssl] [http2 | spdy]
listen unix:path [default_server] [ssl] [http2 | spdy]
default_server:默认虚拟主机的设定;
ssl:支持https;
http2:支持http/2.0;
spdy:支持Google的spdy功能;
backlog=number:设定后援队列的长度;
rcvbuf=size:接收缓冲大小;
sndbuf=size:发送缓冲大小;
示例:
listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;
3) root path;
Context: http, server, location, if in location
功能:设置web资源的路径映射;用于指定用户请求的URL所对应的本地文件系统中的资源所在的目录的路径;
path:可以是绝对路径;也可以是相对路径;
相对路径是相对nginx的安装目录而言的;
4) location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Context: server, location
功能:根据用户请求的URI来匹配此处定义的location;当匹配到时,此请求将被响应的location上下文中的指令处理;
=:表示用户请求的URI与此处location定义的URI必须精确匹配;
~:表示用户请求的URI与此处location定义的URI通过指定的正则表达式进行匹配,字母大小写敏感;
~*:表示用户请求的URI与此处location定义的URI通过指定的正则表达式进行匹配,字母大小写不敏感;
^~:对用户请求的URI的左半部分做匹配检查,字母大小写不敏感;
URI:URL中除去主机名的部分:
URL:http://www.qhdlink.com/index.html
URI:/index.html
匹配优先级:= , ^~ , ~/~* , 不带符号;
5) alias path;
Context: location
功能:定义路径映射的别名,文档资源映射的机制;
root和alias的区别:
用户请求的URL:http://172.16.72.2/p_w_picpaths/1.jpg
location /p_w_picpaths {
root /myweb;
}
被请求资源的服务器文件系统中的存放路径:/myweb/p_w_picpaths/1.jpg;
location /p_w_picpaths {
alias /myweb;
}
被请求资源的服务器文件系统中的存放路径:/myweb/1.jpg;
总结:
root指令:将用户请求的URI追加至root指令所指定的路径之后,作为此次请求的资源所在的文件系统路径;
alias指令:将用户请求的URI用root指令所指定的路径替换,作为此次请求的资源所在的文件系统路径;
注意:在nginx/1.12.1中,URI和root的参数都不能在最后加"/";
6) index file ...;
Context: http, server, location
功能:定义默认主页的文件名;
file:是一个文件名或者由空白字符隔开的多个文件名;
2.error_page code ... [=[response]] uri;
Context: http, server, location, if in location
功能:根据用户请求的资源的http协议的响应状态码实现错误页面的重定向;
示例:
error_page 404 =200 /404.html;
location = /404.html {
root /myweb/error-page;
}
3.与长连接相关的指令:
keepalive_disable none | browser ...;
Context: http, server, location
功能:对于某些浏览器禁用长连接功能;
keepalive_requests number;
Context: http, server, location
功能:通过设置最大请求数量的方式管理长连接;即,只要在长连接上接收到的用户请求达到最大限制值,则关闭此长连接;
keepalive_timeout timeout [header_timeout];
Context: http, server, location
功能:通过设置最大空闲时间的方式管理长连接;即,只要该长连接在指定时间内没有收到任何请求,则关闭此长连接;
4.send_timeout time;
Context: http, server, location
功能:向客户端发送响应报文的超时时长;通常指两次成功的写操作之间的间隔时长;如果在此时间内,客户端没有收到响应报文,则关闭连接;
5.client_body_buffer_size size;
Context: http, server, location
功能:用于设置客户端请求报文中的body部分的缓冲区的大小;默认为16K,如果要缓存的body超过了此限制,则会将其临时保存于磁盘的文件中;
client_body_temp_path path [level1 [level2 [level3]]];
Context: http, server, location
功能:用于设定存储客户端请求报文中的body部分的临时存储路径,以及此临时目录中子目录的结构;
示例:client_body_temp_path /var/tmp/client_body 2 1 2
按照示例的设置,可以在/var/tmp/client_body目录创建以2位16进制数字命名的256个一级子目录;在所有的256个一级子目录中,还可以随机创建出以一个十六进制数字命名的二级子目录;在所有的二级子目录中,还以随机创建出以2位16进制数字命名的三级子目录;每一个三级子目录中都会存放一个用户请求的body的内容;
6.limit_rate rate;
Context: http, server, location, if in location
功能:限制响应给客户端的传输速率,单位是Bytes/second,0表示无限制;
location /download {
root /;
limit_rate 20480;
}
7.limit_except method ... { ... }
Context: location
功能:设置可以使用指定的请求方法之外的其他方法的客户端;
在此上下文中,需要使用allow及deny指令;
8.allow address | CIDR | unix: | all;
deny address | CIDR | unix: | all;
Context: http, server, location, limit_except
功能:对指定的客户端进行访问控制;
注意:
1) 只有放置与limit_except上下文中,才表示是否允许指定客户端使用什么样的HTTP方法;
2) 如果放置于其他的上下文中,则表示对该上下文所包含的web资源的访问控制;
3) 规则的匹配顺序:按照书写顺序依次检查,直到第一个匹配项;
192.168.0.0/16
172.16.0.0/12
CIDR: Classless Inter-Domain Routing, 无类域间路由;超网
9.AIO和DirectIO
aio on | off | threads[=pool];
Context: http, server, location
功能:是否启用aio功能;
directio size | off;
Context: http, server, location
功能:是否启用directio,如果启用,使用多大的空间来定义directio;
10.文件描述符缓存:
open_file_cache off;
open_file_cache max=N [inactive=time];
在系统中打开的文件较多的时候,nginx可以缓存以下三种信息来提升系统的性能:
1) 文件描述符、文件大小和最近一次修改的时间;
2) 打开的目录的结构;
3) 没有找到的或者没有权限访问的文件相关信息;
max=N:可缓存的缓存项的数量的上限;当缓存的数量达到上限之后,通常会使用LRU(Least Recently Used)算法实现缓存清理;
inactive=time:缓存项的超时时长,在此处指定的时长内没有被再次使用(命中)的缓存元素,即为非活动项;
open_file_cache_errors on | off;
功能:在查找资源时出错,此类错误信息是否缓存;
open_file_cache_min_uses number;
功能:在open_file_cache指令中的inactive参数所指定的时间范围内,缓存的元素至少要被再次使用(命中)的次数;
open_file_cache_valid time;
功能:缓存有效性检查的频率;默认值是60s;
11.stub_status;
Context: server, location
功能:用于输出nginx的基本状态信息;
location /ngx-status {
stub_status;
}
通过浏览器浏览http://host/ngx-status
Active connections: 1
server accepts handled requests
5191 5191 5045
Reading: 0 Writing: 1 Waiting: 0
Active connections: 处于活动状态的客户端连接数量,包括waiting状态的连接;
accepts:当前服务器已经接受的客户端请求的总量;
handled:当前服务器已经处理完成的客户端请求的总量;
requests:客户端发送到当前服务器的请求的总量;包括被服务期重定向的
Reading:处于正在被读取报文首部的客户端请求的总量;
Writing:处于正在向客户端发送响应报文过程的连接的总量;
Waiting:处于等待客户端发送请求的空闲连接数;
12.valid_referers none | blocked | server_names | string ...;
Context: server, location
功能:定义合法的Referer数据;
none:在请求报文的首部中没有Referer字段;
blocked:在请求报文的首部中有Referer字段,但没有值;
server_name:在请求报文的首部中的Referer字段的值是主机名;
arbitrary string:任意字符串(直接字符串),其中可以使用"*"做通配符;
regular expression:被指定的正则表达式模式匹配到的字符串,一般要是有"~"起始;
示例:
location / {
valid_referers none blocked server_name *.qhdlink.com ~\.qhlink\.
if ($invalid_referer) {
return 403;
}
}
Nginx(4)
13.ngx_http_ssl_module
1) ssl on | off;
Context: http, server
功能:是否启用给定虚拟主机的https协议;
相当于:listen 443 ssl;
2) ssl_certificate file;
Context: http, server
功能:当前虚拟主机使用的PEM格式的证书文件的路径;
3) ssl_certificate_key file;
Context: http, server
功能:当前虚拟主机上与其证书匹配的私钥文件的路径;
4) ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
Context: http, server
功能:是否开启ssl的会话缓存,如果开启,选择哪种类型及使用多少存储空间;
为了避免内存碎片,建议使用shared类型;
5) ssl_session_timeout time;
Context: http, server
功能:客户端连接可以复用ssl会话缓存中缓存的ssl参数的有效时长;默认5分钟;
6) ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];
Context: http, server
功能:nginx服务器能够兼容的协议的版本;默认是[TLSv1] [TLSv1.1] [TLSv1.2];
14.ngx_http_log_module
The ngx_http_log_module module writes request logs in the specified format.
1) access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
Context: http, server, location, if in location, limit_except
功能:是否记录访问日志;如果记录,以何种格式记录;缓冲区大小的设定,是否压缩存储并指明压缩等级;刷新日志文件的时间;
2) log_format name [escape=default|json] string ...;
Context: http
功能:定义存储访问日志的格式;
combined格式示例:
log_format combined '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';
3) open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
Context: http, server, location
功能:是否启用访问日志文件的文件描述符缓存机制;
max=N:缓存中缓存的文件描述符的最大数量;
inactive:非活动时长;默认10秒;
min_uses:在inactive的时间内,缓存中的缓存条目最少被命中的次数;默认值1;
valid:验证缓存中的缓存条目是否有效的时间周期;默认60秒;
15.ngx_http_rewrite_module
The ngx_http_rewrite_module module is used to change request URI using PCRE regular expressions, return redirects, and conditionally select configurations.
URL重新就是指:根据PCRE的正则表达式来修改请求的URI,返回重定向信息,并且根据指定的条件选择配置内容;
www.qhdlink.com --> www.ql.com
1) rewrite regex replacement [flag];
Context: server, location, if
功能:将用户请求的URI基于regex所描述的模式进行匹配检测,匹配到时将其替换为replacement指定的URI;
注意:
1.在同一上下文中存在多个rewrite规则时,会自上而下逐个检测并匹配;对于客户端发送的每个请求,都要做检查匹配,其中隐藏了一个循环机制;可以利用flag来控制循环的方式;
2.如果replacement是以http://或者https://开头的,替换的结果会直接以重定向的方式返回给客户端;状态码为301;否则,状态码为302;
例子:
http://www.qdhlink.com --> http://www.ql.com
3xx:重定向类的状态码
301:永久重定向
302:临时重定向
[flag]:
last:重写完成后停止对当前的URI在当前的location中后续的其他重写操作后启动新一轮的匹配检查;重启循环;
break:重写完成后,立刻停止对当前location中的rewrite规则的匹配检查,转而执行后续的其他配置;结束循环;
redirect:临时重定向,重写完成后以临时重定向方式向客户端返回重写后的URI,由客户端重新请求;不以http://或https:开头的URI的重写;
permanent:永久重定向,重写完成后以永久重定向方式向客户端返回重写后的URI,由客户端重新请求;以http://或https:开头的URI的重写;
示例:
location / {
root html;
index index.html index.htm;
rewrite ^/epel http://172.16.72.101;
rewrite ^/(.*\.(jpg|jpeg|gif|png))$ http://172.16.72.1/p_w_picpaths/$1;
rewrite ^/(.*)\.htm$ /$1.html;
}
2) return code [text];
return code URL;
return URL;
Context: server, location, if
功能:停止处理所有的后续的请求,直接给客户端返回一个指定的状态码或URL;
3) if (condition) { ... }
Context: server, location
功能:引入一个新的上下文并且在其中完成条件判断;如果条件满足,执行if上下文中的配置指令;
condition:
比较操作符:
==
!=
~:模式匹配,区分字符大小写;
~*:模式匹配,不区分字符大小写;
!~:
!~*
文件及目录的存在性判断:
-e, !-e:存在与否
-f, !-f:存在且是普通文件与否;
-d, !-d:
...
-x, !-x:
16.ngx_http_fastcgi_module
1) fastcgi_pass address;
nginx通过反代机制,将php请求反代至address标明的服务器上;
2) fastcgi_index name;
fastcgi默认反代的主页资源;
3) fastcgi_param parameter value [if_not_empty];
向后端php服务器传递参数;
fastcgi的缓存相关内容:
1) fastcgi_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size]
Context: http
level:缓存的目录结构及文件数量,最多3级,每级最对2个16进制数字,用":"分隔
1:2:2
keys_zone:内存中缓存空间的名称及大小;
max_size:磁盘上用于缓存数据的缓存空间大小;
inactive:缓存的最大时长;
2) fastcgi_cache zone | off;
调用指定的缓存空间缓存数据;
3) fastcgi_cache_key string;
定义用户缓存项的key的字符串;
4) fastcgi_cache_min_uses number;
用户请求的内容被请求多少次才会加入缓存;
5) fastcgi_cache_valid [code ...] time;
对于不同的响应码的响应数据设置缓存时间;
注意:
设置缓存的时候使用fastcgi_cache_path指令;
调用缓存时,至少应该使用下列几个指令:
fastcgi_cache
fastcgi_cache_key
fastcgi_cache_valid
示例:
http上下文的配置:
fastcgi_cache_path /var/cache/nginx/fastcgi_cache levels=1:2:1 keys_zone=fcgicache:10m max_size=1g;
location上下文的配置:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/$fastcgi_script_name;
include fastcgi_params;
fastcgi_cache fcgicache;
fastcgi_cache_key $request_uri;
fastcgi_cache_valid 200 5m;
fastcgi_cache_valid 301 302 1m;
fastcgi_cache_valid 403 404 1m;
}