关于前端:得物技术谈谈前端工程师要知道的Nginx知识

30次阅读

共计 4775 个字符,预计需要花费 12 分钟才能阅读完成。

平时咱们在工作之中,遇到的许多问题其实都是与 Nginx 无关的问题,例如 跨域问题、申请过滤、配置 gzip、负载平衡、或者与动态资源服务器无关等等的问题。

尽管 nginx 个别都由运维配置,咱们不会间接配置,然而理解它在咱们线上程序中所起到的作用,并且可能晓得如何排查问题,也是十分重要的。

那么 nginx 到底是什么呢?

一、什么是 Nginx

Nginx 是一款轻量级的 Web 服务器、反向代理服务器,因为它的内存占用少,启动极快,高并发能力强,在互联网我的项目中广泛应用。

上图大略形容了 Nginx 在整个浏览拜访中起到的作用,有一点像入口网关。Nginx 其实就是一个高性能的反向代理服务器,那么什么是反向代理,什么是正向代理呢?

1. 正向代理

因为防火墙的起因,咱们不能间接拜访 www.google.com , 所以咱们须要借助 vpn 来实现这次拜访。通过这个例子,咱们能发现,所谓的正向代理,代理的是客户端,客户端晓得他拜访的指标到底是什么,但对于指标服务端来说,并不知道本人收到的是来自代理的拜访还是来自实在客户端的拜访。

官网解释如下:

是一个位于客户端和原始服务器 (origin server) 之间的服务器,为了从原始服务器获得内容,客户端向代理发送一个申请并指定指标(原始服务器),而后代理向原始服务器转交申请并将取得的内容返回给客户端。客户端能力应用正向代理。

2. 反向代理

从图中咱们能够看出,咱们从外网拜访 www.baidu.com 的时候,会进行一个转发,代理到内网。因而反向代理其实代理的是服务器端,这一个过程对于客户端来说是通明的。

官网解释如下:

反向代理服务器位于用户与指标服务器之间,然而对于用户而言,反向代理服务器就相当于指标服务器,即用户间接拜访反向代理服务器就能够取得指标服务器的资源。

二、Nginx 的根本配置

下图是 nginx 配置文件的根本构造:

其中:

  • main:nginx 的全局配置,对全局失效
  • events:配置影响 nginx 服务器或与用户的网络连接
  • http:能够嵌套多个 server,配置代理,缓存,日志定义等等性能,还能配置第三方模块的配置。
  • upstream:配置后端服务器的具体地址,与负载平衡非亲非故
  • server:配置虚拟主机的相干参数,一个 http 中能够有多个 server
  • location:配置申请的路由,以及各种页面的解决状况

内置变量

三、跨域问题

1. 跨域的定义

浏览器出于平安思考,有同源策略。也就是说,如果协定、域名或者端口有一个不同就是跨域。

2. Nginx 是怎么解决跨域

eg.
• 前端 server 的域名:fast.dewu.com
• 后端 server 的域名:app.dewu.com

如果没有代理,那么在 fast.dewu.com 对 app.dewu.com 发动申请肯定会产生跨域问题。

如果使 Nginx 用代理将 serve_name 设置成 fast.dewu.com,而后设置相应的 location 拦挡前端须要跨域的申请,最初将申请代理回 app.dewu.com。配置如下:

{ 
    listen 80; 
    server_name fast.dewu.com; 
    location / {proxy_pass app.dewu.com;} 
    }

将这样 fast.dewu.com 拜访 nginx 的 fast.dewu.com 属于同源拜访,而 nginx 对服务端转发的申请不会触发浏览器的同源策略。

四、申请过滤

1. 状态码过滤

error_page 500 501 502 503 504 506 /50x.html; 
location = /50x.html { 
  #将跟门路改编为寄存 html 的门路。root /root/static/html; 
}
 

50x 就是谬误状态码的显示页面,前面是寄存具体 html 的地址。

2. 依据 URL 名称过滤

location / {rewrite  ^.*$ /index.html  redirect;}

rewrite 的指令是这样的:

rewrite regex replacement [flag];

这里应用了正则来匹配申请的 url,如果匹配胜利,则应用 replacement 来更改 url。最初的 redirect 示意返回 302 长期重定向。

所以这里示意的是精准匹配 URL,不匹配的 URL 全副重定向到主页。

3. 申请类型过滤

if ($request_method !~ ^(GET|POST|HEAD)$ ) {return 403;}

五、配置 gzip

1. 什么是 gzip

gzip 是 GNUzip 的缩写,最早用于 UNIX 零碎的文件压缩。HTTP 协定上的 gzip 编码是一种用来改良 web 应用程序性能的技术,web 服务器和客户端(浏览器)必须独特反对 gzip。目前支流的浏览器,Chrome,firefox,IE 等都反对该协定。常见的服务器如 Apache,Nginx,IIS 同样反对 gzip。

gzip 压缩比率在 3 到 10 倍左右,能够大大节俭服务器的网络带宽。而在理论利用中,并不是对所有文件进行压缩,通常只是压缩动态文件。

2. 开启 gzip 的体现

申请头

响应头

3. nginx 配置

