Nginx (engine x)是一个高性能的HTTP和反向代理服务器,也是一款轻量级的Web 服务器
关于http协议的相关概念:
URL统一资源定位符的形式:
shceme://username:[email protected]:port/path;params?query#frag
http事务:一次请求和一次响应构成一次事务
request请求格式:
<method><URL><VERSION> HEADERS <body>
response响应格式:
<VERSION><STATUS><REASON-PHTASE> HEADERS <body>
Method请求方法: GET/HEAD/POST,PUT/DELETE,TRACES,OPTIONS
Status code:
1xx: 2xx:成功响应码 3xx:重定向类的响应码 4xx:客户端错误 5xx:服务器端错误
Nginx配置文件nginx.conf的结构:
不被花括号所包含的是main block 配置段,也是全局配置段
event{ } 与事件驱动相关的配置段 http{ } 与http/https相关的配置段 mail{ }与邮件代理相关的配置段 stream{ }与负载均衡相关的配置段
作为web服务器http的配置段的结构
http{ ... 配置各个server的全局配置段 server{ listen 80; 监听的端口 server_name www.example.com root /web/hosts/ alias location {OPERATOR} URL{ ... if CONDITION{ ... } } }每一个server是一个虚拟站点 }
nginx配置main block段相关指令及含义
指定work进程的运行身份:
user nginx group;
指明pid文件的存放路径
pid /var/run/nginx.pid;
包含其他配置文件片段
include file_name|mask;
指明要动态装载的模块
load_module file_name;
错误日志:
error_log /var/log/nginx/error.log varn;
与系统优化相关的配置:
worker进程能够打开文件描述符的数量上限:
worker_rlimit_nofile 20; 配置最好与ulimit -n 数值相同,修改文件描述符的数量ulimit -HSn 180000
生成work进程数
worker_processes 3 | auto;
woker进程的优先级:默认为0
worker_priority -9;
nginx的worker进程与cpu绑定
wokrer_cpu_affinity 1000 0100 0010| auto; cpu mask所代表的含义: 1000 : 四核心cpu的最后一个 0100 : 四核心cpu的倒数第二个 ...
用于debug使用的配置:
是否以守护进程的方式运行
daemon on|off;
是否以master/worker模型运行
master_process on| off;
指定错误日志路径及级别
error_log file warn; 指明错误日志路径及名称时不可引用变量
与events配置相关的配置段:
每个worker进程所能响应的最大并发数
worker_connetctions 65535; 一台服务器所能承载的并发响应总数 worker_processes * worker_iconnections
指明并发链接请求的处理方法:
use epoll;
worker进程接受新请求的方法
accept_mutex on|off; 如果为on则worker进程轮流接受新的请求 如果为off则worker进程都会接收到通知,空闲的接受请求
与站点套接字相关的配置
server{ listen address:port default_server ssl http2 backlog=123 rcvbuf=512 sndbuf=512; #default_server:指定为默认虚拟站点 #ssl : 限制仅能通过ssl间接站点 #http2: 指明http协议的版本 #backlog=number: 后援队列长度 #rcvbuf=接收缓冲区大小 #sndbuf=发送缓冲区大小 server_name SERVER_NAME; #SERVER_NAME 支持通配符通配; #例如*.abc.com #支持~以字符开头的正则表达式 #例如~^www.*\.abc.com$ #匹配的优先次序: #1.精确匹配 #2.左侧匹配 #3.右侧匹配 #4.正则表达式匹配 root /PATH/DOCUMENT_ROOT; 指明站点的根目录 }
在keepalived模式下的连接是否启用TCP_NODELAY功能
tcp_nodelay on|off;
是否启用sendfile功能:
sendfile on|off;
在sendfile 模式下是否开启TCP_CORK功能:
tcp_nopush on|off;
路径相关的配置段
指定站点的根目录,用于文件系统与url的映射关系
root path;
匹配URL所映射的系统路径的关系
location [ = | ~ | ~* | ^~ ] url {...} 在一个server配置段中可以有多个location的配置段 nginx根据匹配的不同的url将其资源与不同的路径进行映射 = : 对url做精确匹配 例如:location = / { ... } ~ : 对url做正则表达式匹配,区分字符大小写; ~* : 对rul正则表达式匹配,不区分大小写; ^~ : 对rul左半部分正则表达式匹配,不区分大小写 无符号: 对此url为开头的所有url的做匹配 匹配的优先级: = , ^~ , ~/~* , 无符号
示例:
server{ root /web/hosts/vhsost1 location /wcdma { root /web/hosts/wcdma/ index index.html index index.php } }
定义路径的别名
location /images/ { alias /web/data/images/; }
定义站点的默认首页资源:
index file; 例如: index index.html index.htm index
定义错误的返回页面
error_page 404 = 200 /eror_page #相对路径
接受多个路径作为参数,当一个资源 无法找到时自动寻找下一个,否则找默认位置
try_files file ... url;
示例:
location / { try_files index.html index.htm @default; } location @default { root /web/hosts/error; index index.html; }
与客户端请求相关的配置
配置保持链接的超时时长, 0表示进制长连接模式
keepalive_timeout 75;
单个长连接上所能请求的最大资源数
keepalive_requests 100;
对哪种浏览器禁用长连接模式
keepalive_disable none|browser;
向客户端发送响应报文的超时时长,指两次写操作之间的时间间隔
send_timeout 20;
用于接受客户端请求报文body部分的缓冲区大小,如果超出此大小则将被存储在磁盘上由client_body_temp_path所指定的位置
client_body_buffer_size size;
指定用于存储接受客户端请求报文的body部分的位置
client_body_temp_path /var/tmp/client_body 2 1 1; 2:第一个数字2表示用2位16进制数个作为1级目录 1:第二个数字1表示用1位16进制数个作为2级目录 ...
与客户端限制相关的配置
限制响应给客户端的传输速率,单位为bytes/ second , 0 表示无限制
limit_rate 500;
限制除了指定方法的客户端
例如: limit_except GET { allow 110.11.223.0/24; deny all; }
文件操作的优化:
是否开启aio机制
aio on|off | threads [=pool];
是否启用directio机制,在LINUX主机启用O_DIRECT标记,当请求大于设定值时,
直接跳过内核的缓存的进程直接读取硬盘,用于命中率较差或较大文件.
directio size | off;
是否启用打开文件缓存:
open_file_cache off;
open_file_cache max=200 inactive=60;
nginx 可以缓存的三种信息:
1.文件描述符.文件大小,最近一次修改时间; 2.打开目录的结构 3.没有找到的或没有权限访问的文件相关信息; max=200 缓存项的上限,达到上限则使用LRU算法管理 inactive=time 缓存项的非活动时长,指定时间内没有被访问的,或命中次数少于open_file_cache_min_uses指令所指定的次数的缓存项
缓存有效性检查频率,时间
open_file_cache_valid 60;
在open_file_cache inactive所指定的时间内,缓存所访问的次数少于该数的被归类为非活动项
open_file_cache_min_users 1;
是否缓存查找错误的信息
open_file_cache_errors on| off;
ngx_http_access_module模块相关的配置:
allow ipaddress; deny ipaddress;
ngx_http_auth_basic_module模块
实现基于访问控制,basic认证方式(需要借助hdpasswd生成用户文件)
auth_basic string|off; auth_basic_user_file file_name;
示例:
location /admin/ { alias /web/vhosts/app1/data; auth_basic "Admin Area"; auth_basic_user_file /etc/nginx/.ngxpasswd; } ~]# htpasswd -c -m /etc/nginx/.ngxpasswd tom
ngx_http_stub_status_module模块配置:
用于输出nginx的基本状态信息:
Active connections: 活动状态的连接数; accepts : 已经接受的客户端的请求总数; handled : 已经处理完成的请求总数; requests : 客户端发来的总的请求总数; reading : 处于读取客户端请求报文首部的链接总数; writing : 处于向客户端发送响应的过程的连接数; waiting : 处于等待客户端发出请求的空闲连接数;
示例:
stub_status; location /basic_status { stub_status; }
ngx_http_log_module日志模块
日志格式:
log_format name string; string可以使用nginx核心模块的吃内置变量 access_log /var/log/nginx/access.log format buffer=512 gzip=1 flush=time if=condition; access_log off; buffer=512 定义缓冲区的大小 flush=time 刷新时间 open_log_file_cache max=100 inactive=60 min_uses=1 valid=60; open_log_file_cache off; 缓存各日志文件相关的元数据; max 缓存的文件描述符的最大个数 min_uses 在inactive时间内最少被访问的次数 inactive 非活动时长数; valid 验证缓冲项是否为活动项的时间间隔;
ngx_http_gzip_module压缩模块;
传输数据时压缩传输之用
gzip on|off;
压缩级别:
gzip_com_level 1;
指明哪些客户端不进行压缩:
gzip_disable regex...;
指明压缩传输的最小值
gzip_min_length 60k;
指明压缩传输的缓冲区个数及每个的大小
gzip_buffers 20 100;
nginx作为代理服务器时,接受到从被代理服务器发送的响应报文后,以何种的条件启用压缩
gzip_proxied off | expired |no-cache |nostore | private | no_last_modified | no_etag |auth | any ; off:对代理的请求不启用 no-cache,no-store,private:表示从被代理服务器收的响应报首部的Cahce_control的值为三者中的一个时启用压缩;
针对某些类型启用压缩:
gzip_types mime-type; 是一种压缩过滤器,仅对该类型的压缩 示例: gzip on; gzip_comp_level 6; gzip_min_length 64; gzip_proxied any; gzip_types text/xml text/css application/javascript;
ngx_http_ssl_module安全模块:
启用https功能
ssl on|off;
指定主机使用的ped格式的证书文件
ssl_certificate file;
指明主机证书与之对应的私钥文件
ssl_certificate_key file;
指明ssl 协议的版本
ssl_protols [SSLv2] [SSLv3] TLSv1 TLSv1.1 TLSv2 ;
指明openssl内建的缓存,此缓存为每个worker进程私有以及共享的缓存名大小;
ssl_session_cache off|none| builtin 500 shared:name:500
指明客户端的链接可以复用ssl session cache中缓存的ssl参数的有效时长
ssl_session_timeout 60;
示例:
server{ listen 443 ssl; server_name www.abc.com; root /web/vhsts/ssl/; ssl on; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /nginx/ssl/nginx.key; ssl_protocols TLSv1 tlsv1.1 tlsv2 sslv2 sslv3; ssl_session_cache shared:sslcache:20m; }
ngx_http_rewrite_module模块:
将用户请求的URL基于regex所描述的模式进行检查,匹配到的url将重新替换为新的url;
rewrite regex replacement flag
此模式值得注意的是:如果在同一级别下配置多个rewrite规则, 自上而下逐个匹配,完成匹配之后再次进行新的url继续进行匹配,具有循环的机制
[flag]的标志位用于控制此循环机制; last:重写完成后停止对当前URL在当前location中的后续的其他重写机制,而后对新的URL启动新训创业的重写机制; break:重写完成后停止对当前URL在当前location中后续的重写操作,直接跳出重写模块 redirect:重写完成之后临时重定向方式直接返回给客户端,客户端重新请求新的URL不能以http://或https://开头
如果replacement 是以http://或者htts://开头,则替换后的结果会直接以重定向的方返回给客户端
301:永久重定向 return 返回给客户端状态码 return code text; return code URL; return URL;
是否开启重写日志:
return_log on|off;
if (condition) {...}语句,一个新的配置条件满足时,执行配置块中的配置指令:
condition: 比较操作符: == != ~: 模式匹配,区分大小写; ~*:模式匹配,不区分大小写; !~:模式不匹配, 区分大小写; !~:模式不匹配, 不区分字符大小写; 文件及目录存在性判断: -e, !-e -f, !-f -d, !-d -x, !-x
用户自定义变量:
set $variable value;
ngx_http_referer_module 模块:跳转模块配置
定义referer首部的合法可用值;
valid_referers none | blocked | server_names| string ..; none: 请求报文首部没有referer首部; blocked: 请求报文的referer首部没有值; server_name: 参数, 有值做为主机名或主机名模式; arbitrary_string: 直接字符串,但可使用*作通配符; regular expression:指定的正则表达式模式匹配到的字符串; 要使用~开头, 例如 : ~.*\.acb\.com;
配置示例:
valid_referers none block server_names *.abc.com abc.com ~\.abc\.com; if($invalid_referer) { return 403; }