Nginx正反向代理商和负载均衡

作者 : 开心源码 本文共4916个字,预计阅读时间需要13分钟 发布时间: 2022-05-11 共76人阅读

1.Nginx正向代理商和反向代理商

有很多同学都分不清正向代理商和反向代理商,下面我尽量使用浅显易懂的文字指出二者的区别。首先需要明白代理商的意思,代理商是指受委托代表当事人从事某种活动。正向代理商就是平常说的代理商(比方Shadowsocks就是正向代理商),是指Nginx代理商服务器受用户端委托代理商用户端,转发请求,并将从服务端取得的响应返回给用户端;反向代理商是指Nginx代理商服务器受服务端的委托代理商服务端,作为集群的web节点,反向代理商一般和负载均衡配合用。一言以蔽之:正向代理商,代理商端代理商的是用户端;反向代理商,代理商端代理商的是服务端。见下图:

Nginx正反向代理商和负载均衡

nginx做反向代理商时根据不同的配置策略,能进行不同的转发,比方图片结尾的走文件服务器,动态页面走web服务器,而且能判断被分发的服务器的状态,假如存在异常将转发给其它服务器。

2.负载均衡

负载均衡的实现必需依赖于反向代理商,Nginx的负载均衡策略有两种:内置策略和扩展策略。内置策略:

  • 轮询:将请求依次轮询发给每个服务器。

  • 最少连接:将请求发送给持有最少活动链接的服务器。

  • IP哈希:通过哈希函数决定请求发送给哪个服务器。

  • 权重:服务器的权重越高,解决请求的概率越大。

    Nginx正反向代理商和负载均衡

3.Nginx的配置文件

nginx.conf是nginx的配置文件,上面提到的代理商和负载均衡都需要在配置文件中进行配置,#在配置文件中是注释掉的,不会起作使用。

... #全局块events { #events块 ...}http #http块{ ... #http全局块 server #server块 { ... #server全局块 location [PATTERN] #location块 { ... } location [PATTERN] { ... } } server { ... } ... #http全局块}
  • 全局块:一般配置影响nginx全局的指令。一般配置使用户组,日志存放路径,pid存放路径和worker_connections;

  • events块:配置nginx服务器与使用户的网络连接。

  • http块:能嵌套多个server块,配置代理商服务器,日志

  • server块:能嵌套多个location块,配置代理商服务器的相关参数。

  • location块:配置请求路由和解决请求的页面或者服务器。

3.1 配置正向代理商

现在前后台分离已经越来越流行,那么前台开发时能在本地配置一个nginx正向代理商服务器,来代理商前台的请求,将其转发至后端服务器中。

########### 每个指令必需以分号结束。##################user nobody; #配置使用户或者者组,默认为nobody nobody。#worker_processes 1; #允许生成的进程数,默认为1,设置的话一般设置成跟cpu数量相等#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址error_log log/error.log debug; #制定日志路径,级别。这个设置能放入全局块,http块,server块,级别依次为:debug|info|notice|warn|error|crit|alert|emergevents { accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on multi_accept on; #设置一个进程能否同时接受多个网络连接,默认为off #use epoll; #事件驱动模型,仅使用于linux2.6以上内核,能大大提高nginx的性可以 worker_connections 1024; #最大连接数 # 并发总数=worker_processes*worker_connections;}http { include mime.types; #文件扩展名与文件类型映射表 default_type application/octet-stream; #默认文件类型,默认为text/plain #access_log off; #取消服务日志 log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自己设置格式 access_log log/access.log myFormat; #combined为日志格式的默认值 sendfile on; #允许sendfile方式传输文件,默认为off,能在http块,server块,location块。 keepalive_timeout 65; #连接超时时间 tcp_nodelay on; #开启gzip压缩 gzip on; gzip_disable "MSIE [1-6]."; #设定请求缓冲 client_header_buffer_size 128k; large_client_header_buffers 4 128k; #设定虚拟主机配置 server { #侦听1000端口(能随便设定成你想要的未占使用的端口) listen 1000; #定义用 localhost访问(设定成你本地的IP地址或者localhost) server_name localhost; #定义服务器的默认网站根目录位置 root html; #设定本虚拟主机的访问日志 access_log logs/nginx.access.log main; #默认请求 location / { index index.html index.htm; #定义首页索引文件的名称 } # 定义错误提醒页面 error_page 500 502 503 504 /50x.html; location = /50x.html { } #静态文件,nginx自己解决 location ~ ^/(images|javascript|js|css|flash|media|static)/ { #过期30天,静态文件不怎样升级,过期能设大一点,假如频繁升级,则能设置得小一点。 expires 30d; } location ~* \.(html|js|css|png|jpg|jpeg|gif|ttf)$ { proxy_pass http://127.0.0.1:63342; #访问http://localhost:1000/项目名/以html,js,css等结尾的文件请求均会被转发至http://127.0.0.1:63342;服务器中 } location ~* \.*$ { proxy_pass http://192.168.27.100:8180; #访问http://localhost:1000/项目名/任意路径的请求均会被转发至http://192.168.27.100:8180服务器中 } #禁止访问 .ht结尾的文件 location ~ /.ht { deny all; } }}

