本博客首发在cnblogs,后因各类缘由迁移至segmentfaultphp
先来一波官方站点关于nginx介绍。nginx相关历史这里再也不赘述啦。html
nginx 是免费,开源,高性能 HTTP 服务器和反向代理服务器,也可做为IMAP/POP3代理服务器。nginx以它的高性能,稳定性,丰富的特征设定,配置简单和资源消耗低而著称。
nginx是为数很少能够解决C10K问题的服务器。不像传统服务器,nginx不依赖线程处理请求。它使用的是更为高明事件驱动(异步)架构。在高负荷下,也能保持低消耗,更重要的是可预估的内存占用量。若是你不指望去解决上千的并发请求难题,你也能够从nginx的高性能,低消耗而尝到好处。nginx应用规模可大可小:小至 VPS,大至组建服务器集群。node
nginx为何是高性能,低消耗的,可解决高并发问题linux
首先是master/worker二层架构,master负责加载配置文件、管理worker进程、平滑升级;worker负责 处理请求。并且是基于事件驱动模型设计的处理模型,这使得nginx
worker数量和cpu核心数至关便可,可是一个worker进程能够同时处理多个请求,在高并发访问的状况下使用较少的资源从容应对。web
简单来说,异步非阻塞,事件驱动机制是其核心特征。正则表达式
同时nginx拥有一套缓存机制,能够进一步下降网络压力,加速用户响应。算法
模块化设计 segmentfault
nginx整体设计理念秉承模块化设计思想,把各功能细分模块进行开发,实现灵活地装卸载所需模块,方便后续功能拓展。浏览器
nginx模块 分为五类
1)核心模块
2)标准http模块
3)可选http模块
4)mail模块
5)第三方模块
rpm包,官方预制,下载地址: http://nginx.org/packages
编译安装:编译安装根据须要选择编译的模块,因人而异,下例仅供参考
yum install pcre-devel openssl-devel zlib-devel useradd -r nginx ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-http_stub_status_module --with-threads --with-file-aio make && make install
主配置文件:nginx.conf今后处为入口,开始你的nginx配置吧。主配置文件中,使用include命令引用分支配置文件。
nginx配置风格为划地而治,要严格按照模块为区域进行配置
配置结构以下:
main block:主配置段,也即全局配置段;
event {
...
事件驱动相关的配置;
}
http {
...
http/https 协议相关的配置段;
}
mail {
...
mail相关模块
}
stream {
...
tcp/udp 传输层负载均衡配置段;
}
再来说讲配置语法
directive value...; #语法格式
(1) 指令必须以分号结尾;
(2) 支持使用配置变量;
内建变量:由Nginx模块引入,可直接引用;
自定义变量:由用户使用set命令定义;
set variable_name value;
引用变量:$variable_name
内建变量传送门:http://nginx.org/en/docs/vari... 数量繁多,用起来也是很是方便滴,想用什么变量,来这里查查。
主配置段
一、定义进程用户,用户组
user username usergroup;
默认为nobody。 指定一个系统用户。
二、定义主程序pid文件路径
pid /PATH/TO/PID_FILE;
三、 引入分支配置文件
include file;
~ include conf.d/*.conf
“~”在本文中表示配置实例语句
四、装载动态模块
load_modulefile;
~ load_module modules/ngx_mail_module.so;
五、error 日志
error_logfile[level]
~ error_log logs/error.log info
一、指定worker数量
worker_processes number | auto;
数量最宜和cpu核心数相同。
二、绑定worker与cpu核心对应关系
worker_cpu_affinity auto | cpumask;
若是不设置此项,worker会在不一样的工做内核上切换,这会形成没必要要的开销,将它们固定起来就好,通常设置为auto便可。
worker_cpu_affinity0001 0010 0100 1000 #指定cpumask例子
三、指定worker进程的nice值 范围[-20,20]
worker_priority number;
四、设置worker打开文件数量限制
worker_rlimit_nofile number;
~ worker_rlimit_nofile 2390251
固然系统内核参数要改大,sysctl -w fs.file-max=2390251;sysctl -p
一、每一个worker进程所可以打开的最大并发链接数数量;
worker_connections number;
~ worker_connections 65535; #通常设置为65535,最大端口数量
二、指明并发链接请求的处理方法;
use method;
~ use epoll; #linux平台
三、网络链接序列化
accept_mutex on | off;
处理新的链接请求的方法;on表示开启网络链接序列化,避免“惊群”效应——即一个新链接请求,全部worker进程都被激活。建议开启
四、多路接收
multi_accept on|off;
on表示一个worker同时接受尽量多的请求。建议开启
一、配置虚拟主机:server
使用server指令配置虚拟主机,通常格式以下:
server {
listen address[:PORT]|PORT;
server_name SERVER_NAME;
root /PATH/TO/DOCUMENT_ROOT;
}
1.1 listen 指令
配置监听地址,端口指令
有三种形式:
1) listen address[:port] [args..];
监听在指定IP,指定端口;当端口省略时,监听全部端口
2) listen port [args...];
监听主机全部IP的80端口
3) listen unix:path [args...];
监听unix socket,一种本机内部通讯IPC机制,非重点。
-----介绍上面[args] 内容:
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
default_server: 标识符,表示此虚拟主机为address:port 的默认主机
ssl:标识符,虚拟主机使用https协议通讯时,标识此项
backlog=number:设置容许同时最大网络监听链接处于挂起状态的个数,默认为511
rcvbuf=size:设置监听socket接收缓冲区大小
sndbuf=size:设置监听socket发送缓冲区大小
-----小结:
通常listen 指令无需太过复杂
~ listen 10.1.0.1:8080 default_server backlog=1024
~ listen 8080;
1.2 server_name 指令
使用server_name 指令配置基于名称或基于IP的虚拟主机
1)基于名称的虚拟主机
格式: server_name name... 容许跟多个名称,空格符分隔
------name支持glob通配符*
*能够出如今三段式名称中的首段或尾段;以及两段式名称中的尾段
server_name *.cutemsyu.com www.cutemsyu.* cutemsyu.*;
------name支持正则表达式~
以~起始表示正则表达式标记
server_name ~^wwwd+.cutemsyu.com$
其中d表明数字0-9,像这样的表达式可匹配www1.cutemsyu.com,www2.cutemsyu.com 等等
拓展:nginx 支持name 正则表达式字符捕捉功能
server_name ~^(1+).cutemsyu.com$
如此定义,当该表示式匹配www.cutemsyu.com 名称时,在server块中可以使用$1 表示 www 字符串
-----关于一个名称被多个表达式匹配的问题
若是一个主机配置多个虚拟主机,则有可能发生此种状况
nginx有以下server_name 匹配规定:
对于一个名称匹配多个表达式状况,按如下规则处理,排在前面优先级高
1.准确匹配
2.左侧*通配符
3.右侧*通配符
4.正则表达式
若是被同一级别的多个表达式匹配,则按第一个匹配的表达式处理
2)基于IP的虚拟主机
用法: server_name IP;
1.3 配置请求根目录指令:root
root指令定义根路径目录,可定义在http,server,location块;
语法:root path;
web服务器接收到请求后,首先在根目录下寻找资源。后面会介绍location块,root在location用到的状况比较多。
二、配置location块
用法:
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
应用在server块中,或在location块中嵌套使用。
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的全部location,并找出一个最佳匹配,然后应用其配置;
uri部分方便下面叙述,称不含正则表达式的uri为标准uri;反之,含有正则的uri称为正则uri,并且正则uri 前必须使用~或~*。同时支持正则字符串捕捉,使用$1等应用。
[ = | ~ | ~* | ^~ ] 这部分符号是具备特殊定义的符号,表示特定含义,可省略。
server接收到一个请求uri后,先与全部标准uri进行匹配,并记录匹配度最高的一个。而后按序与正则uri进行匹配,匹配到第一个正则uri后,当即按相应location块处理。若是全部正则匹配失败,则应用以前记录的标准uri对应的location块进行处理。
1) = 使用在标准uri前,表示精准匹配,若是请求uri与此对应,则该请求当即由该location块进行处理,再也不与正则uri匹配。
2) ~ 使用在正则uri前,而且区分大小写字母
3) ~* 使用在正则uri前,不区分大小写字母
4) ^~ 使用在标准uri前,要求与标准uri匹配,找到匹配度最高的一个后不进行与正则uri匹配
如,对于"/" 的请求较多的话,使用如下定义
location = / {
....
}
则能实现快速匹配。
看一看nginx官方文档给出的例子:
location = / { [ configuration A ] } location / { [ configuration B ] } location /documents/ { [ configuration C ] } location ^~ /images/ { [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { [ configuration E ] }
请求URI 应用的location配置
/ configuration A
/index.html configuration B
/documents/document.html configuration C
/images/1.gif configuration D
/documents/1.jpg configuration E
至于@name 形式的location,是用来处理重定向类型的请求。在try_files 指令中会提到。
三、路径重定向类的指令
3.1 路径别名 alias
用法: alias path;
定义路径别名,文档映射的另外一种机制;仅能用于location上下文。
与root 指令容易混淆。参考下面示例
location /data {
alias /documents/www;
}
请求uri为/data/index.html,则nginx服务器将在路径 /documents/www 下寻找index.html 文件。
3.2 设置网站默认首页
做用是用户不需输入完整的uri来访问默认主页
用法: index filename... ;
可设置多个默认网页,若是前一个页面文件不存在则显示下一页面文件,以此类推。
3.3 错误页面重定向
用法:error_page code ... [=[response]] uri|path;
当客户端访问遇到问题时,nginx支持自定义错误页面显示,并返回一个指定状态码,若是指定的话。
做用域为 http,server,location 。具备在子域有效的特征。
Example:
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
此示例跳转的资源使用相对路径方式,意味着从定义的根路径下查找文件。
Example:
error_page 404 =200 /empty.gif;
此示例指定转换的状态码。
Example:
error_page 404 = /404.php;
若是响应的错误状态码来自代理服务器,或者FastCGI/uwsgi/SCGI 服务器,应使用该示例方式返回代理服务器返回的状态码。
Example:
error_page 403 http://example.com/forbidden....
error_page 404 =301 http://example.com/notfound.h...
该示例重定向为一个指定uri。此种状况重定向的状态码为302。可修改成 301,302,303,307。
3.4 尝试查找文件
用法: try_files file ... uri;
try_files file ... =code;
按顺序检查文件,若是都不存在,则定向最后一个参数。最后一个参数若是是文件则必须存在;能够是状态码;内部重定向。
example:
location /images/ { try_files $uri /images/default.gif; } location / { try_files $uri $uri/index.html $uri.html =404; }
example:重定向型
location / { try_files $uri $uri/ @wordpress; } location ~ \.php$ { try_files $uri @wordpress; #这里使用重定向,若是请求的资源页不在会自动跳转@wordpress块中的index.php。若是使用uri的话,不会显示动态资源页面。 fastcgi_pass ...; fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name; ... other fastcgi_param's } location @wordpress { fastcgi_pass ...; fastcgi_param SCRIPT_FILENAME /path/to/index.php; ... other fastcgi_param's }
四、套接字相关配置
做用域:http, server, location
4.1 tcp_nodelay on | off;
在keepalived模式下的链接是否启用TCP_NODELAY选项;默认开启;建议开启
4.2 sendfile on|off;
是否开启sendfile 特性,减小数据在内核与用户空间之间的copy次数。建议开启。详见标题6内容
4.3 sendfile_max_chunk size;
worker process 每次调用sendfile() 传输数据的最大值,减小一次调用sendfile()最大阻塞时长,0为不限制,建议设置128K
五、定义客户端请求的相关配置
做用域:http, server, location
5.1 keepalive_timeout timeout [header_timeout];
设定保持链接的超时时长,0表示禁止长链接;默认为75s;header_timeout 可选项,在应答报文首部中表示keepalive超时时间
5.2 keepalive_requests number;
在一次长链接上所容许请求的资源的最大数量,默认为100;
5.3 keepalive_disable none | browser ...;
对哪一种浏览器禁用长链接;
5.4 send_timeout time;
向客户端发送响应报文的超时时长,此处,是指两次写操做之间的间隔时长;若是客户端在规定时长内无任何活动则关闭链接
~ send_timeout 10s;
5.5 client_header_buffer_size size;
设置客户端请求报文首部缓冲区大小,默认值为1K。有时客户端请求首部带有cookie很大的信息,会形成400错误,强烈建议增大大小
大小设置为系统分页大小,命令 getconf PAGESIZE 可查看
通常设置为 client_header_buffer_size 4K;
5.6 client_body_buffer_size size;
用于接收客户端请求报文的body部分的缓冲区大小;默认为16k;超出此大小时,其将被暂存到磁盘上的由client_body_temp_path指令所定义的位置;
5.7 client_body_temp_path path [level1 [level2 [level3]]];
设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;16进制的数字;
client_body_temp_path path /var/tmp/client_body 1 2 2 #可定义在高性能磁盘分区上
六、文件操做优化的配置
做用域:http, server, location
6.1 aio on | off | threads[=pool];
是否启用aio功能;
6.2 directio size | off;
在Linux主机启用O_DIRECT标记,此处意味文件大于等于给定的大小时使用,例如directio 4m;
6.3 directio_alignment size;
为directio设置 alignment 大小,默认512字节,通常不用调整。可是xfs 文件系统须要增大至4k。
--------这里花必定篇幅讲讲aio,directio,和sendfile之间的关系-------
首先aio和sendfile是互相排斥的。启用aio,必须也启用directio,否则的话read()将成为阻塞。
sendfile适合小文件,占用的是系统缓存。当传输大文件时,并且系统内存不够大的状况,使用sendfile()将较不适宜。此时应使用aio机制。
推荐的一个配置示例:文件小于8M,使用sendfile,大于或等于8M使用aio
location /video/ {
sendfile on;
sendfiel_max_chunk 256K;
aio on; directio 8m;
output_buffers 1 128k;
}
特别地,在大文件传输较多的状况下,适宜启用aio threads 。nginx编译须要--with-threads 选项
location /video/ {
sendfile on;
sendfiel_max_chunk 256K;
aio threads; #这里使用默认的线程池,可自行建立。 directio 8m;
output_buffers 1 128k;
}
6.4 open_file_cache off;
open_file_cache max=N [inactive=time];
nginx能够缓存如下三种信息:
(1) 文件的描述符、文件大小和最近一次的修改时间;
(2) 打开的目录结构;
(3) 没有找到的或者没有权限访问的文件的相关信息;
max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现缓存管理;
inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_users指令所指定的次数的缓存项即为非活动项;
6.5 open_file_cache_valid time;
缓存项有效性的检查频率;默认为60s;
6.6 open_file_cache_min_uses number;
在open_file_cache指令的inactive参数指定的时长内,至少应该被命中多少次方可被归类为活动项;
6.7 open_file_cache_errors on | off;
是否缓存查找时发生错误的文件一类的信息;
Example:
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
本篇就介绍到这里,nginx余下内容请关注后续博客。