而 Nginx 的异步非壅塞事情办法正是利用了这点等待的韶光。在须要等待的时候,这些进程就空闲出来待命了。因此表现为少数几个进程就办理了大量的并发问题。
Nginx是如何利用的呢,大略来说:同样的 4 个进程,如果采取一个进程卖力一个 request 的办法,那么,同时进来 4 个 request 之后,每个进程就卖力个中一个,直至会话关闭。期间,如果有第 5 个request进来了。就无法及时反应了,由于 4 个进程都没干完活呢,因此,一样平常有个调度进程,每当新进来了一个 request ,就新开个进程来处理。
回忆下,BIO 是不是存在酱紫的问题?
Nginx 不这样,每进来一个 request ,会有一个 worker 进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生壅塞的地方,比如向上游(后端)做事器转发 request ,并等待要求返回。那么,这个处理的 worker 不会这么傻等着,他会在发送完要求后,注册一个事宜:“如果 upstream 返回了,见告我一声,我再接着干”。于是他就安歇去了。此时,如果再有 request 进来,他就可以很快再按这种办法处理。而一旦上游做事器返回了,就会触发这个事宜,worker 才会来接手,这个 request 才会接着往下走。
这便是为什么说,Nginx 基于事宜模型。
由于 web server 的事情性子决定了每个 request 的大部份生命都是在网络传输中,实际上花费在 server 机器上的韶光片不多。这是几个进程就办理高并发的秘密所在。即:
webserver 刚好属于网络 IO 密集型运用,不算是打算密集型。
异步,非壅塞,利用 epoll ,和大量细节处的优化。也正是 Nginx 之以是然的技能基石。
什么是正向代理?一个位于客户端和原始做事器(origin server)之间的做事器,为了从原始做事器取得内容,客户端向代理发送一个要求并指定目标(原始做事器),然后代理向原始做事器转交要求并将得到的内容返回给客户端。
客户端才能利用正向代理。正向代理总结就一句话:代理端代理的是客户端。例如说:我们利用的OpenVPN 等等。
什么是反向代理?反向代理(Reverse Proxy)办法,是指以代理做事器来接管 Internet上的连接要求,然后将要求,发给内部网络上的做事器并将从做事器上得到的结果返回给 Internet 上要求连接的客户端,此时期理做事器对外就表现为一个反向代理做事器。
反向代理总结就一句话:代理端代理的是做事端。
反向代理做事器的优点是什么?反向代理做事器可以隐蔽源做事器的存在和特色。它充当互联网云和web做事器之间的中间层。这对付安全方面来说是很好的,特殊是当您利用web托管做事时。
Nginx目录构造有哪些?[root@localhost ~]# tree /usr/local/nginx/usr/local/nginx├── client_body_temp├── conf # Nginx所有配置文件的目录│ ├── fastcgi.conf # fastcgi干系参数的配置文件│ ├── fastcgi.conf.default # fastcgi.conf的原始备份文件│ ├── fastcgi_params # fastcgi的参数文件│ ├── fastcgi_params.default │ ├── koi-utf│ ├── koi-win│ ├── mime.types # 媒体类型│ ├── mime.types.default│ ├── nginx.conf # Nginx主配置文件│ ├── nginx.conf.default│ ├── scgi_params # scgi干系参数文件│ ├── scgi_params.default │ ├── uwsgi_params # uwsgi干系参数文件│ ├── uwsgi_params.default│ └── win-utf├── fastcgi_temp # fastcgi临时数据目录├── html # Nginx默认站点目录│ ├── 50x.html # 缺点页面优雅替代显示文件,例如当涌现502缺点时会调用此页面│ └── index.html # 默认的首页文件├── logs # Nginx日志目录│ ├── access.log # 访问日志文件│ ├── error.log # 缺点日志文件│ └── nginx.pid # pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件├── proxy_temp # 临时目录├── sbin # Nginx命令目录│ └── nginx # Nginx的启动命令├── scgi_temp # 临时目录└── uwsgi_temp # 临时目录
Nginx配置文件nginx.conf有哪些属性模块?
worker_processes 1; # worker进程的数量events { # 事宜区块开始 worker_connections 1024; # 每个worker进程支持的最大连接数} # 事宜区块结束http { # HTTP区块开始 include mime.types; # Nginx支持的媒体类型库文件 default_type application/octet-stream; # 默认的媒体类型 sendfile on; # 开启高效传输模式 keepalive_timeout 65; # 连接超时 server { # 第一个Server区块开始,表示一个独立的虚拟主机站点 listen 80; # 供应做事的端口,默认80 server_name localhost; # 供应做事的域名主机名 location / { # 第一个location区块开始 root html; # 站点的根目录,相称于Nginx的安装目录 index index.html index.htm; # 默认的首页文件,多个用空格分开 } # 第一个location区块结果 error_page 500502503504 /50x.html; # 涌现对应的http状态码时,利用50x.html回应客户 location = /50x.html { # location区块开始,访问50x.html root html; # 指定对应的站点目录为html } } ......
cookie和session差异?共同:
存放用户信息。存放的形式:key-value格式 变量和变量内容键值对。
差异:cookie
存放在客户端浏览器每个域名对应一个cookie,不能跨跃域名访问其他cookie用户可以查看或修正cookiehttp相应报文里面给你浏览器设置钥匙(用于打开浏览器上锁头)session:
存放在做事器(文件,数据库,redis)存放敏感信息锁头为什么 Nginx 不该用多线程?Apache: 创建多个进程或线程,而每个进程或线程都会为其分配 cpu 和内存(线程要比进程小的多,以是 worker 支持比 perfork 高的并发),并发过大会榨干做事器资源。
Nginx: 采取单线程来异步非壅塞处理要求(管理员可以配置 Nginx 主进程的事情进程的数量)(epoll),不会为每个要求分配 cpu 和内存资源,节省了大量资源,同时也减少了大量的 CPU 的高下文切换。以是才使得 Nginx 支持更高的并发。
nginx和apache的差异轻量级,同样起web做事,比apache占用更少的内存和资源。
抗并发,nginx处理要求是异步非壅塞的,而apache则是壅塞性的,在高并发下nginx能保持低资源,低花费高性能。
高度模块化的设计,编写模块相对大略。
最核心的差异在于apache是同步多进程模型,一个连接对应一个进程,nginx是异步的,多个连接可以对应一个进程。
什么是动态资源、静态资源分离?
动态资源、静态资源分离,是让动态网站里的动态网页根据一定规则把不变的资源和常常变的资源区分开来,动静资源做好了拆分往后我们就可以根据静态资源的特点将其做缓存操作,这便是网站静态化处理的核心思路。
动态资源、静态资源分离大略的概括是:动态文件与静态文件的分离。
为什么要做动、静分离?在我们的软件开拓中,有些要求是须要后台处理的(如:.jsp,.do 等等),有些要求是不须要经由后台处理的(如:css、html、jpg、js 等等文件),这些不须要经由后台处理的文件称为静态文件,否则动态文件。
因此我们后台处理忽略静态文件。这会有人又说那我后台忽略静态文件不就完了吗?当然这是可以的,但是这样后台的要求次数就明显增多了。在我们对资源的相应速率有哀求的时候,我们该当利用这种动静分离的策略去办理动、静分离将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台运用分开支配,提高用户访问静态代码的速率,降落对后台运用访问
这里我们将静态资源放到 Nginx 中,动态资源转发到 Tomcat 做事器中去。
当然,由于现在七牛、阿里云等 CDN 做事已经很成熟,主流的做法,是把静态资源缓存到 CDN 做事中,从而提升访问速率。
比较本地的 Nginx 来说,CDN 做事器由于在海内有更多的节点,可以实现用户的就近访问。并且,CDN 做事可以供应更大的带宽,不像我们自己的运用做事,供应的带宽是有限的。
什么叫 CDN 做事?CDN ,即内容分发网络。
其目的是,通过在现有的 Internet中 增加一层新的网络架构,将网站的内容发布到最靠近用户的网络边缘,利用户可就近取得所需的内容,提高用户访问网站的速率。
一样平常来说,由于现在 CDN 做事比较大众,以是基本所有公司都会利用 CDN 做事。
Nginx怎么做的动静分离?只须要指定路径对应的目录。location/可以利用正则表达式匹配。并指定对应的硬盘中的目录。如下:(操作都是在Linux上)
location /image/ { root /usr/local/static/; autoindex on;}
步骤:
# 创建目录mkdir /usr/local/static/image # 进入目录cd /usr/local/static/image # 上传照片photo.jpg # 重启nginxsudo nginx -s reload
打开浏览器 输入 server_name/image/1.jpg 就可以访问该静态图片了
Nginx负载均衡的算法怎么实现的?策略有哪些?为了避免做事器崩溃,大家会通过负载均衡的办法来分担做事器压力。将对台做事器组成一个集群,当用户访问时,先访问到一个转发做事器,再由转发做事器将访问分发到压力更小的做事器。
Nginx负载均衡实现的策略有以下五种:
1 .轮询(默认)每个要求按韶光顺序逐一分配到不同的后端做事器,如果后端某个做事器宕机,能自动剔除故障系统。
upstream backserver { server 192.168.0.12; server 192.168.0.13; }
2. 权重 weight
weight的值越大,分配到的访问概率越高,紧张用于后端每台做事器性能不屈衡的情形下。其次是为在主从的情形下设置不同的权值,达到合理有效的地利用主机资源。
# 权重越高,在被访问的概率越大,如上例,分别是20%,80%。upstream backserver { server 192.168.0.12 weight=2; server 192.168.0.13 weight=8; }
3. ip_hash( IP绑定)
每个要求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端做事器,并且可以有效办理动态网页存在的session共享问题
upstream backserver { ip_hash; server 192.168.0.12:88; server 192.168.0.13:80; }
4. fair(第三方插件)
必须安装upstream_fair模块。
比拟 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载韶光是非智能地进行负载均衡,相应韶光短的优先分配。
# 哪个做事器的相应速率快,就将要求分配到那个做事器上。upstream backserver { server server1; server server2; fair; }
5.url_hash(第三方插件)
必须安装Nginx的hash软件包
按访问url的hash结果来分配要求,使每个url定向到同一个后端做事器,可以进一步提高后端缓存做事器的效率。
upstream backserver { server squid1:3128; server squid2:3128; hash $request_uri; hash_method crc32; }
如何用Nginx办理前端跨域问题?
利用Nginx转发要求。把跨域的接口写成调本域的接口,然后将这些接口转发到真正的要求地址。
Nginx虚拟主机怎么配置?1、基于域名的虚拟主机,通过域名来区分虚拟主机——运用:外部网站
2、基于端口的虚拟主机,通过端口来区分虚拟主机——运用:公司内部网站,外部网站的管理后台
3、基于ip的虚拟主机。
基于虚拟主机配置域名须要建立/data/www /data/bbs目录,windows本地hosts添加虚拟机ip地址对应的域名解析;对应域名网站目录下新增index.html文件;
# 当客户端访问www.lijie.com,监听端口号为80,直接跳转到data/www目录下文件 server { listen 80; server_name www.lijie.com; location / { root data/www; index index.html index.htm; } } # 当客户端访问www.lijie.com,监听端口号为80,直接跳转到data/bbs目录下文件 server { listen 80; server_name bbs.lijie.com; location / { root data/bbs; index index.html index.htm; } }
基于端口的虚拟主机
利用端口来区分,浏览器利用域名或ip地址:端口号 访问
# 当客户端访问www.lijie.com,监听端口号为8080,直接跳转到data/www目录下文件 server { listen 8080; server_name 8080.lijie.com; location / { root data/www; index index.html index.htm; } } # 当客户端访问www.lijie.com,监听端口号为80直接跳转到真实ip做事器地址 127.0.0.1:8080 server { listen 80; server_name www.lijie.com; location / { proxy_pass http://127.0.0.1:8080; index index.html index.htm; } }
location的浸染是什么?
location指令的浸染是根据用户要求的URI来实行不同的运用,也便是根据用户要求的网站URL进行匹配,匹配成功即进行干系的操作。
location的语法能说出来吗?
把稳:~ 代表自己输入的英笔墨母
Location正则案例 # 优先级1,精确匹配,根路径 location =/ { return 400; } # 优先级2,以某个字符串开头,以av开头的,优先匹配这里,区分大小写 location ^~ /av { root /data/av/; } # 优先级3,区分大小写的正则匹配,匹配/media路径 location ~ /media { alias /data/static/; } # 优先级4 ,不区分大小写的正则匹配,所有的.jpg|gif|png 都走这里 location ~ .\.(jpg|gif|png|js|css)$ { root /data/av/; } # 优先7,通用匹配 location / { return 403; }
限流怎么做的?
Nginx限流便是限定用户要求速率,防止做事器受不了
限流有3种
正常限定访问频率(正常流量)突发限定访问频率(突发流量)限定并发连接数Nginx的限流都是基于漏桶流算法
实现三种限流算法
1、正常限定访问频率(正常流量):限定一个用户发送的要求,我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; # 绑定限流维度 server{ location/seckill.html{ limit_req zone=zone; proxy_pass http://lj_seckill; } }
1r/s代表1秒一个要求,1r/m一分钟吸收一个要求, 如果Nginx这时还有别人的要求没有处理完,Nginx就会谢绝处理该用户要求。
2、突发限定访问频率(突发流量):限定一个用户发送的要求,我Nginx多久吸收一个。
上面的配置一定程度可以限定访问频率,但是也存在着一个问题:如果突发流量超出要求被谢绝处理,无法处理活动时候的突发流量,这时候该当如何进一步处理呢?
Nginx供应burst参数结合nodelay参数可以办理流量突发的问题,可以设置能处理的超过设置的要求数外能额外处理的要求数。我们可以将之前的例子添加burst参数以及nodelay参数:
# 定义限流维度,一个用户一分钟一个要求进来,多余的全部漏掉 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m; # 绑定限流维度 server{ location/seckill.html{ limit_req zone=zone burst=5 nodelay; proxy_pass http://lj_seckill; } }
为什么就多了一个 burst=5 nodelay; 呢,多了这个可以代表Nginx对付一个用户的要求会立即处理前五个,多余的就逐步来落,没有其他用户的要求我就处理你的,有其他的要求的话我Nginx就漏掉不接管你的要求
3、 限定并发连接数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; rewrite / http://www.lijie.net permanent; } }
上面配置了单个IP同时并发连接数最多只能10个连接,并且设置了全体虚拟做事器同时最大并发数最多只能100个链接。当然,只有当要求的header被做事器处理后,虚拟做事器的连接数才司帐数。刚才有提到过Nginx是基于漏桶算法事理实现的,实际上限流一样平常都是基于漏桶算法和令牌桶算法实现的。
漏桶流算法和令牌桶算法知道?漏桶算法漏桶算法思路很大略,我们把水比作是要求,漏桶比作是系统处理能力极限,水前辈入到漏桶里,漏桶里的水按一定速率流出,当流出的速率小于流入的速率时,由于漏桶容量有限,后续进入的水直接溢出(谢绝要求),以此实现限流。
令牌桶算法
令牌桶算法的事理也比较大略,我们可以理解成医院的登记看病,只有拿到号往后才可以进行诊病。
系统会掩护一个令牌(token)桶,以一个恒定的速率往桶里放入令牌(token),这时如果有要求进来想要被处理,则须要先从桶里获取一个令牌(token),当桶里没有令牌(token)可取时,则该要求将被谢绝做事。令牌桶算法通过掌握桶的容量、发放令牌的速率,来达到对要求的限定。
Nginx配置高可用性怎么配置?
当上游做事器(真实访问做事器),一旦涌现故障或者是没有及时相应的话,该当直接轮训到下一台做事器,担保做事器的高可用
Nginx配置代码:
server { listen 80; server_name www.lijie.com; location / { ### 指定上游做事器负载均衡做事器 proxy_pass http://backServer; ###nginx与上游做事器(真实访问的做事器)超时时间 后端做事器连接的超时时间_发起握手期待相应超时时间 proxy_connect_timeout 1s; ###nginx发送给上游做事器(真实访问的做事器)超时时间 proxy_send_timeout 1s; ### nginx接管上游做事器(真实访问的做事器)超时时间 proxy_read_timeout 1s; index index.html index.htm; } }
Nginx怎么判断别IP不可访问?
# 如果访问的ip地址为192.168.9.115,则返回403 if ($remote_addr = 192.168.9.115) { return 403; }
在nginx中,如何利用未定义的做事器名称来阻挡处理要求?
只需将要求删除的做事器就可以定义为:
做事器名被保留一个空字符串,他在没有主机头字段的情形下匹配要求,而一个分外的nginx的非标准代码被返回,从而终止连接。
怎么限定浏览器访问? ## 不许可谷歌浏览器访问 如果是谷歌浏览器返回500 if ($http_user_agent ~ Chrome) { return 500; }
Rewrite全局变量是什么?
$remote_addr //获取客户端ip$binary_remote_addr //客户端ip(二进制)$remote_port //客户端port,如:50472$remote_user //已经经由Auth Basic Module验证的用户名$host //要求主机头字段,否则为做事器名称,如:blog.sakmon.com$request //用户要求信息,如:GET ?a=1&b=2 HTTP/1.1$request_filename //当前要求的文件的路径名,由root或alias和URI request组合而成,如:/2013/81.html$status //要求的相应状态码,如:200$body_bytes_sent // 相应时送出的body字节数数量。纵然连接中断,这个数据也是精确的,如:40$content_length // 即是要求行的“Content_Length”的值$content_type // 即是要求行的“Content_Type”的值$http_referer // 引用地址$http_user_agent // 客户端agent信息,如:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36$args //与$query_string相同 即是当中URL的参数(GET),如a=1&b=2$document_uri //与$uri相同 这个变量指当前的要求URI,不包括任何参数(见$args) 如:/2013/81.html$document_root //针对当前要求的根路径设置值$hostname //如:centos53.localdomain$http_cookie //客户端cookie信息$cookie_COOKIE //cookie COOKIE变量的值$is_args //如果有$args参数,这个变量即是”?”,否则即是”",空值,如?$limit_rate //这个变量可以限定连接速率,0表示不限速$query_string // 与$args相同 即是当中URL的参数(GET),如a=1&b=2$request_body // 记录POST过来的数据信息$request_body_file //客户端要求主体信息的临时文件名$request_method //客户端要求的动作,常日为GET或POST,如:GET$request_uri //包含要求参数的原始URI,不包含主机名,如:/2013/81.html?a=1&b=2$scheme //HTTP方法(如http,https),如:http$uri //这个变量指当前的要求URI,不包括任何参数(见$args) 如:/2013/81.html$request_completion //如果要求结束,设置为OK. 当要求未结束或如果该要求不是要求链串的末了一个时,为空(Empty),如:OK$server_protocol //要求利用的协议,常日是HTTP/1.0或HTTP/1.1,如:HTTP/1.1$server_addr //做事器IP地址,在完成一次系统调用后可以确定这个值$server_name //做事器名称,如:blog.sakmon.com$server_port //要求到达做事器的端口号,如:80
Nginx 如何实现后端做事的康健检讨?
办法一,利用 nginx 自带模块 ngx_http_proxy_module 和 ngx_http_upstream_module 对后端节点做康健检讨。
办法二(推举),利用 nginx_upstream_check_module 模块对后端节点做康健检讨。
Nginx 如何开启压缩?开启nginx gzip压缩后,网页、css、js等静态资源的大小会大大的减少,从而可以节约大量的带宽,提高传输效率,给用户快的体验。虽然会花费cpu资源,但是为了给用户更好的体验是值得的。
开启的配置如下:
将以上配置放到nginx.conf的http{ … }节点中。
http { # 开启gzip gzip on; # 启用gzip压缩的最小文件;小于设置值的文件将不会被压缩 gzip_min_length 1k; # gzip 压缩级别 1-10 gzip_comp_level 2; # 进行压缩的文件类型。 gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; # 是否在http header中添加Vary: Accept-Encoding,建议开启 gzip_vary on;}
保存并重启nginx,刷新页面(为了避免缓存,请逼迫刷新)就能看到效果了。以谷歌浏览器为例,通过F12看要求的相应头部:
我们可以先来比拟下,如果我们没有开启zip压缩之前,我们的对应的文件大小,如下所示:
现在我们开启了gzip进行压缩后的文件的大小,可以看到如下所示:
并且我们查看相应头会看到gzip这样的压缩,如下所示
gzip压缩前后效果比拟:jquery原大小90kb,压缩后只有30kb。
gzip虽然好用,但是以下类型的资源不建议启用。
1、图片类型缘故原由:图片如jpg、png本身就会有压缩,以是就算开启gzip后,压缩前和压缩后大小没有多大差异,以是开启了反而会白白的摧残浪费蹂躏资源。(Tips:可以试试将一张jpg图片压缩为zip,不雅观察大小并没有多大的变革。虽然zip和gzip算法不一样,但是可以看出压缩图片的代价并不大)
2、大文件缘故原由:会花费大量的cpu资源,且不一定有明显的效果。
ngx_http_upstream_module的浸染是什么?ngx_http_upstream_module用于定义可通过fastcgi通报、proxy通报、uwsgi通报、memcached通报和scgi通报指令来引用的做事器组。
什么是C10K问题?C10K问题是指无法同时处理大量客户端(10,000)的网络套接字。
Nginx是否支持将要求压缩到上游?您可以利用Nginx模块gunzip将要求压缩到上游。gunzip模块是一个过滤器,它可以对不支持“gzip”编码方法的客户机或做事器利用“内容编码:gzip”来解压缩相应。
如何在Nginx中获得当前的韶光?要得到Nginx确当前韶光,必须利用SSI模块、和date_local的变量。
Proxy_set_header THE-TIME $date_gmt;
用Nginx做事器阐明-s的目的是什么?
用于运行Nginx -s参数的可实行文件。
如何在Nginx做事器上添加模块?在编译过程中,必须选择Nginx模块,由于Nginx不支持模块的运行韶光选择。
生产中如何设置worker进程的数量呢?在有多个cpu的情形下,可以设置多个worker,worker进程的数量可以设置到和cpu的核心数一样多,如果在单个cpu上起多个worker进程,那么操作系统会在多个worker之间进行调度,这种情形会降落系统性能,如果只有一个cpu,那么只启动一个worker进程就可以了。
nginx状态码499:
做事端处理韶光过长,客户端主动关闭了连接。
502:
(1).FastCGI进程是否已经启动
(2).FastCGI worker进程数是否不足
(3).FastCGI实行韶光过长
fastcgi_connect_timeout 300;fastcgi_send_timeout 300;fastcgi_read_timeout 300;(4).FastCGI Buffer不足,nginx和apache一样,有前端缓冲限定,可以调度缓冲参数
fastcgi_buffer_size 32k;fastcgi_buffers 8 32k;(5). Proxy Buffer不足,如果你用了Proxying,调度
proxy_buffer_size 16k;proxy_buffers 4 16k;(6).php脚本实行韶光过长
将php-fpm.conf的0s的0s改成一个韶光本人花费2个月韶光,整理了一套JAVA开拓技能资料,内容涵盖java根本,分布式、微做事等主流技能资料,包含大厂面经,学习条记、源码讲义、项目实战、讲解视频。
希望可以帮助一些想通过自学提升能力的朋友,领取资料,扫码关注一下
记得转发+关注+私信
私信回答【2022口试资料】
领取更多学习资料