为什么nginx性能高,nginx使用的什么模型
- nginx使用的是异步非阻塞模型(epoll模型),I/O多路复用技术。
- I/O就是我们网络的I/O,多路是指多个TCP连接,复用是指重复使用一个或少量的线程。就是多个网络I/O去复用一个或少量的线程或者说进程
nginx处理请求的方式
在说nginx处理请求的方式之前先要知道nginx的配置文件存放的位置,有人的第一反应肯定是/usr/local/nginx目录,可以但是也不全对 // nginx的配置文件的位置根据你安装的方式和位置决定。
- 若你是编译安装的nginx,如果不指定安装目录则默认安装在/usr/local/nginx/nginx.conf;若不想安装在此目录也可以在编译时使用 --prefix=选择你要安装到哪个目录。
- 若你使用的是yum安装,则nginx配置文件存放位置就在,/etc/nginx/nginx.conf
// ngixn在接到一个请求后,首先通过listen和server_name进行定位到server模块,然后再由server模块里面的location处理请求,这就是一个简单的处理方式。
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
nginx的应用场景有哪些
- 作为web服务器。nginx可以用来作为http服务来提供服务,一般是用来处理静态资源的。
- 虚拟主机。通过一台主机虚拟出个网站。
- 用作反向代理和负载均衡。当一个网站的访问量达到一定程度,一台主机支撑不了这么多访问量时就需要作负载均衡,这时就可以使用nginx服务器作为负载均衡,也可以使用nginx作为反向代理,来接收请求,并发给后端的服务器。
- nginx也可以做配置安全管理。如用nginx搭建API接口网关,对每个接口的服务进行拦截。
nginx虚拟主机怎么进行配置?
- 基于域名的虚拟主机,通过域名来区分虚拟主机应用: 外部网站
- 基于端口的虚拟主机,通过端口来区分虚拟主机应用: 公司内部网站,外部网站的管理后台
- 基于IP地址的虚拟主机
基于虚拟主机配置
- 首先创建一个目录/data/test和/data/test1目录,通过windows的hosts文件添加域名解析,对应域名网站目录下新建index.html文件;
// 把localhost改为域名,再将root后面的html改为/data/test目录,当用户访问域名,通过监听的端口号,就跳转到/data/test目录下的html文件
基于端口号的虚拟主机
// 使用端口号来区分,浏览器使用域名或IP地址端口号访问,就是把listen的80端口号改为服务器
location的作用是什么呢?
- location指令的作用是根据用户请求的URL来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。
location的语法是什么?
匹配符 | 匹配精度 | 优先级 |
---|
= | 精确匹配 | 1 | ^~ | 以某个字符串开头 | 2 | ~ | 区分大小写的正则匹配 | 3 | ~* | 不区分大小写的正则匹配 | 4 | !~ | 区分大小写不匹配的正则 | 5 | !~* | 不区分大小写不匹配的正则 | 6 | / | 通用匹配,任何请求都会匹配到 | 7 |
nginx怎么做限流
- 限流就是限制用户的访问速度。
- 限流有3种:
- 正常限制访问频率(正常流量)
- 突发限制访问频率(突发流量)
- 限制并发连接数
- nginx的限流都是基于漏桶算法。
实现三种限流算法
- 正常限流访问频率
- 限制一个用户发送的请求,nginx多久接收一个请求。
- nginx中使用ngx_http_limit_req_module模块来限制的访问频率,限制的原理实质是基于漏桶算法原理来实现的。在nginx.conf配置文件中可以使用limit_req_zone命令及limit_req命令限制单个IP的请求处理频率。(limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;
) - 1r/s代表1秒一个请求,1r/m一分钟接收一个请求, 如果Nginx这时还有别人的请求没有处理完,Nginx就会拒绝处理该用户请求。
- 突发限制访问频率(突发流量)
- 限制一个用户发送的请求,nginx多久接收一个。
- 如果突发流量超出请求被拒绝处理,无法处理活动时候的突发流量,这时候应该如何进一步处理呢?Nginx提供burst参数结合nodelay参数可以解决流量突发的问题,可以设置能处理的超过设置的请求数外能额外处理的请求数。(limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;)
limit_req zone=zone burst=5 nodelay; - burst=5 nodelay;表示的是nginx对一个用户的请求会立即处理前五个,多的就慢慢处理,再有其他的请求nginx就漏掉不接受你的请求。
- 限制并发连接数
- nginx中的ngx_http_limit_conn_module模块提供了限制并发连接数的功能,使用limit_conn_zone指令及limit_conn执行进行配置。
http {
limit_conn_zone $binary_remote_addr zone=myip:10m;
limit_conn_zone $server_name zone=myServerName:10m;
}
server {
location / {
limit_conn myip 10;
limit_conn myServerName 100;
}
}
- 单个IP同时并发连接数最多只能10个连接,设置了整个虚拟服务器同时最大并发数最多只能100个链接。当请求的header被服务器处理后,虚拟服务器的连接数才会计数。
漏桶算法是什么
漏桶算法(Leaky Bucket)是网络世界中流量整形(Traffic Shaping)或速率限制(Rate Limiting)时经常使用的一种算法,它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。
漏桶实现原理 当主机接口向网络中传送数据包时,可采取漏桶算法,使得接口输出数据流的速率恒定。
- 输出不规则数据流的主机类似灌水的水龙头
- 算法中定义的漏桶类似水桶
- 不规则数据流输入漏桶类似向漏桶中灌水
详细分解一下漏桶算法在数据包传送过程中的实现原理:
- 队列接收到准备转发的数据包。
- 队列被调度,得到转发机会。由于队列配置了流量整形,队列中的数据包首先进入漏桶中。
- 根据数据包到达漏桶的速率与漏桶的输出速率关系,确定数据包是否被转发。
- 如果到达速率≤输出速率,则漏桶不起作用。
- 如果到达速率>输出速率,则需考虑漏桶是否能承担这个瞬间的流量。
- 若数据包到达的速率-漏桶流出的速率≤配置的漏桶突发速率,则数据包可被不延时的送出。
- 若数据包到达的速率-漏桶流出的速率>配置的漏桶突发速率,则多余的数据包被存储到漏桶中。暂存在漏桶中的数据包在不超过漏桶容量的情况下延时发出。
- 若数据包到达的速率-漏桶流出的速率>配置的漏桶突发速率,且数据包的数量已经超过漏桶的容量,则这些数据包将被丢弃。
漏桶算法和令牌桶算法的区别
漏桶算法与令牌桶算法在表面看起来类似,很容易将两者混淆。但事实上,这两者具有截然不同的特性,且为不同的目的而使用。漏桶算法与令牌桶算法的区别在于:
- 漏桶算法能够强行限制数据的传输速率。
- 令牌桶算法能够在限制数据的平均传输速率的同时还允许某种程度的突发传输。
在某些情况下,漏桶算法不能够有效地使用网络资源。因为漏桶的漏出速率是固定的,所以即使网络中没有发生拥塞,漏桶算法也不能使某一个单独的数据流达到端口速率。因此,漏桶算法对于存在突发特性的流量来说缺乏效率。而令牌桶算法则能够满足这些具有突发特性的流量。通常,漏桶算法与令牌桶算法结合起来为网络流量提供更高效的控制。
nginx的负载均衡策略有哪几种?
-
轮询(默认的方式) 将客户端的请求按时间顺序分配到后端服务器上面,若后端的某个服务器宕机,则会自动跳过 -
权重(weight) weight的值越大被访问的几率就越高,这样可以给性能高的服务器加权,这样可以减少资源浪费。 -
ip_hash(IP绑定) 每一个请求按照访问的IP的哈希结果进行分配,这样来自同一IP地址的访问就会固定到后端某一台主机上,这样也可以解决session共享问题 -
fair(第三方插件) 需要安装upstream_fair模块,fair算法可以根据页面大小和加载时间的长短进行智能的负载均衡,哪台服务器响应时间短的就会优先分配到哪台服务器上。 -
url_hash(第三方插件) 也是需要安装hash软件,这个是按照访问的url的hash结果来进行分配请求,这样就可以通过url固定到后端的服务器,可以提高后端缓存服务器的效率。
nginx配置文件中有哪三大块?
nginx配置文件分为: 全局块、events、http块
全局块
// 在events块之前都属于全局块,在全局块中配置的都是很重要的会影响nginx整体运行的配置。比如: worker(工作进程)的数量,错误日志的位置
1
2 #user nobody;
3 worker_processes 1;
4
5 #error_log logs/error.log;
6 #error_log logs/error.log notice;
7 #error_log logs/error.log info;
8
9 #pid logs/nginx.pid;
10
11
12 events {
13 worker_connections 1024;
14 }
events块
events块主要影响nginx服务器与用户的网络连接,比如worker_connection 1024,标识每个workderprocess进程支持的最大连接数为1024
12 events {
13 worker_connections 1024;
14 }
http块
http块是配置最频繁的部分,虚拟主机的配置,监听端口的配置,请求转发、反向代理、负载均衡等
17 http {
18 include mime.types;
19 default_type application/octet-stream;
20
21 #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
22 # '$status $body_bytes_sent "$http_referer" '
23 # '"$http_user_agent" "$http_x_forwarded_for"';
24
25 #access_log logs/access.log main;
26
27 sendfile on;
28 #tcp_nopush on;
29
30 #keepalive_timeout 0;
31 keepalive_timeout 65;
32
33 #gzip on;
34
35 server {
36 listen 80;
37 server_name localhost;
38
39 #charset koi8-r;
40
41 #access_log logs/host.access.log main;
42
43 location / {
44 root html;
45 index index.html index.htm;
46 }
|