【腾讯⾯试题】Nginx
什么是Nginx?
Nginx是⼀个轻量级/⾼性能的反向代理Web服务器,实现⾮常⾼效的反向代理、负载均衡,可以处理2-3万并发连接数,官⽅监测能⽀持5万并发,现在中国使⽤Nginx⽹站有很多,例如:新浪,⽹易,腾讯等。
为什么要⽤Nginx?
跨平台、配置简单、反向代理、⾼并发连接:处理2-3万并发连接数,官⽅检测能⽀持5万并发,内存消耗少:开启10个Nginx才占150M内存,nginx处理静态⽂件好,耗费内存少。
Nginx内置的健康检查功能:如果有⼀个服务器宕机,会做⼀个健康检查,再发送请求就不会发送到宕机的服务器了,⽽是重新将请求提交到其他节点上。
使⽤Nginx的话还能:
节省宽带:⽀持GZIP压缩,可以添加浏览器本地缓存
稳定性⾼:宕机的概率⾮常⼩
接受⽤户请求是异步的
为什么Nginx性能这么⾼?
Nginx事件处理机制:异步⾮阻塞事件处理机制,运⽤了epoll模型,提供了⼀个队列,排队解决
Nginx怎么处理请求?
Nginx接收⼀个请求后,⾸先由listen和server_name指令匹配server模块,再匹配server模块⾥的location,location就是实际地址。
server {# 第⼀个Server区块开始,表⽰⼀个独⽴的虚拟主机站点
listen 80;# 提供服务的端⼝,默认80
server_name localhost;# 提供服务的域名主机名
location / {# 第⼀个location区块开始
root html;# 站点的根⽬录,相当于Nginx的安装⽬录
index index.html index.htm;# 默认的⾸页⽂件,多个⽤空格分开
}# 第⼀个location区块结果
正向代理和反向代理
正向代理就是⼀个⼈发送⼀个请求直接就到达了⽬标的服务器
反⽅代理就是请求统⼀被Nginx接收,nginx反向代理服务器接收到之后,按照⼀定的规 则分发给了后端的业务处理服务器进⾏处理了使⽤反向代理服务器的优点是什么
反向代理服务器可以隐藏源服务器的存在和特征。它充当互联⽹云和web服务器之间的中间层。这对于安全⽅⾯来说是很好的,特别是当您使⽤web托管服务时。
Nginx的优缺点?
优点
内存占⽤少,可实现⾼并发连接,处理响应快
可实现Http服务器、虚拟主机、反向代理、负载均衡
配置简单
可以不暴露正式的服务器IP地址
缺点:动态处理差,Nginx处理静态⽂件较好,耗费内存⼩,但处理动态页⾯则很鸡肋,现在⼀般前端⽤Nginx作为反向代理
Nginx应⽤场景
1. Http服务器。Nginx是⼀个Http服务器,可以独⽴提供Http服务,可以作为⽹页静态服务器。
2. 虚拟主机。可以实现⼀台服务器虚拟出多个⽹站,例如个⼈⽹站使⽤的虚拟机。
3. 反向代理,负载均衡。当⽹站的访问量达到⼀定程度后,单台服务器不能满⾜⽤户的请求时,需要⽤多台服务器集可以使⽤nginx做
反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载⾼宕机⽽某台服务器闲置的情况。
4. nginx 中也可以配置安全管理、⽐如可以使⽤Nginx搭建API接⼝⽹关,对每个接⼝服务进⾏拦截。
Nginx⽬录结构有哪些?
[root@localhost ~]# tree /usr/local/nginx
/usr/local/nginx
├── client_body_temp
├── conf # Nginx所有配置⽂件的⽬录
│├── f # fastcgi相关参数的配置⽂件
│├── f.default # f的原始备份⽂件
│├── fastcgi_params # fastcgi的参数⽂件
│├── fastcgi_params.default
│├── koi-utf
│├── koi-win
│├── pes # 媒体类型
│├── pes.default
│├── f # Nginx主配置⽂件
│├── f.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配置⽂件f有哪些属性模块?
worker_processes 1;# worker进程的数量
events {# 事件区块开始
worker_connections 1024;# 每个worker进程⽀持的最⼤连接数
}# 事件区块结束
http {# HTTP区块开始
include pes;# 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虚拟主机怎么配置?
1、基于域名的虚拟主机,通过域名来区分虚拟主机——应⽤:外部⽹站
2、基于端⼝的虚拟主机,通过端⼝来区分虚拟主机——应⽤:公司内部⽹站,外部⽹站的管理后台
3、基于ip的虚拟主机。
基于虚拟主机配置域名
需要建⽴/data/www,/data/bbs⽬录,windows本地hosts添加虚拟机ip地址对应的域名解析;对应域名⽹站⽬录下新增index.html⽂件;
#当客户端访问www.lijie,监听端⼝号为80,直接跳转到data/www⽬录下⽂件
server {
listen 80;
server_name www.lijie;
location / {
root data/www;
index index.html index.htm;
}
}
#当客户端访问www.lijie,监听端⼝号为80,直接跳转到data/bbs⽬录下⽂件
server {
listen 80;
server_name bbs.lijie;
location / {
root data/bbs;
index index.html index.htm;
}
}
基于端⼝的虚拟主机
使⽤端⼝来区分,浏览器使⽤域名或ip地址:端⼝号 访问
#当客户端访问www.lijie,监听端⼝号为8080,直接跳转到data/www⽬录下⽂件
server {
listen 8080;
server_name 8080.lijie;
location / {
root data/www;
index index.html index.htm;
}
}
#当客户端访问www.lijie,监听端⼝号为80直接跳转到真实ip服务器地址 127.0.0.1:8080
server {
listen 80;
server_name www.lijie;
location / {
proxy_pass 127.0.0.1:8080;
index index.html index.htm;
}
}
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 / {
nginx部署前端项目return 403;
}
三种限流算法
1.正常限制访问频率(正常流量)
限制⼀个⽤户发送的请求,Nginx多久接收⼀个请求。
Nginx中使⽤ngx_http_limit_req_module模块来限制的访问频率,限制的原理实质是基于漏桶算法原理来实现的。在f配置⽂件中可以使⽤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 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 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 / www.lijie permanent;
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论