平时咱们在工作之中,遇到的许多问题其实都是与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; # 禁止所有
}
文|衠灵
关注得物技术,携手走向技术的云端
发表回复