Nginx的介绍
Nginx的介绍
制作人:全心全意
I/O模型介绍
Select:Linux实现对应,I/O复用模型,BSD4.2最早实现
Poll:Linux实现,对应I/O复用模型,System V unix最早实现
Epoll:Linux实现,对应I/O复用模型,具有信号驱动I/O模型的某些特性
实现机制
select | poll | epoll | |
操作方式 | 遍历 | 遍历 | 回调 |
底层实现 | 数组 | 链表 | 哈希表 |
IO效率 | 每次调用进行线性遍历,时间复杂度O(n) | 每次调用进行线性遍历,时间复杂度O(n) | 事件通知方式,每当fd就绪,系统注册的回调函数就会被调用,时间复杂度O(1) |
最大连接数 | 1024(x86)或2048(x64) | 无上限 | 无上限 |
fd拷贝 | 每次调用select,都需要将fd集合从用户态拷贝到内核 | 每次调用poll,都需要将fd集合从用户态拷贝到内核 | 调用时拷贝进内核并保存,之后每次epoll_wait不拷贝 |
epoll的介绍
说明:
在Linux2.6内核中提出的select和poll的增强版本
支持水平触发LT和边缘触发ET,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就绪态,并且只会通知一次
使用”事件“的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知
优点:
没有最大并发连接的限制:能打开的FD的上限远大于1024(1G的内存能监听约10万个端口)
效率提升:非轮询方式,不会随着FD数目的增加而效率降低;只有活跃可用的FD才会调用callback函数,即epoll最大的优点就在于它只管理”活跃“的连接,而跟连接总数无关
内存拷贝:利用mmap加速与内核空间的消息传递;即epoll使用mmap减少复制开销
nginx的程序架构
master/worker结构
一个master进程:负责加载和分析配置文件、管理worker进程、平滑升级
一个或多个worker进程:处理并响应用户请求
缓存相关的进程:
cache loader:装载缓存对象
cache manager:管理缓存对象
nginx模块
nginx高度模块化,但其模块早期不支持DSO机制;1.9.11版本支持动态装载和卸载
模块的分类:
核心模块:core module
标准模块:
HTTP模块:ngx_http_*
HTTP Core modules 默认功能
HTTP Optional modules 需编译时指定
Mail模块:ngx_mail_*
Stream模块:ngx_stream_*
第三方模块
nginx命令选项
命令语法: nginx [-?hqTtVv] [-c file] [-g directives] [-p prefix] [-s signal] 选项: -?,-h 查看帮助 -c file 指定配置文件(默认:/etc/nginx/nginx.conf) -v 显示版本和编译语法并退出 -t 检查配置文件语法 -T 检查配置文件语法并输出配置文件 -q 在检查配置文件时,不显示非错误信息 -s signal 发送信号(stop停止、quit退出、reopen重启、reload加载配置文件) -p prefix 指定工作目录路径(默认:/usr/share/nginx) -g directives 指定全局参数和附加配置文件
nginx配置文件介绍
主配置文件结构
main block:主配置段,即全局配置段,对http,mail都生效 event{ ... } 事件驱动相关配置 http { ... } http/https协议相关配置段 mail { ... } mail协议相关配置段 stream { ... } stream服务器相关配置段
http协议相关的配置结构
http { ... 各server的公共配置 ... server { 每个server用于定义一个虚拟主机 ... } server { ... server_name 虚拟主机名 root 主目录 alias 路径别名 location [OPENATOR] URL { 指定URL的特性 ... if CONDITION { } } } }
- 主配置段
user:指定nginx(worker进程)的运行用户,只能放在主配置段
pid:pid文件位置
include:指定包含进来的其他配置文件路径
load_module:加载模块
性能相关
worker_processes:worker进程的数量;通常为当前主机CPU的物理核心数,也可设置为auto
worker_cpu_affinity:绑定一个worker进程一直在某一个cpu上运行(cpumask:00000001、00000010、00000100,分别代表第零、一、二号CPU)
worker_priority:指定worker进程优先级,范围是[-20,20],默认为0
worker_rlimit_nofile:指定worker进程所能够打开的文件数量上限,如65535
调试和定位
daemon:是否以守护进程方式运行Nginx,默认是守护进程方式(后台)on|off
master_process:是否以master/worker模型运行nginx;默认为on,off将不启动worker
error_log:指定错误日志输出位置
- 事件驱动
worker_connections:每个worker进程支持多少个并发连接
use:指定并发连接请求的处理方法,默认自动选择最优方法(epoll)
accept_mutex:处理新的连接请求的方法,on表示由各个worker轮流处理新请求,off表示每个新请求的到达都会通知所有的worker进程,但只有一个进程可以获得连接,造成“惊群”,影响性能,默认为off。
- http协议的相关配置
server(虚拟主机)中的配置
listen:指定监听端口,可同时指定监听主机名(IP/域名)
default_server:设定为默认虚拟主机
ssl:限制仅能够通过ssl连接提供服务(https)
backlog=number:设置超过并发连接后,新请求队列的长度
rcvbuf=size:设置接收缓冲区的大小
sndbuf=size:设置发送缓冲区的大小
server_name:指定网站名称(网站域名)
支持通配字符*(如*.xinyi.com、www.xinyi.*)
支持正则表达式
root:指定网站家目录
tcp_nodelay:在keepalived模式下的连接是否启动RCP_NODELAY选项(on:不延迟发送,收到一个请求立即回应一个请求,默认选项。off:延迟发送,合并多个请求后发送)
sendfile:默认为off。为on时,从磁盘中将数据拷贝到内核中封装报文直接发送,不需在从内存中转
server_tokens:是否在响应报文的Server头部显示nginx版本,可在http和server中设置(on|off)商业版可支持字符串
location
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;nginx会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置。该段可放在server中,也可嵌套在location中。
=:精确匹配
^~:对URI的最左边部分做匹配检查,不区分字符大小写
~:对URI做正则表达式模式匹配,区分字符大小写
~*:对URI做正则表达式模式匹配,不区分字符大小写
不带符号:匹配起始于此uri的所有uri
匹配优先级从高到低:=,^~,~/~*,不带符号
server { root ... location ... { root ... } }
alias:路径别名,文档映射的另一种机制;仅能用于location上下文。(与root的不同,例“/web”中路径“/www/html”,访问/web,使用root匹配html/web下的文件,而alias访问的是html下的文件)
index:指定默认网页文件。
error_page:定义响应状态码所对应的响应错误页(例:error_page 404 /404.html),还可以设置以200状态码响应错误页面,防止被浏览器劫持错误页面(例:error_page 404 =200 /404.html)
try_files:按顺序检查文件是否存在,返回按顺序找到的第一个文件或文件夹,如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数,只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误。
location /images/ { try_files $uri /images/defautl.gif; } location / { try_files $uri $uri/index.html $uri.html =404; }
定义客户端请求的相关配置
keepalive_timeout timeout [header_timeout]:设定保持连接超时时长,0表示禁止长连接,默认为75S
keepalive_requests number:在一次长连接上允许请求资源的最大数量,默认为100。
keepalive_disable none|browser...:对那种浏览器禁用长连接。
send_timeout time:向客户端发送响应报文的超时时长,此外是指两次写操作之间的间隔时长,而非整个响应过程的传输时长。
client_body_buffer_size size:用于接收每个客户端请求报文的body部分的缓冲区大小,默认为16k;超出此大小时,将其暂存到磁盘上,由client_body_temp_path指令所暂存的位置
client_body_temp_path path [level1 [level2 [level3]]]:设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量,目录名为16进制的数字。
client_body_temp_path /var/tmp/client_body 1 2 2 1 1级目录占1位16进制,即2^4=16个目录0-f 2 2级目录占2位16进制,即2^8=256个目录00-ff 2 3级目录占2位16进制,即2^8=256个目录00-ff
对客户端进行限制的相关配置
limit_rate rate:限制响应给客户端的传输速率,单位是bytes/second,默认值为0,表示无限制。(1000000 = 1M)
limit_except method ... {...}:仅用于location,限制客户端使用除了指定的请求方法之外的其它方法(GET、HEAD、POST、PUT、DELETE、MKCOL、COPY、MOVE、OPTIONS、PROPFIND、PROPPATCH、LOCK、UNLOCK、PATCH)
limit_except GET { allow 192.168.1.0/24; deny all; } #除了GET和HEAD之外其它方法仅允许192.168.1.0/24网段主机使用
文件操作的优化配置
aio on|off|threads[=pool]:是否启动aio功能
directio size|off:当文件大于给定大小时,例如directio 4m,同步(直接)写磁盘,而非写缓存
open_file_cache:缓存的设置
open_file_cache off # open_file_cache max=N [inactive=time] nginx可以缓存以下三种信息: 文件元数据(文件的描述符,大小和最近一次修改的时间) 目录结构 没有找到的或者没有权限访问的文件的相关信息 max=N:可缓存的缓存项上线,达到上限后会使用LRU算法(最近,最少使用算法)实现管理 inative=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中次数少于open_file_cache_min_uses指令所指定的次数的缓存项即为非活动项,将被删除
open_file_cache_errors on|off:是否缓存查找时发生的错误的文件的一类的信息,默认值为off
open_file_cache_min_uses number:在open_file_cache指令的inactive参数指定的时长内,至少被命中此处指定的次数,方可被归类为活动项。
open_file_cache_valid time:缓存项有效性的检查频率,默认值为60S
实现基于ip的访问控制功能
location / { deny 192.168.1.1; allow 172.16.1.0/24; allow 2001:0db8::/32 #ipv6地址 deny all; }
自上而下检查,一旦匹配,立即生效。
实现基于用户的访问控制,使用basic机制进行用户认证
auth_basic string|off
auth_basic_user_file file
location /admin/ { auth_basic "Admin Area"; auth_basic_user_file /etc/nginx/ngxpasswd; }
用户口令文件格式:
明文文本:name:password:comment
加密文本:由htpasswd命令实现,httpd-tools所提供
输出nginx的基本状态信息
ngx_http_stub_status_module模块
输出信息示例:
Active connections:291 server accepts handled requests 123 123 123 Reading:6 Writing:179 Waiting:106
三个数字分别对应accepts,handled,requests三个值
Active connections: 当前状态 ,活动状态的连接数
accepts :统计总值 ,已经接受的客户端请求的总数
handled :统计总值 ,已经处理完成的客户端请求的总数
requests :统计总值 ,客户端发来的总的请求数
Reading :当前状态 ,正在读取客户端请求报文茵部的连接的连接数
Writing :当前状态 ,正在向客户端发送响应报文过程中的连接数
Waiting :当前状态 ,正在等待客户端发出请求的空闲连接数
示例:
location /status { stub_status; allow 172.16.1.0/24; deny all; }
用gzip方法压缩响应数据,节约宽带
gzip on|off:启用或禁用gzip压缩
gzip_comp_level level:压缩比由低到高1-9,默认为1
gzip_min_length length:启动压缩功能的响应报文大小阈值,达到指定大小的进行压缩。
gzip_http:version 1.0|1.1:设定压缩协议,默认1.1
gzip_types:指明仅对哪些类型的资源执行压缩操作,默认包含有“text/html”,不用指定,否则报错。
gzip_vary on|off:如果启用压缩,是否在响应报文头部插入“Vary:Accept-Encoding”
gzip_proxied:nginx为代理服务器时,对于后端服务器的响应报文,在何种条件下启用压缩功能
示例:
gzip on; gzip_comp_level 6; gzip_min_length 64; gzip_proxied any; gzip_types text/xml text/css application/javascript;