什么是Nginx
Nginx 是一个轻量级/高性能的反向代理Web服务器,用于HTTP、HTTPS、SMTP、POP3和IMAP协定能够高效的反向代理、负载
平衡,能够解决高并发连贯。
为什么要用Nginx
跨平台、配置简略、方向代理、高并发连贯(解决2w-3w并发连接数,官网检测能反对5w并发)、内存耗费小(开启 10 个nginx才占
150M内存,nginx解决动态文件好,消耗内存少)
内置健康检查性能:如果一台服务器宕机,会做一个健康检查,再发送申请就不会发送到当即的服务器上,从新将申请提交到其
他节点上
节俭宽带:反对GZIP压缩,能够增加浏览器本地缓存
稳定性高:宕机的概率小,接管用户申请是异步的
为什么Nginx性能这么高
因为他的事件处理机制:异步非阻塞事件处理机制,使用了epoll模型,提供了一个队列,排队解决。
Nginx怎么解决申请的
Nginx接管到一个申请后,首先由listen和server_name指令匹配server模块,再匹配server模块里的location,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接管,nginx反向代理服务器接管到之后,依照肯定的规定分发给了后端的业务解决服务器进行解决。代理服务器代理的对象是服务端,和客户端打交道,代理服务器代理服务对申请做出解决,绝对于客户端,代理服务就是要申请的后盾服务。
应用反向代理服务器的长处是什么
应用反向代理之后,客户端只和代理服务器打交道,是感知不到后端具体的服务的,这样就相当于暗藏了后端服务的存在,避免被攻打,能够很好的爱护后端服务不被裸露。平安失去保障。
Nginx的优缺点
长处:
占用内存小,可实现高并发连贯,解决响应快
可实现http服务器、虚拟主机、方向代理、负载平衡
Nginx配置简略
能够对外不裸露正式服务器的ip地址
毛病:
解决动静⻚面没有Apache优良
Nginx的利用场景
http服务器,能够作为一个http服务器,提供http服务,用于托管咱们的动态网⻚
虚拟主机,能够实现一台服务器虚构出多个网站
反向代理,负载平衡。当网站的访问量达到肯定水平后,单台服务器不能满足用户的申请时,须要用多台服务器集群,能够应用
nginx做反向代理。并且多台服务器能够均匀分担负载,不会呈现因为某台服务器负载高宕机而某台服务器闲置的状况。
能够配置平安治理,比方应用Nginx搭建API接口网关,对每个接口服务进行拦挡。
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 } } ......}
Nginx动态资源配置
动态资源拜访就是存在nginx的html⻚面,咱们能够本人编写
如何用Nginx解决前端跨域问题
应用Nginx转发申请。把跨域的接口写成调本域的接口,而后将这些接口转发到真正的申请地址
Nginx虚拟主机怎么配置
基于虚拟主机配置域名
须要建设/data/demo /data/demo2目录,windows本地hosts增加虚拟机ip地址对应的域名解析;对应域名网站目录下新增index.html文件; #当客户端拜访www.demo.com,监听端口号为80,间接跳转到data/demo目录下文件 server { listen 80; server_name www.demo.com; location / { root data/demo; index index.html index.htm; } } #当客户端拜访www.demo2.com,监听端口号为80,间接跳转到data/demo2目录下文件 server { listen 80; server_name www.demo2.com; location / { root data/demo2; index index.html index.htm; } }
基于端口的虚拟主机
#当客户端拜访www.lijie.com,监听端口号为8080,间接跳转到data/www目录下文件 server { listen 8080; server_name www.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的语法
匹配符 | 匹配规定 | 优先级 |
---|---|---|
= | 准确匹配 | 1 |
^~ | 以某个字符串结尾 | 2 |
~ | 辨别大小写的正则匹配 | 3 |
~* | 不辨别大小写的正则匹配 | 4 |
!~ | 辨别大小写的不匹配正则 | 5 |
!~* | 不辨别大小写不匹配的正则 | 6 |
/ | 通用匹配,任何申请都会匹配到 | 7 |
location正则案例
#优先级1,准确匹配,根门路 location =/ { return 400; } #优先级2,以某个字符串结尾,以mm结尾的,优先匹配这里,辨别大小写 location ^~ /mm { root /data/mm/; } #优先级3,辨别大小写的正则匹配,匹配/media*****门路,如果是/Media****门路就不会匹配到这里 location ~ /media { alias /data/static/; } #优先级4 ,不辨别大小写的正则匹配,所有的****.jpg|gif|png 都走这里,即A.jpg和a.jpg都会被匹配到 location ~* .*\.(jpg|gif|png|js|css)$ { root /data/mm/; } #优先级5 ,辨别大小写的不匹配正则,即除了所有的****.jpg|gif|png 不走这里,其余url都能够走这里。url辨别大小写 location !~ .*\.(jpg|gif|png|js|css)$ { root /data/mm/; } #优先级6 ,不辨别大小写的不匹配正则,即除了所有的****.jpg|gif|png 不走这里,其余url都能够走这里。url不辨别大小写 location !~* .*\.(jpg|gif|png|js|css)$ { root /data/mm/; } #优先7,通用匹配 location / { return 403; }
限流怎么做
Nginx限流就是限度用户申请速度,避免服务器受不了。限流有三种:
- 失常限度拜访频率:
限度一个用户发送的申请,Nginx多久接管一个申请。Nginx中应用ngx_http_limit_req_module模块来限度拜访的频率,限度的原
理本质是基于漏桶算法原理来实现的。在nginx.conf配置文件中能够应用limit_req_zone命令以及limit_req命令限度单个ip的申请解决
频率
#定义限流维度,一个用户一分钟一个申请进来,多余的全副漏掉 limit_req_zone $binary_remote_addr mylimit=one:10m rate=1r/m; #1r/s代表1秒一个申请,1r/m一分钟接管一个申请, 如果Nginx这时还有他人的申请没有解决完,Nginx就会回绝解决该用户申请。 #绑定限流维度 server{ location /all{ limit_req zone=mylimit; proxy_pass http://localhost; } }
- 突发限度拜访频率:
限度一个用户发送的申请,Nginx多久接管一个申请。下面的配置能够肯定水平的限度访问量,然而遇到突发流量,超出申请被回绝,就无奈解决长期流动带来的突发流量。Nginx提供了burst参数联合nodelay参数能够解决突发流量的事件。能够设置能解决的超过设置的申请数外能额定解决的申请数。
#定义限流维度,一个用户一分钟一个申请进来,多余的全副漏掉 limit_req_zone $binary_remote_addr mylimit=one:10m rate=1r/m; #1r/s代表1秒一个申请,1r/m一分钟接管一个申请, 如果Nginx这时还有他人的申请没有解决完,Nginx就会回绝解决该用户申请。 #绑定限流维度 server{ location /all{ limit_req zone=mylimit burst=5 nodelay; #burst=5 nodelay 代表Nginx对于一个用户的申请会立刻解决前五个,多余的就慢慢来落,没有其余用户的申请我就解决你的,有其余的申请的话我Nginx就漏掉不承受你的申请 proxy_pass http://localhost; } }
- 限度并发连接数:
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.demo.com permanent; } } #下面配置了单个IP同时并发连贯数最多只能10个连贯,并且设置了整个虚构服务器同时最大并发数最多只能100个链接。当然,只有当申请的header被服务器解决后,虚构服务器的连接数才会计数。
为什么要做动静拆散
Nginx的动态解决能力很强,动静⻚面的解决能力却比拟单薄,做动静拆散,让动态资源只走动态服务器,动静资源只走动静服务
器,充分发挥Nginx弱小的动态解决能力,把不擅⻓的动静解决交给动静的服务器进行解决。
Nginx负载平衡的算法怎么实现的,策略有哪些
客户端将申请全副发送至Nginx,由Nginx再转发给具体的服务器做解决,Nginx负载平衡有 5 种策略:
轮询
每个申请依照申请程序逐个调配到后端的服务器上,如果后端服务器集群有机器宕机,则会主动剔除故障机器。这
种也是Nginx默认的负载平衡策略
upstream backserver { server 172.0.0.12; server 172.0.0.13; }
权重
依据weight的值进行比例的调配,也就是weight的值越大,拜访到的几率也就越大。次要用于后端集群中服务器性
能之间差别不可疏忽的时候,为了充分利用服务器资源,能够依据性能调配不同的权重。
upstream backserver { server 172.0.0.12 weight=2; server 172.0.0.13 weight=8; }
ip_hash
也叫ip绑定,也就是同一个ip的申请都会被转发到同一个后端服务器上,这种策略还能够无效解决动静⻚面之间的
session共享问题
upstream backserver { ip_hash; server 172.0.0.12:88; server 172.0.0.13:80; }
fair(第三方插件)
必须装置upstream_fai
模块,比照 weight、ip_hash更加智能的负载平衡算法,fair算法能够依据⻚面大小和加载工夫⻓短智能地进行负载平衡,响应工夫短的优先调配。
upstream backserver { server server1; server server2; fair; }
url_hash(第三方插件)
必须装置Nginx的hash软件包,按拜访url的hash后果来调配申请,使每个url定向到同一个后端服务器,能够进一步提高后端缓存服务器的效率。
upstream backserver { server squid1:3128; server squid2:3128; hash $request_uri; hash_method crc32; }
Nginx怎么实现高并发的
Nginx采纳了单线程多过程和多路I/O复用的模型(epoll),并发事件驱动的服务器。基于多过程和多路I/O复用模型epoll,便实
现了Nginx的高并发。
在Nginx中,如何应用未定义的服务器名称来阻止解决申请
server{ listen: 80; server_name: ""; return 444;}# 这里服务器名被保留为一个空字符串,他将在没有主机头的状况下匹配申请,而被返回一个非凡的Nginx非标准代码444,从而终止连贯。
请解释Nginx如何解决HTTP申请(能够肯定水平的答复Nginx怎么实现高并发)
Nginx 是一个高性能的 Web 服务器,可能同时解决大量的并发申请。它联合多过程机制和异步机制 ,异步机制应用的是异步非阻塞形式 。
1、多过程机制
服务器每当收到一个客户端时,就有 服务器主过程 ( master process )生成一个 子过程( worker process )进去和客户端建设连贯进行交互,直到连贯断开,该子过程就完结了。
应用过程的益处是各个过程之间互相独立,不须要加锁,缩小了应用锁对性能造成影响,同时升高编程的复杂度,升高开发成本。其次,采纳独立的过程,能够让过程相互之间不会影响 ,如果一个过程产生异样退出时,其它过程失常工作, master 过程则很快启动新的 worker 过程,确保服务不会中断,从而将危险降到最低。
毛病是操作系统生成一个子过程须要进行 内存复制等操作,在资源和工夫上会产生肯定的开销。当有大量申请时,会导致系统性能降落 。
2、异步非阻塞机制
每个工作过程 应用 异步非阻塞形式 ,能够解决 多个客户端申请 。
当某个 工作过程 接管到客户端的申请当前,调用 IO 进行解决,如果不能立刻失去后果,就去 解决其余申请 (即为 非阻塞 );而 客户端 在此期间也 无需期待响应 ,能够去解决其余事件(即为 异步 )。
当 IO 返回时,就会告诉此 工作过程 ;该过程失去告诉,临时 挂起 以后解决的事务去 响应客户端申请 。
请解释Nginx服务器上的Master和Worker过程别离是什么
Master过程:读取及评估配置和维持。通过for循环接管和解决内部信号
Worker过程:解决申请,主过程Master通过fork()生成worker()子过程,每一个子过程用for()循环来实现Nginx服务器对事件的接管和解决
请解释你如何通过不同于 80 的端口开启Nginx
为了通过一个不同于 80 的端口开启Nginx,你必须进入/etc/Nginx/sites-enabled/,如果这是默认文件,那么你必须关上名为
“default”的文件。编辑文件,并搁置在你想要的端口:
Like server { listen 81; }
请解释是否有可能将Nginx的谬误替换为 502 谬误、 503
502 =谬误网关
503 =服务器超载
有可能,然而您能够确保fastcgi_intercept_errors被设置为ON,并应用谬误页面指令。
location / { fastcgi_pass 172.0.0.1:8080; fastcgi_intercept_errors on; error_page 502 =503/error_page.html}
在Nginx中,解释如何在URL中保留双斜线
要在URL中保留双斜线,就必须应用merge_slashes_off;
语法:merge_slashes [on/off]
默认值: merge_slashes on
环境: http,server
请解释ngx_http_upstream_module的作用是什么
ngx_http_upstream_module用于定义可通过fastcgi传递、proxy传递、uwsgi传递、memcached传递和scgi传递指令来援用的
服务器组。
请解释什么是C10K问题
C10K问题是指无奈同时解决大量客户端(10,000)的网络套接字。
请陈说stub_status和sub_filter指令的作用是什么
Stub_status指令:该指令用于理解Nginx以后状态的以后状态,如以后的流动连贯,承受和解决以后读/写/期待连贯的总数;
Sub_filter指令:它用于搜寻和替换响应中的内容,并疾速修复古老的数据;
解释Nginx是否反对将申请压缩到上游
您能够应用Nginx模块gunzip将申请压缩到上游。gunzip模块是一个过滤器,它能够对不反对“gzip”编码方法的客户机或服务
器应用“内容编码:gzip”来解压缩响应。
解释如何在 Nginx 中取得以后的工夫
要取得Nginx的以后工夫,必须应用SSI模块、$date_gmt和$date_local的变量。
Proxy_set_header THE-TIME $date_gmt;
用 Nginx 服务器解释-s 的目标是什么
用于运行Nginx -s参数的可执行文件。
解释如何在 Nginx 服务器上增加模块
在编译过程中,必须抉择Nginx模块,因为Nginx不反对模块的运行工夫抉择。
本文由博客群发一文多发等经营工具平台 OpenWrite 公布