nginx基础知识
Nginx介绍
特性:
- 模块化设计,较好的扩展性
- 高可靠性
- 支持热部署:不停机更新配置文件,升级版本,更换日志文件
- 底内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
- event-driven,aio,mmap,sendfile
基本功能:
- 静态资源的web服务器
- http协议反向代理服务器
- pop3/imap4协议反向代理服务器
- FastCGI(LNMP),uWSGI(python)等协议
- 模块化(非DSO),如zip,SSL模块
nginx的程序架构
web服务器相关的功能:
- 虚拟主机(server)
- 支持keep-alive 和管道连接
- 访问日志(支持基于日志缓存)
- url rewrite
- 路径别名
- 基于IP及用户的访问控制
- 支持速率限制及并发数限制
- 重新配置和在线升级而无需中断客户的工作进程
- Memcached的GET接口
nginx 架构
nginx的程序架构:
master/worker结构
- 一个master进程:负载加载和分析配置文件,管理worke进程,平滑升级
- 一个或多个worker进程:处理并响应用户请求
- 缓存相关的进程:cache loader: 载入缓存对象 cache manager:管理缓存对象
nginx模块
nginx 高度模块化,
模块分类:
- 核心模块:core module
- 标准模块:
- HTTP模块:ngx_http_*
HTTP Core modules 默认功能
HTTP Optional modules 需编译时指定 - Mail模块 ngx_mail_*
- Stream模块ngx_stream_*
- 第三方模块
nginx的公用
- 静态的web资源服务器:html,图片,js,css,txt等静态资源
- 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
- http/https协议的反向代理
- imap4/pop3协议的反向代理
- tcp/udp协议的请求转发(反向代理)
nginx配置
配置文件的组成部分:
- 主配置文件:nginx.conf
子配置文件: include conf.d/*.conf - fastcgi, uwsgi, scgi 等协议相关的配置文件
- mime.types: 支持的mime类型
主配置文件的配置指令:
- directive value [value2 …];
注意:
- 指令必须以分号结尾
- 支持使用配置变量
- 内建变量:由Nginx模块引入,可直接引用
- 自定义变量:由用户使用set命令定义 set variable_name value;
- 引用变量 :$variable_name
nginx配置文件
主配置文件结构:四部
- main block:主配置段,即全局配置段,对http,mail都有效
event {
…
}事件驱动相关的配置 - http {
…
} http/https协议相关配置段 - mail {
…
} mail协议相关配置段 - stream {
…
} stream服务器相关配置段
http协议相关的配置结构
性能优化相关的配置:
- worker_processes number | auto
worker进程的数量,通常应该为当前主机的cpu的物理核心数 - worker_cpu_affinity auto [cpumask]提高缓存命中率
CPU MASK: 00000001:0号CPU
00000010: 1号CPU
10000000: 8号CPU
worker_cpu_affinity 0001 0010 0100 1000;
worker_cpu_affinity 0101 1010; - worker_priority number: 指定worker进程的nice值,设定worker进程优先级:[-20,20]
- worker_rlimit_nofile number:worker进程所能够打开的文件数量上限:如65535
事件驱动相关的配置:
- events{
…
} - worker_connections number:每个worker进程所能够打开的最大并发连接数数量,如10240总最大并发数: worker_processes * worker_connections
- use method: 指明并发连接请求的处理方法,默认自动选择最优方法 use epoll;
- accept_mutex on | off 互斥: 处理新的连接请求的方法;on指由各个worker轮流处理新请求,Off指每个新请求的到达都会通知(唤醒)所有的进程,但只有一个进程可获得连接,造成“惊群”,影响性能。
调试和定位问题
- daemon on | off 是否以守护进程方式运行nginx,默认是守护进程方式
- master_process on | off 是否以master/worker模型运行nginx;默认为on off 将不启动worker
- error_log file [level] 错误日志文件及其级别;处于调试需要,可设定为debug;但debug仅在编译时使用了"–with-debug"选项才有效
方式:file /path/logfile;
stder: 发送到标准错误
syslog:server-address[,parameter=values]:发送到syslog memory:size 内存 level:debug|info|notice|warm|error|crit|alter|emerg
与套接字相关的配置:
-
server{…}
配置一个虚拟主机
server{
listen address[:PORT]|PORT;
server_name SERVER_NAME;
root /PATH/TO/DOCUMENT_ROOT;
} -
listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcbuf = size] [sndbuf=size]
default_server 设定为默认虚拟主机
ssl 限制仅能够通过ssl连接提供服务
backlog=number 超过并发连接数后,新请求进入后援队列的长度
rcvbuf=size 接收缓冲区大小
sndbuf=size 发送缓冲区大小
注意:
(1) 基于port:
listen PORT; 指令监听在不同的端口
(2) 基于ip的虚拟主机
listen IP:PORT; IP地址不同
(3)基于hostname
server_name fqdn; 指令指向不同的主机名
-
server_name name …;
- 虚拟主机的主机名称后可跟多个由空白字符分隔的字符串
- 支持*通配任意长度的任意字符
server_name .magedu.com www.magedu. - 支持~起始的字符做正则表达式模式匹配,性能原因慎用
server_name ~^www\d+.magedu.com$
说明: \d 表示[0-9] - 匹配优先级机制从高到低:
(1) 首先是字符串精确匹配 如:www.magedu.com
(2) 左侧通配符 如:.magedu.com
(3) 右侧通配符 如:www.magedu.
(4) 正则表达式 如:~^.*.magedu.com$
(5) default_server
-
tcp_nodelay on | off;
在keepalived模式下的连接是否启用TCP_NODELAY选项
当为off时,延迟发送,合并多个请求后再发送
默认On时,不延迟发送
可用于:http,server,location -
sendfile on | off;
是否启用sendfile功能,在内核中封装报文直接发送
默认off -
server_tokens on | off |build |string
是否在响应报文的Server首部显示nginx版本
定义路径相关的配置
-
root
设置web资源的路径映射;用于指明请求的URL所对应的文档的目录路径,可用于http,server,location,if in location
server {
…
root /data/www/vhost1;
}示例:
http://www.megedu.com/images/logo.jpg
–> /data/www/vhosts/images/logo.jpg -
location [ = | ~ | ~* | ^~ ] uri {…}
location @name {…}
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置
示例:
server{…
server_name www.megedu.com;
location /images/ {
root /data/imgs/;
}
}http://www.magedu.com/images/logo.jpg
–> /data/imgs/logo.jpg
-
= : 对URI做精确匹配;
location = /{
…
}
http://www.megedu.com/ 匹配
http://www.magedu.com/index.html 不匹配 -
^~ : 对URI的最左边部分做匹配检查,不区分字符大小写
-
~ : 对URI做正则表达式模式匹配,区分字符大小写
-
~* :对URI做正则表达式模式匹配,不区分字符大小写
-
不带符号 : 匹配起始于此uri的所有的uri
-
匹配优先级从高到低:
=, ^~, /*, 不带符号
- alias path;
路径别名,文档映射的另一种机制;仅能用于location上下文
示例 :
http://www.magedu.com/bbs/index.php
location /bbs/{
alias /web/forum/;
} --> /web/forum/index.html
location /bbs/ {
root /web/forum/;
} --> /web/forum/bbs/index.html
注意:location中使用root指令和alias指令的意义不同
(a)root,给定的路径对应于location中的/uri/左侧的/
(b)alias,给定的路径对应于location中的/uri/右侧的/
-
index file …;
指定默认网页文件,注意:ngx_http_index_module模块 -
error_page code … [=[response]] uri;
模块:ngx_http_core_module
定义错误页,以指定的响应状态码进行响应
可用位置:http, server, location, if in location
error_page 404 /404.html
error_page 404 = 200 /404.html -
try_files file … uri;
try_files file … =code;
按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误
location /images/ {
try_files $uri /images/default.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位16进制,即2^4=16个目录 0-f
2级目录占2位16进制,即2^8=256个目录 00 -ff
对客户端进行限制的相关配置
- limit_rate rate;
限制响应给客户端的传输速率,单位是bytes/second
默认值0表示无限制 - limit_except method … {…},仅用于location
限制客户端使用除了指定的请求方法之外的其他方法
method: 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 off;
open_file_cache max = N [inactive=time];
nginx可以缓存以下三种信息:
(1)文件元数据:文件的描述符,文件大小和最近一次的修改时间
(2)打开的目录结构
(3)没有找到的或者没有权限访问的文件的相关信息
max=N : 可缓存的缓存项上限;达到上限后会使用LRU算法实现管理
inactive = time : 缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_uses指令所指定的次数的缓存项即为非活动项,将被删除 -
open_file_cache_errors on | off;
是否缓存查找时发生错误的文件一类额信息
默认值为off -
open_file_cache_min_uses number;
open_file_cache 指令的inactive参数指定的时长内,至少被命中此处指定的次数方可被归类为活动项
默认值为1 -
open_file_cache_valid time;
缓存项有效性的检查频率
默认值为60s
ngx_http_access_module 模块
实现基于ip的访问控制功能
- allow address | CIDR | unix: | all;
- deny address | CIDR | unix: | all;
http, server location, limit, limit_except
自上而下检查,一旦匹配,将生效,条件严格的置前
示例:
location / {
deny 192.168.1.1; #拒绝
allow 192.168.1.0/24; #允许
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
ngx_http_auth_basic_module模块
实现基于用户的访问控制,使用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 所提供
ngx_http_stub_status_module
- ngx_http_stub_status_module模块
用于输出nginx的基本状态信息
输出信息示例:
Active connections: 291
server accepts handled request
16630948 16630948 31070465
上面三个数字分别代表对应accepts,handled,requests三个值
Reading: 6 Writing:179 Waiting:106
ngx_http_log_module模块
指定日志格式记录请求
- log_format name string …;
string 可以使用nginx核心模块及其它模块内嵌的变量 - access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
访问日志文件路径,格式及相关的缓冲的配置
buffer=size
flush=time - open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
缓存各日志文件相关的元数据信息
max:缓存的最大文件描述符数量
min_uses:在inactive指定的时长内访问大于等于此值方可被当做活动项
inactive:非活动时长
valid:验证缓存中各缓存项是否为活动项的时间间隔
ngx_http_gzip_module
用gzip方法压缩响应数据,节约带宽
1. gzip on | off; 启用或禁用gzip压缩
2. gzip_comp_level level; 压缩比由低到高:1到9 默认:1
3. gzip_disable regex ...; 匹配到客户端浏览器不执行压缩
4. gzip_min_length length; 启用压缩功能的响应报文大小阀值
5. gzip_http_version 1.0 |1.1
设定启用压缩功能时,协议的最小版本 默认:1.1
6. gzip_buffers number size;
支持实现压缩功能时缓冲区数量及每个缓冲区的大小 默认:32 4k 或 16 8k
7. gzip_types mime-type ...;
指明仅对哪些类型的资源执行压缩操作;即压缩过滤器
默认包含有text/html,不用显示指定,否则出错
8. gzip_vary on | off;
如果启用压缩,是否在响应报文首部插入 “Vary:Accept-Encoding”
9. gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
nginx充当代理服务器时,对于后端服务器的响应报文,在何种条件下启用压缩功能
off: 不启用压缩
expired, no-cache, no-store, private : 对后端服务器的响应报文首部Cache-Control值任何一个,启用压缩功能
示例:
gzip on;
gzip_comp_level 6
gzip_min_length 64;
gzip_proxied any;
gzip_types text/xml text/css application/javascript;