龙行博客

走路看风景,经历看人生,岁月留痕迹,人生留轨迹,17的历史,18的豪情,时间的匆忙,人生的风景,放开心胸往前走,成功再远行,放开理想往前走,梦想再行动。
现在位置:首页 > 编程语言 > PHP > Nginx反向代理研究

Nginx反向代理研究

龙行    PHP    2019-6-5    464    0评论    本文已被百度收录点击查看详情

   为了更进一步认识Nginx成为好机友,借助互联网,咱们进行了一次深入探讨

   研究反向代理那就肯定还有个正向代理 “正向代理”,“反向代理”


理解了什么是“代理”,离我们理解什么是“反向代理”就只差“反向”两个字了,与“反向”相对的,就是“正向”,本质上来讲,代理都是存在于Client和Server之间,但是由于性质不同,所以也分为这两种。在这一个部分,我们将会学习,什么是反向代理,什么是正向代理。
直观的以两个例子去理解什么是正向代理和反向代理。假设由A、B和C三人,他们之间存在借钱的关系。
对于正向代理,理解起来就是:
A需要钱,A知道C由很多钱,想向C借钱
但是A和C有矛盾,于是A想到通过B去借C借钱
B向C借到钱了,C不知道是A的存在
这样B就帮助A借到了Z的钱
在这个过程,B就充当了代理借钱的角色,并且是代替A去借钱的,这样就是正向代理。
接着是反向代理:
A需要钱,C有很多钱,A不知道C很多钱
A找B借钱
B知道C有很多钱
B向C借钱,并把借到的钱给A,而没有使用自己的钱借给A
A拿到钱以后,以为钱是B的,A不知道C的存在
在这个过程当中,B也充当了代理借钱的角色,不过这次不是代替A去借的,而是用C的钱借给A的,换言之即是代替C将钱借给了A,这就是反向代理。
在例子里面,把A换成Client,把C换成Server,就是计算机的例子了。
两者区别
服务对象不同
正向代理,代理的是客户端,也就是例子中的A,服务端不知道实际发起请求的客户端
反向代理,代理的是服务端,也就是例子中的C,客户端不知道实际提供服务的服务端
安全模型不同
正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此必须采取安全措施以确保仅为授权的客户端提供服务
反向代理都对外都是透明的,访问者并不知道自己访问的是代理,访问者不知道服务节点的存在,认为处理请求的就是代理节点
总而言之,正向代理是从客户端的角度出发,服务于局域网用户,以访问非特定的服务,其中最典型的例子就是翻墙;反向代理正好与此相反,从服务端的角度出发,服务于所有用户,隐藏实际的服务节点,服务节点的架构对用户透明,以代理节点统一对外服务。
Nginx配置反向代理
(文末附完整nginx.conf配置)
为了演示Server节点, 我们使用Django快速启动一个项目,可以快速验证反向代理的配置是否ok。
django-admin startproject server1
接着我们启动一个内网地址,端口为8080。
python manage.py runserver 127.0.0.1:8080
接着配置Nginx,在Nginx的配置里面,主要是upstream块,和server块。
upstream httpserver{
server 127.0.0.1:8080;
}
然后在server块配置转发到upstream。
location / {
proxy_pass http://httpserver;
}
如此,便完成反向代理的配置,接着通过命令nginx -s reload重新加载配置文件即可。若存在多个Server节点,在upstream域添加多个Server的地址即可。
我们另起一个django项目,服务启动在8081端口。
接着更新upstream的配置。
upstream httpserver{
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
就可以完成两个节点的反向代理。
Nginx代理中的负载均衡
提到Nginx的反向代理,不得不提的就是Nginx的负载均衡,Nginx支持丰富的负载均衡算法,以提高使用Nginx部署的服务的综合性能。
在介绍负载均衡之前,我们先来看为什么需要负载均衡。
为什么需要负载均衡
需要负载均衡的一个最简单的诉求就是由Proxy代理的多个Server节点的性能并不完全相等的,也即是不同Server节点,他们处理请求的速度和容量都不相同,这就要求Proxy在转发的时候,能够因Server而异,给不同Server转发适合其处理性能的请求量,以防Server节点低负载浪费资源,或者过高负载引起宕机。
其次就是如果没有负载均衡算法,我们就无法避免很多请求被调度到一个Server节点从而把这个Server节点压垮的情况发生,因为我们没有一种机制保证不同Server节点所处理的请求量数均匀的或者是合理的。
负载均衡的算法
对服务器性能的考究有很多变量需要去关注:包括CPU的核数和频率、内存的容量速度、网络的质量、内核最大文件描述符、服务器的其他服务影响等等,因此在负载均衡算法上,也是非常丰富的,以下是几种常见的负载均衡算法。
随机算法
随机,顾名思义,就是随机概率的调度,每一个请求通过随机算法调度到不同的服务器,若调用量越大,不同服务器处理的请求数就越平均。
这种算法看是公平的,但是没有考虑到不同节点性能的差异,同时对随机算法也有一定的要求,要求随机算法在大量的随机事件后能够得到一个均匀的随机结果。
轮询算法
轮询算法也非常容易理解,请求到来的时候,按顺序把每个请求转发到多个Server节点当中,保证每个服务节点所处理的请求量都是均匀的。
虽然这种算法很公平,但是没有考虑到不同节点性能的差异。
最少连接算法
在多个服务器当中,优先将请求调度到处理连接数少的服务器上,即使每台服务器的处理能力各不相同,也能够在一定程度上降低服务器的负载。
这种算法能够考虑不同节点性能之间的差异,处理连接数在一定程度上能够反映其性能的差异,不过并非绝对,在一些条件下,其他原因也可限制处理连接数,比如网络性能、带宽压力等等。
权重轮询算法
这种算法要求在转发节点配置Server的时候,添加Server节点的权重信息,以表示不同Server节点的处理性能,在转发节点转发请求的时候,将按照权重的大小来分配转发的流量。
这种算法可以合理的转发请求,开发人员可以按照Server节点的性能参数、部署的服务来修改Server节点的权重,使得每一个Server节点都能够得到最合理的使用。
当然,除了开发人员手动配置权重以外,更为智能的一种方式是由代理的Server节点主动上报自己的能力,转发节点在接收到相关信息的时候再权衡不同Server节点的能力,按照权重进行转发。这样就不用人工介入,提高效率。不过这种方式对转发节点和Server节点都有一定的要求,需要开发者去开发相关的逻辑。
使用Nginx配置负载均衡
理解不同的负载均衡算法以后,接下来就是对Nginx配置负载均衡了。Nginx支持普通轮询算法和权重轮询算法的负载均衡配置。
轮询算法的负载均衡
其实基于普通轮询算法的负载均衡,在前面我们已经实现了,只不过当时重点不在负载均衡,所以没有提及。
upstream httpserver{
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
这就是轮询算法的负载均衡的配置,在upstream配置块的多个server节点默认都有权重weight=1,也即是每个服务节点权重一样了。
权重轮询算法的负载均衡
在普通轮询算法的基础上,我们可以进行权重轮询算法的配置,配置如下:
upstream httpserver{
server 127.0.0.1:8080 weight=5; # 权重为5
server 127.0.0.1:8081 weight=2; # 权重为2
server 127.0.0.1:8082; # 默认权重为1
}
如此添加weight关键字即可,接着你就可以在日志中看到,请求大致会以5:2:1的比例落到三个server中,这就是权重轮询算法的负载均衡。
总结
Nginx是一个高性能的部署服务端。支持HTTP部署、代理和反向代理、负载均衡、邮件服务等丰富的功能,是非常出色的一款软件,本文介绍了反向代理和负载均衡的概念,并介绍了使用Nginx配置反向代理和负载均衡的过程,希望看完这篇文章,大家对Nginx和相关概念有进一步的理解。
最后打个小广告,实战课程《Django 2.0+微信小程序打造个人助手》,除了使用Django和微信小程序这两款热门技术去开发个人助手以外,针对Django的服务高可用部署等知识点也有详细的介绍,感兴趣的同学可以参加学习,我们一起来探讨哦。
附:最简单Nginx的完整配置
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 768;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
upstream httpserver {
server 127.0.0.1:8080 weight=5;
server 127.0.0.1:8081 weight=2;
}
server {
listen 80;
server_name .dongcia.com;
charset utf-8;
location / {
proxy_pass http://httpserver;
}
}
}
评论一下 分享本文 赞助站长

赞助站长X

扫码赞助站长
联系站长
龙行博客
  • 版权申明:此文如未标注转载均为本站原创,自由转载请表明出处《龙行博客》。
  • 本文网址:https://www.liaotaoo.cn/237.html
  • 上篇文章:SQL语句性能优化
  • 下篇文章:php雪花算法SnowFlake生成唯一ID
  • php
挤眼 亲亲 咆哮 开心 想想 可怜 糗大了 委屈 哈哈 小声点 右哼哼 左哼哼 疑问 坏笑 赚钱啦 悲伤 耍酷 勾引 厉害 握手 耶 嘻嘻 害羞 鼓掌 馋嘴 抓狂 抱抱 围观 威武 给力
提交评论

清空信息
关闭评论
快捷导航
联系博主
在线壁纸
给我留言
四四五五
音乐欣赏
返回顶部