我们最常配置的地方是location里面的代理商服务器地址,这里要注意的是,1要把阻拦小范围请求的放在前面,把阻拦大范围请求的配置放在后面,由于像这里:location ~* .$ 阻拦以结尾的请求(即所有请求),假如它放在前面了,那么请求再也走不到location ~* .(html|js|css|png|jpg|jpeg|gif|ttf)$这个配置里面了(在前面已经被阻拦到了)。2.还是要注意检查结尾,我之前踩过一个坑,nginx配置文件是直接拷过来的,当时配置的location ~* .do$,此意为阻拦以.do结尾的请求(java中能配置),但我真正的请求是以.action结尾的,所以不会被阻拦到,亦即不会被转发至后端服务器中,导致每次请求均是404。

3.2 配置负载均衡

配置负载均衡时Nginx充任的是反向代理商服务器,当请求进来时,根据相应的负载策略,将请求分发至不同的解决器进行解决,配置步骤如下:

3.2.1 增加节点

在http块下,增加upstream节点。

upstream mytest { server 192.168.1.1:8081; server 192.168.1.2:8082; }

mytest能改成任何你喜欢的变量,

3.2.2 配置路径

将server块下的location节点中的proxy_pass配置为:http:// + upstream名称,即“http://mytest”。

location / { root html; index index.html index.htm; proxy_pass http://mytest; }

现在负载均衡初步完成了。upstream按照轮询(默认)方式进行负载,每个请求按时间顺序逐一分配到不同的后台服务器(比方第一个请求进来就交给第一个服务器解决,第二个请求进来就交给第二个服务器解决),假如后台服务器down掉,可以自动剔除。尽管这种方式简便、成本低廉。但缺点是:可靠性低和负载分配不均衡(比方明明一台服务器性可以很强他解决的请求跟低配的服务器一样,那一定是资源的白费,要让”年轻力壮”的比”老弱病残”的解决更多的请求)。适使用于图片服务器集群和纯静态页面服务器集群。所以除此之外,upstream还有其它的负载策略,分别如下:

3.2.3 weight(权重)

指定轮询几率,weight和访问比率成正比,使用于后台服务器性可以不均的情况。如下所示,192.168.1.2:8082的访问比率要比192.168.1.1:8081的访问比率高一倍。

upstream mytest{ server 192.168.1.1:8081 weight=5; server 192.168.1.2:8082 weight=10; }

3.2.4 ip_hash(按访问IP进行哈希计算)

每个请求按访问IP的hash结果分配,这样每个访客固定访问一个后台服务器,同时也处理了session的问题。

upstream mytest{ ip_hash; server 192.168.1.1:8081; server 192.168.1.2:8082; }

3.2.5 fair(第三方)

按后台服务器的响应时间来分配请求,响应时间短的优先分配。与weight分配策略相似。

upstream mytest{ server 192.168.1.1:8081; server 192.168.1.2:8082; fair; }

3.2.6 url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后台服务器,后台服务器为缓存时比较有效。注意:在upstream中加入hash语句,server语句中不可以写入weight等其余的参数,hash_method是用的hash算法。

upstream mytest{ server 192.168.1.1:8081; server 192.168.1.2:8082; hash $request_uri; hash_method crc32; }

上面是常使用的几种负载均衡策略及配置,其实upstream还能为每个服务器设置状态值,这些状态值的含义分别如下:

  • down :落下(宕机),表示当前的server暂时不参加负载。

  • weight :权重,默认为1。weight越大,负载的权重就越大。

  • maxfails :最大失败次数,允许请求失败的次数默认为1。当超过最大次数时,返回proxynext_upstream 板块定义的错误.

  • failtimeout :失败超时时间,maxfails次失败后,暂停的时间。

  • backup:备份,其它所有的非backup机器down或者者忙的时候,请求backup机器。所以这台机器压力会最轻。

upstream mytest{ #定义负载均衡设施的Ip及设施状态 ip_hash; server 192.168.1.1:9090 down; server 192.168.1.1:8080 weight=2; server 192.168.1.1:6060; server 192.168.1.1:7070 backup; }

以上简单详情了nginx的应使用,基本能满足平常的开发需要,以后假如有哪些补充再进行追加。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Nginx正反向代理商和负载均衡

发表回复