前言:
当前咱们对“nginxet模式”大致比较讲究,兄弟们都需要剖析一些“nginxet模式”的相关文章。那么小编在网上网罗了一些有关“nginxet模式””的相关内容,希望同学们能喜欢,各位老铁们快快来学习一下吧!nginx简介
nginx是轻量级的,高性能的,基于http的反向代理服务器,静态web服务器
高并发:不需要配置可承受1000并发量,也就是一天上千万的请求。配置后(Linux也需要做大量的设置)可达5-10万的并发量
低消耗:10000个非活跃连接,在nginx仅消耗2.5M内存
热部署:在不停机的情况下,修改替换Nginx配置
高可用:worker进程
正向代理和反向代理正向代理作用:隐藏客户端;翻墙;提速(高速链路);缓存;授权;反向代理作用:隐藏服务器;负载均衡;动静分离;缓存;分布式路由;
区别:
正向代理是对客户端的代理,反向代理是对服务端的代理;正向代理架设在客户端,反向代理是服务端;正向代理客户端知道自己访问的真正地址;反向代理客户端不知道;DoS攻击和DDoS
DoS: Denial of Service,拒绝服务,ATM取款,后面人一直排队。前面的人每次只取100,然后一直无法为后面的请求提供服务。
DDoS: Distributed Denial Service,分布式拒绝服务。如一帮人把ATM占用了,所有人都访问不了
nginx常用命令
nginx -v:查看版本
nginx -V:显示更多的版本信息
nginx -t:测试配置文件是否正确
nginx -T:测试配置文件是否正确,并显示配置文件内容
nginx -tq:在配置文件测试中,禁止显示非错误信息
nginx -s stop/quit(优雅停止,使当前工作进程完成后停止)/reload(平滑重启)/reopen
nginx -c filename,指定配置文件路径
nginx -g:设置配置文件以外的全局指令
nginx核心配置零拷贝(Zero Copy)
一般指网络文件从一个区域拷贝到另一个区域,不需要CPU的参与。这样就减少了CPU的消耗和内存带宽的占用。
DMA(Direct Memory Access)直接内存存取
ALU(Arithmetic Logical Unit)算术逻辑运算器
传统方式(send方法)
硬盘 ----> 内核buffer ----> 用户buffer ----> 内核Socket buffer ----> Protocol Engine
4次空间切换,4次copy,2次CPU参与
零拷贝方式(sendfile方法)
硬盘 ----> 内核buffer ----> 内核socket buffer ----> Protocol Engine
2次空间切换,3次copy,0次CPU参与
Gather Copy DMA零拷贝方式
与零拷贝的区别是,没有将数据信息拷贝到socket buffer,而是将数据描述信息(数据的地址及偏移量)拷贝到了socket buffer
2次空间切换,2次copy,0次CPU参与
mmap零拷贝
与零拷贝的区别是应用程序与内核共享了Kernel buffer,
4次空间切换,2次copy,0次CPU参与
多路复用器select | poll | epoll
谈到多路复用,就要先说一下多进程/多线程处理模型,
用户请求 ----> 内核进程 ----> App进程 ----> (BIO) IO,每个内核进程都会创建一个应用程序进程,并且IO是BIO,性能低。
多路复用是在内核进程和APP进程之间加了一个多路复用器,共有3中模型:select, poll, epoll
select: 采用轮询的方式,一直在轮询所有内核进程,如果就绪,立马放入底层就绪队列(由数组实现)
poll:基本与select相似,但就绪队列采用链表实现,所以能够并发处理的最大连接数量是没有限制的(但受系统进程能打开的最大文件描述符ulimit限制)
epoll:采用回调方式,即当内核进程准备就绪后会回调多路复用器,然后放入就绪队列
放入就绪队列有两种模型:LT(level trigger) 水平触发,即如果没有放入成功则一直尝试,直到成功为止。
ET(Edge trigger)边缘触发,即如果没有放入成功,则取消。
nginx并发处理机制
首先,并发机制有3种,多进程,多线程,异步机制。而NGINX这3种都有。
多进程:nginx分master进程和worker进程,而一个master进程可以创建多个worker进程,所以是多进程的。多线程:一个worker进程可以处理多个线程,所以nginx是多线程的。异步非阻塞机制:worker进程采用的是epoll多路复用机制对后台返回的结果进行处理。当后台处理完毕返回结果时,会回调多路复用器,多路复用器通知worker进程。worker收到后台返回的结果,会挂起当前的请求,对IO进行处理,响应客户端。响应完毕后,会继续执行挂起的事务。nginx全局模块下的调优worker_processes 其数值一般为CPU内核数量,或内核数量的整数倍(注:还与硬盘数量及负载均衡模式相关)worker_cpu_affinity 与具体内核进行绑定,所以当worker_processes设置为auto的时候,无法设置该参数
worker_processes 2;
worker_cpu_affinity 01 10;//二进制表示,0代表关闭,1代表开启,假如有2核,2个 worker_processes, 则该配置表示每个进程各使用一个内核
二进制位数与内核数一致,二进制个数与worker_processes数一致
2个内核, 4个worker_processes
01 10 01 10, 每个进程交替使用各个内核
一个二进制数代表一个进程
worker_rlimit_nofile 用来指定一个worker进程可以打开的最大的文件数量,默认值与服务器所能打开的最大文件数量一致
ulimit -n 查看服务器所能打开的最大文件数量
worker_rlimit_nofile 65535
events 模块下的调优worker_connections 1024, 注:该值不能超过 worker_rlimit_nofileaccept_mutex
on (老版本的默认值,1.11.4版本之后默认值改为off),当一个新连接到达时,那些没有处于工作状态worker将以串行的方式处理请求
off 所有连接都会被唤醒,造成惊群现象,只有一个worker能获取到新连接
但是惊群现象不会对Nginx性能造成影响(因为nginx worker进程数量有限,一般与CPU核数一致,最多十几个)
accept_mutex_delay,设置队首worker进程获取互斥锁的时间间隔,默认为500毫秒
设置该属性的前提是accept_mutex设置了on
multi_accept on, 当所有worker都处于工作状态时,又有多个新的连接到来,
该参数就是为了设置当多个连接到达时,是分配到一台服务器上,还是按照负载均衡的策略分配到多台服务器上
off 设置成off,系统会逐个拿出新连接,按照负载均衡的原则,将其分配给多个worker。
on 系统会实时统计出各个worker的连接数量,然后会按照"缺编"最多的worker,一次性将所有连接分配给一个worker
use epoll(nginx 与后端服务器的连接方式,NGINX会自动选择适合当前系统的最高效的方式) http模块下的调优sendfile on 零拷贝sendfile_max_chunk 1m;
the sendfile_max_chunk directive to limit the amount of data transferred in a single sendfile() call
tcp_nopush
This enables NGINX to send HTTP response headers in one packet right after the chunk of data has been obtained by sendfile()
on 以单独的数据包的形式发送消息头;而真正的响应体数据会以数据包的形式发送
off 默认值,
tcp_nodelay
on 不延迟,这是允许覆盖Nagle算法,这个算法最初设计的目的是为了把一些小的数据包,在网速慢的情况下整合成一个大的数据包然后有个200ms的延迟发送。
这个值默认设置为on,就是覆盖Nagle算法,在发送一些静态大文件的时候不delay,直接发送.这个命令只适用于一些keepalive的连接
keepalive_timeout 75s(default)
设置客户端与NGINX建立的长连接的超时时间
keepalive_requests 100(default)
设置一个长连接可以发送的请求数
client_body_timeout
设置客户端获取NGINX响应的超时时限
请求定位
匹配优先级:
精确匹配 > 短路匹配 > 正则匹配 > 长路径匹配 > 普通匹配
正则匹配:不区分大小的正则匹配location ~* /xxx {return 401;}
短路匹配:location ^~ /xxx {return 402;}
精确匹配:location = /xxx {return 403;}
注:
使用正则定义的location在配置文件中出现的顺序很重要。因为找到第一个匹配的正则后,查找就停止了,后面定义的正则就是再匹配也没有机会了。使用精确匹配可以提高查找的速度。例如经常请求/的话,可以使用=来定义location。
URL尾部的/需不需要
关于URL尾部的/有三点也需要说明一下。第一点与location配置有关,其他两点无关。location中的字符有没有/都没有影响。也就是说/user/和/user是一样的。
如果URL结构是的形式,尾部有没有/都不会造成重定向。因为浏览器在发起请求的时候,默认加上了/。虽然很多浏览器在地址栏里也不会显示/。这一点,可以访问baidu验证一下。如果URL的结构是。尾部如果缺少/将导致重定向。因为根据约定,URL尾部的/表示目录,没有/表示文件。所以访问/some-dir/时,服务器会自动去该目录下找对应的默认文件。如果访问/some-dir的话,服务器会先去找some-dir文件,找不到的话会将some-dir当成目录,重定向到/some-dir/,去该目录下找默认文件。可以去测试一下你的网站是不是这样的。缓存配置
NGINX有强大的缓存机制,可以用来进行数据托底。即当web服务器挂掉也不影响正常使用。
可以在HTTP模块进行全局定义;在server模块的各个location进行局部定义;
proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=mycache:10m max_size=5g inactive=2h use_tmp_path=offhttp {...proxy_cache_path /data/nginx/cache keys_zone=one:10m;server {proxy_cache one;location / { proxy_pass ; } }}
location 区域proxy_cache mycacheproxy_cache_key $host$request_uri$arg_proxy_cache_bypass $arg_ageproxy_cache_methods GET HEADproxy_no_cache $aaa $bbb $ccc 只要有一个不为0,就不对该请求结果作缓存, 三个条件是或的关系proxy_cache_purge 是否清除缓存(根据指定的条件,或的关系,不为0为true)proxy_cache_lock off(default) 是否采用互斥方式回源,即当有多个请求对同一个缓存进行获取时,仅有一个被传递到后台的代理服务器,然后将取回的数据放入缓存中,其他的请求从缓存中获取proxy_cache_lock_time_out,给指令proxy_cache_lock一个超时时间proxy_cache_valid 5s;proxy_cache_valid 403 24h;proxy_cache_use_stale error timeout http_500expires 3m 为请求的资源开启浏览器的缓存
NGINX启动后,缓存加载程序只运行一次。 它将有关以前缓存的数据的元数据加载到共享内存区域。一次加载整个缓存可能会在启动后的最初几分钟内消耗足够的资源来减慢NGINX的性能。 为了避免这种情况,请通过将以下参数包含到proxy_cache_path伪指令来配置缓存的迭代加载:
loader_threshold - 迭代的持续时间,以毫秒为单位(默认为200)loader_files - 在一次迭代期间加载的最大项目数(默认为100)loader_sleeps - 迭代之间的延迟(以毫秒为单位)(默认为50)
在以下示例中,迭代持续300毫秒或直到加载了200个项目:
proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;反向代理的属性设置
一定是设置在location{}模块中
(http模块中) client_max_body_size 默认是1M(上传大文件时一定要特别注意)
客户端允许请求的单文件的最大大小,单位字节, 解决nginx+java上传大文件的问题
proxy_buffering on(default)
为后端的返回的数据打开缓冲区
proxy_buffers 4 8k
指定缓冲区的数量与大小
proxy_busy_buffer_size 16k
高负荷下缓存大小,一般为proxy_buffers的两倍
proxy_connect_timeout 60s(default)
nginx跟后端服务器连接超时时间
proxy_read_timeout 60s
nginx发出请求后,等待后端服务器响应的最长时间
负载均衡
负载均衡就其工作的OSI(开放互联模型)层次,在生产应用层面分为4类:
OSI定义了网络互连的七层框架(物理层1、数据链路层2、网络层3、传输层4、会话层5、表示层6、应用层7)
7层负载均衡:应用层,基于HTTP协议的负载均衡,BS架构。通过虚拟URL分配到真实的服务器,NGINX就是L7负载均衡4层负载均衡:传输层,基于TCP协议的负载均衡,C/S架构。通过虚拟IP+端口号分配到真实的服务器。NGINX的商业版是L4的负载均衡3层负载均衡:网络层,基于IP协议的负载均衡,通过虚拟IP的形式将请求分配到真实的服务器。2层负载均衡:链路层,通过虚拟Mac的形式将其分配到真实的服务器
NGINX负载均衡配置
upstream {server localhost:8080 weight=1;server localhost:8081 weight=2;}server {listen 80;server_name localhost;location ~. *(/some|/) {proxy_pass }}
负载均衡策略:
rr(轮询)
upstream {server localhost:8080 weight=1 fail_timeout=20 max_fail=3;server localhost:8081 weight=2;server localhost:8082 backup;server localhost:8083 down;}
fail_timeout: 表示当前主机被NGINX认为停机的最长失联时间,默认为10秒。
max_fails: 表示在fail_timeout 内最多允许失败的次数。
backup: 表示当前服务器为备用服务器
down:表示当前服务器永久停机
ip_hash
upstream {ip_hash;server localhost:8080 weight=1 fail_timeout=20 max_fail=3;server localhost:8081 weight=2;}
注:在NGINX 1.3.1版本之前,不能指定weight属性
该策略不能与backup共用
适合有状态的服务,session
当有服务器宕机时,必须手动指定down属性,否则请求仍会落到该服务器
least_conn
把请求转发给连接数最少的服务器
upstream {least_conn;server localhost:8080 weight=1 fail_timeout=20 max_fail=3;server localhost:8081 weight=2;server localhost:8082 backup;server localhost:8083 down;}NGINX日志管理及自动切割日志管理范围
http范围,server范围和location范围
log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';error_log
日志错误级别:[debug | info | notice | warn | error | crit | alert | emerg]
注:关闭错误日志是:error_log /dev/null;
access_log
access_log 日志文件路径和名称 日志格式 缓存大小
access_log logs/access.log main buffer=64k;
open_log_file_cache max=1000 inactive=10s min_uses=2 valid=60s
max 最多打开的文件个数
inactive 和 min_uses联合使用,指在inactive时间内,至少要有min_uses次使用,否则移出缓存
valid 缓存刷新时间
日志自动切割
1. 在logs目录中创建一个cut_nginx_log.sh
2. 分割方法
a. #vi /etc/nginx_access_log.sh
#!/bin/bash
mv /usr/local/nginx/logs/access.log /opt/nginx_access_`date +%Y%m%d`.log
killall -s USR1 nginx
3. 创建cron脚本
#crontab -e
59 23 * * * /etc/nginx_access_log.sh
nginx静态代理
指将所有的静态资源如image, js, html, css等放到nginx上。location ~ .*\.(css|js|html|jpg|png)$ {root /opt/statics}页面压缩deflate 是一种过时的压缩算法,是huffman编码的一种加强gzip 是大多数浏览器支持的一种压缩算法,是deflate算法的一种加强sdch deflate和gzip是通过改变数据的编码格式,其最终传输的数据并没有减少;而sdch是让冗余的数据只出现一次,其最终传输的数据减少了。Zopfli 压缩体积变小了,但压缩用时太长br 速度快,压缩比高
常用设置gzip ongzip_min_length 5kgzip_comp_level 4, 压缩级别,数字越大,压缩比越高,用时越长。取值为1到9gzip_buffer 4 16k 4表示缓存颗粒数量,而16k表示的是缓存颗粒大小gzip_vary on 开启动态压缩gzip_types mimeType(默认为text/html)
标签: #nginxet模式