server{ 
gzip on; # 用于开启或 敞开 gzip 模块 
gzip_buffers 32 4K; # 设置零碎获取几个单位的缓存用于存储 gzip 的压缩后果数据流。gzip_comp_level 6; # 压缩级别,1-10,数字越大压缩的越好,压缩级别越高压缩率越大,压缩工夫越长。gzip_min_length 100; # 设置容许压缩的页面最小字节数,页面字节数从相应音讯头的 Content-length 中进行获取。gzip_types application/javascript text/css text/xml; gzip_disable "MSIE [1-6]\."; # IE6 对 Gzip 不敌对,对 Gzip(能够通过该指令对一些特定的 User-Agent 不应用压缩性能)gzip_proxied on: # 用于设置启用或禁用从代理服务器上收到相应内容 gzip 压缩。gzip_http_version 1.1; # 辨认 HTTP 协定版本,其值能够是 1.1 或 1.0 
gzip_proxied : off; # 用于设置启用或禁用从代理服务器上收到相应内容 gzip 压缩。gzip_vary on; # 用于在响应音讯头中增加 Vary:Accept-Encoding, 使代理服务器依据申请头中的 Accept-Encoding 辨认是否启用 gzip 压缩
}

六、负载平衡

1. 什么是负载平衡

负载平衡是高可用网络基础架构的要害组件,通常用于将工作负载散布到多个服务器来进步网站、利用、数据库或其余服务的性能和可靠性。

一个没有负载平衡的 web 架构相似上面这样:

在这里用户是直连到 web 服务器,如果这个服务器宕机了,那么用户天然也就没方法拜访了。另外,如果同时有很多用户试图拜访服务器,超过了其能解决的极限,就会呈现加载速度迟缓或根本无法连贯的状况。

而通过在后端引入一个负载均衡器和至多一个额定的 web 服务器,能够缓解这个故障。通常状况下,所有的后端服务器会保障提供雷同的内容,以便用户无论哪个服务器响应,都能收到统一的内容。

2. nginx 如何实现负载平衡

Upstream 指定后端服务器地址列表

upstream balanceServer {
    server 10.1.22.33:12345;
    server 10.1.22.34:12345;
    server 10.1.22.35:12345;
}

在 server 中拦挡响应申请,并将申请转发到 Upstream 中配置的服务器列表。

server { 
      server_name fe.server.com; 
      listen 80; 
      location /api {proxy_pass http://balanceServer;}
    }

3. 负载平衡的策略

(1)轮询策略(默认)

将所有客户端申请轮询调配给服务端。这种策略是能够失常工作的,然而如果其中某一台服务器压力太大,呈现提早,会影响所有调配在这台服务器下的用户。
代码如上。

(2) 最小连接数策略

将申请优先调配给压力较小的服务器,它能够均衡每个队列的长度,并防止向压力大的服务器增加更多的申请。

upstream balanceServer { 
  least_conn; 
  server 10.1.22.33:12345; 
  server 10.1.22.34:12345; 
  server 10.1.22.35:12345; 
  }

(3) 权重策略

指定不同 ip 的权重,权重与拜访比成正相干,权重越高,拜访越大,实用于不同性能的机器。

upstream balanceServer {
    server 192.168.0.1 weight=2;
    server 192.168.0.2 weight=8;
}

(4) 客户端 ip 绑定 ip_hash

来自同一个 ip 的申请永远只调配一台服务器,无效解决了动静网页存在的 session 共享问题。

upstream balanceServer {
    ip_hash;
    server 10.1.22.33:12345;
    server 10.1.22.34:12345;
    server 10.1.22.35:12345;
}

(5) 最快响应工夫策略 fair(第三方)

会将申请优先调配给相应最快的服务器,这种形式须要依赖到第三方插件 nginx-upstream-fair

upstream balanceServer {
    fair;
    server 10.1.22.33:12345;
    server 10.1.22.34:12345;
    server 10.1.22.35:12345;
}

(6) url_hash(第三方)

按拜访 url 的 hash 后果来调配申请,使每个 url 定向到同一个后端服务器,后端服务器为缓存时比拟无效。

upstream balanceServer { 
  hash $request_uri; 
  server 192.168.244.1:8080; 
  server 192.168.244.2:8080; 
  server 192.168.244.3:8080; 
  server 192.168.244.4:8080; 
  }

4. 健康检查

Nginx 自带 ngx_http_upstream_module(衰弱检测模块)实质上服务器心跳的查看,通过定期轮询向集群里的服务器发送健康检查申请, 来查看集群中是否有服务器处于异样状态。

如果检测出其中某台服务器异样, 那么在通过客户端申请 nginx 反向代理进来的都不会被发送到该服务器上(直至下次轮训健康检查失常)。

upstream balanceServer{ 
  server 192.168.0.1 max_fails=1 fail_timeout=40s; 
  server 192.168.0.2 max_fails=1 fail_timeout=40s; 
  } 
  
server {  
  listen 80; 
  server_name localhost; 
  location / {proxy_pass http://balanceServer;} 
}

波及两个配置:fail_timeout : 设定服务器被认为不可用的时间段以及统计失败尝试次数的时间段,默认为 10s max_fails : 设定 Nginx 与服务器通信的尝试失败的次数,默认为:1 次。

七、动态资源服务器

location ~* \.(png|gif|jpg|jpeg)$ { 
  root  /root/static/; 
  autoindex on; 
  access_log off; 
  expires 10h;# 设置过期工夫为 10 小时 
 }

匹配以 png|gif|jpg|jpeg 为结尾的申请,并将申请转发到本地门路,root 中指定的门路即 nginx 本地门路。同时也能够进行一些缓存的设置。

八、拜访权限管制

能够配置 nginx 白名单,规定哪些 ip 能够拜访服务器。

location / {
        allow  192.168.0.1;  # 容许该 ip 拜访
        deny   all;  # 禁止所有
    }

文|衠灵

关注得物技术,携手走向技术的云端

正文完
 0