五、nginx反向代理、负载均衡
正向代理
正向代理,架设在客户机与目标主机之间,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。正向代理的用途:
- 访问原来无法访问的资源,如Google
- 可以做缓存,加速访问资源
- 对客户端访问授权,上网进行认证
- 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
反向代理
反向代理服务器架设在服务器端,通过缓冲经常被请求的页面来缓解服务器的工作量,将客户机请求转发给内部网络上的目标服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器与目标主机一起对外表现为一个服务器。
主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息 反向代理的作用:
- 保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网
- 负载均衡,通过反向代理服务器来优化网站的负载
负载均衡
服务器接收不同客户端发送的、Nginx反向代理服务器接收到的请求数量,就是我们说的负载量。这些请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则。所以,将服务器接收到的请求按照规则分发的过程,称为负载均衡
负载均衡也分硬件负载均衡和软件负载均衡两种,我们来讲的是软件负载均衡,关于硬件
负载均衡的有兴趣的靓仔可以去了解下 负载均衡的算法:
- 轮询(默认、加权轮询、ip_hash)
- 插件(fair、url_hash),url_hash和ip_hash大同小异,一个基于ip一个基于url,就不过多介绍了
默认轮询
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某个服务器宕机,能自动剔除故障系统。
# constPolling 作为存放负载均衡的变量 upstream constPolling { server localhost:10001; server localhost:10002; } server { listen 10000; server_name localhost; location / { proxy_pass http://constPolling; #在代理的时候接入constPolling proxy_redirect default; } }
加权轮询
通过设置weight,值越大分配率越大 到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。其次是为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。
# constPolling 作为存放负载均衡的变量 upstream constPolling { server localhost:10001 weight=1; server localhost:10002 weight=2; } server { listen 10000; server_name localhost; location / { proxy_pass http://constPolling; #在代理的时候接入constPolling proxy_redirect default; } }
权重越大,被访问的概率越大,比如上面就是33.33%和百分66.66%的访问概率 访问的效果:
localhost:10001、localhost:10002、localhost:10002、localhost:10001、localhost:10002、localhost:10002
ip_hash
每个请求都根据访问ip的hash结果分配,经过这样的处理,每个访客固定访问一个后端服务,如下配置(ip_hash可以和weight配合使用),并且可以有效解决动态网页存在的session共享问题
upstream constPolling { ip_hash; server localhost:10001 weight=1; server localhost:10002 weight=2; }
fair
个人比较喜欢用的一种负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,响应时间短的优先分配。
- 安装upstream_fair模块 附上fair安装教程
- 哪个服务器的响应速度快,就将请求分配到那个服务器上
upstream constPolling { server localhost:10001; server localhost:10002; fair; }
nginx错误页面配置
error_page_404 https://www.baidu.com/
Gzip压缩
root /var/www/html/gzip; # 开启gzip压缩 gzip on; # http请求版本 gzip_http_version 1.0; # 设置什么类型的文件需要压缩 gzip_types text/css text/javascript application/javascript image/png image/jpeg image/gif;
六、nginx使用综合场景
1. 同一个域名通过不同目录指定不同项目目录
在开发过程中,有一种场景,比如有项目有多个子系统需要通过同一个域名通过不同目录去访问 在A/B Test 灰度发布等场景也会用上
比如:
访问 a.com/a/*** 访问的是a系统
访问 a.com/b/*** 访问的是b系统
2. 自动适配PC/移动端页面
3. 限制只能通过谷歌浏览器访问
4. 前端单页面应用刷新404问题
七、总结
在我们阅读完官方文档后,我们一定会进行更深层次的学习,比如看下框架底层是如何运行的,以及源码的阅读。
这里广东靓仔给下一些小建议:
- 在看源码前,我们先去官方文档复习下框架设计理念、源码分层设计
- 阅读下框架官方开发人员写的相关文章
- 借助框架的调用栈来进行源码的阅读,通过这个执行流程,我们就完整的对源码进行了一个初步的了解
- 接下来再对源码执行过程中涉及的所有函数逻辑梳理一遍