共计 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; # 禁止所有
}
文|衠灵
关注得物技术,携手走向技术的云端