博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nginx反向代理和负载均衡
阅读量:2722 次
发布时间:2019-05-13

本文共 5419 字,大约阅读时间需要 18 分钟。


承接,本篇文章,继续将基础知识和原理罗列出来,然后将实际操作演示Nginx的反向代理和负载均衡服务!


第一部分:基础知识

Nginx服务器的反向代理服务和负载均衡

一.Nginx的负载均衡简述

严格来说,Nginx仅仅是作为反向代理使用的,因为反向代理的功能可以表现出负载均衡的效果,所以常说Nginx可以实现负载均衡。
与传统的负载均衡不同,传统的负载均衡,比如LVS,他本质是将包进行转发,即整个过程其实就只有客户端和真实服务器建立连接,而Nginx不同,Nginx是接收到包后,打开包查看包中的信息,然后先自己与客户端建立连接,然后Nginx再去请求后端服务器,这一过程其实是建立了两个连接(一是客户端与Nginx代理服务器之间建立一个连接,另一个是Nginx代理服务器和后端的真实服务器建立连接)

二.Nginx实现负载均衡组件的说明

Nginx http模块 模块说明
ngx_http_proxy_moudle nginx代理模块,用于把请求后抛给服务器节点或upstream服务器池
ngx_http_upstream_moudle 负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查

三.Nginx负载均衡核心介绍-----Upstream

1.Nginx的upstream模块
ngx_http_upstream_moudle模块允许Nginx定义一组或多组节点服务器组,使用时可以通过proxy_pass代理方式把网站的请求发送到事先定义好的对应Upstream组的名字上,具体写法为“proxy_pass http://www.server_pools”,其中www_server_pools就是一个Upstream节点服务器组的名字
2.Nginx的upstream模块的配置案例

upstream server_pool {
###创建了一个集群,叫做server_pool server 192.168.10.10 max_fails=3,weight=10; #设置失败次数,和权重 #ip_hash #开启hash,ip_hash不可以与权重同时存在 keepalive 100; #允许集群同时建立的连接数为100 }

3.upstream模块中server标签参数说明

upstream模块内参数 参数说明
server < ip address>< port > 负载均衡后面的RS配置,可以是IP地址+端口,也可以是域名+端口(高并发场景下,可以使用域名,然后通过DNS做负载均衡)
weight=< value > 服务器权重,权重越大,被访问的几率越大
max_fails Nginx尝试连接后端主机失败的次数,这个数值配合proxy_next_upstream,fastcgi_next_upstream和memcached_next_upstream这三个参数来使用,当Nginx接收后端服务器返回这三个参数定义的状态码时,会将请求发送给正常的后端服务器
backup 热备配置。即配置了该参数的服务器,作热备份机,如果主服务器宕机了,那么备份机就会立即启用。注:如果调度算法是ip_hash的话,后端服务器在负载均衡中的调度不可以是weight和backup
fail_timeout 在max_fails次数到数之后,每隔这个时间间隔就重新询问一下,服务器是否恢复正常,如果没有恢复正常,就再等待这个时间之后再进行询问
down 标志着该服务器不可使用,这个参数可以配合ip_hash使用

4.upstream模块调度算法

调度算法一般分为两类
·第一类为静态调度算法,即负载均衡服务器按照本地设置的规则进行分配,不需要考虑后续服务器的状态,如rr,wrr,ip_hash等都属于静态调度算法
·第二类为动态调度算法,即负载均衡服务器会根据后端节点的状态来决定是否分配请求。例如,连接数少的优先获得请求,相应时间短的优先获得请求,如least_conn,fair等都属于常见的动态调度算法

下面介绍几种常见的调度算法

1.rr(轮询算法,静态)
按客户端请求顺序把客户端的请求,逐一分配到不同的后端服务器
2.wrr(加权轮询,静态)
在rr算法的基础上,加上了权重,即为权重轮询算法,当使用该算法时,权重和用户访问成正比,即权重越大的,分担的访问压力就越大
3.ip_hash(针对IP的哈希,静态)
每个请求按客户端的IP哈希结果进行分配,当新的请求到达时,先将客户端IP通过哈希算法得出来一个值,在随后的客户端请求中,客户IP的哈希值只要相同,就会分配至同一台服务器,这样的调度算法可以解决动态网页的session问题,但有时会导致请求分配不均,即无法保证1:1的负载均衡
4.fair(响应时间,动态)
此算法会根据后端节点服务器的响应时间来分配请求,响应时间短的优先分配,此算法可以根据页面大小和加载时间长短来智能地进行负载均衡,也就是根据后端的响应时间,响应时间短的优先被分配,nginx本身不支持这个算法,如果想使用,需要下载有关模块upstream_fair
5.least_conn(最少连接,动态)
根据后端节点的连接数来决定是否分配情况,哪个机器连接数少就进行分发
6.url_hash(针对URL的哈希,动态)
与ip_hash类似,这个算法是根据URL进行哈希,当后端服务器为缓存服务器时,有非常好的效果,可以提高缓存的命中率,Nginx本身不支持这种算法,需要下载对应的hash模块包
7.一致性hash(动态)
一致性hash算法一般用于代理后端业务为缓存服务(如squid,Memcached)的场景,通过将用户请求的URI或者指定字符串进行计算,然后调度到后端的服务器中,此后任何用户查找同一个URI或者指定字符串都会被调度到这一台服务器上,因此后端的每个节点的缓存内容都是不同的。一致性hash算法可以实现后端某个或某几个节点宕机后,缓存的数据动荡最小

三.Nginx负载均衡核心介绍-----http_proxy——moudle模块

1.proxy_pass指令
http_proxy——moudle模块可以将请求转发到另一台服务器上,在实际的反向代理工作中,会通过location功能匹配指定的URI,然后把接收到的符合匹配URI的请求通过proxy_pass抛给定义好的upstream节点池

location /name/{
proxy_pass http://127.0.0.1/remote/; } ###上述语句的意思是将匹配URI为name的请求抛给http://127.0.0.1/remote/

2.http proxy模块参数

Nginx的代理功能是通过http proxy模块来实现的,

第二部分:搭建简单的负载均衡

实验环境

主机 IP地址
负载均衡调度器 192.168.10.10
后端真实服务器S1 192.168.10.20
后端真实服务器S2 192.168.10.30

一.安装nginx及相关软件包

三台机器的安装配置都是相同的!
1.安装依赖软件包

yum -y install openssl openssl-devel pcre pcre-devel###openssl和nginx的https有关,pcre包和正则有关

2.安装Nginx软件包

mkdir /nginx  ###在根目录下创建nginx目录cd /nginx  ###进入到nginx目录下wget -q http://nginx.org/download/nginx-1.6.3.tar.gz ###获取nginx的压缩包tar xf nginx-1.6.3.tar.gz  ###对压缩包进行解解压缩useradd nginx -s /sbin/nologin -M ###创建名为nginx的用户cd nginx-1.6.3  ###进入解压好的目录中./configure --user=nginx --group=nginx --prefix=/application/nginx-1.6.3 --with-http_stub_status_module --with-http_ssl_module ###安装前的预配置make   ###进行预编译make install ###进行安装至此安装完成/application/nginx-1.6.3/sbin/nginx  ###开启nginx服务

二.配置用于测试的web服务站点

两台后端服务器(S1和S2)的配置都是一样的,这里只给出一次配置

http {
include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server {
listen 80; server_name www.test1.com; ###设置虚拟主机的域名 location / {
root html/test1; ###指定访问该虚拟主机时的主目录 index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html {
root html; } } .... ######后续一些配置,这里不再给出 .... }在自己本地的 /etc/hosts中添加自己主机的域名解析[root@localhost test1]# tail -1 /etc/hosts192.168.10.20 www.test2.com

三.反向代理和负载均衡服务器端的配置(192.168.10.10)

http {
include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream www_test1_com_pools {
#####创建一个后端服务器集群池 server 192.168.10.20 weight=1; server 192.168.10.30 weight=1; } server {
###定义要代理的主机 listen 80; server_name www.test1.com; location / {
proxy_pass http://www_test1_com_pools; ###实现负载均衡最重要的一环!proxy_pass 后面接之前定义好的后端服务器集群池,注意要有http://构成完整的URL } error_page 500 502 503 504 /50x.html; location = /50x.html {
root html; } }#负载均衡器本地也添加对应的主机解析[root@localhost application]# tail -1 /etc/hosts192.168.10.10 www.test2.com

四.实验现象

[root@localhost application]# curl www.test1.comthis is test 1 //192.168.10.20[root@localhost application]# curl www.test1.comthis is test 1 //192.168.10.30[root@localhost application]# curl www.test1.comthis is test 1 //192.168.10.20[root@localhost application]# curl www.test1.comthis is test 1 //192.168.10.30

五.实验中遇到的问题

由于笔者,在安装Nginx之前安装了Apache,并开启但是没有关闭,导致80端口一直被占用,造成了实验无法完成的现象。这里也给大家提个醒!查看端口是否被占用netstat -tunpl | grep 80

转载地址:http://ywttd.baihongyu.com/

你可能感兴趣的文章
JBoss将common下的lib放入classspath
查看>>
HornetQ 消息概念
查看>>
jboss 学习security
查看>>
Netbeans响应慢的原因
查看>>
eclipse学习点滴
查看>>
eclipse更新Zorder
查看>>
eclipse解析xml提示错误
查看>>
eclipse调整出错
查看>>
eclipse报错Missing Constraint: Require-Bundle: org.eclipse.emf.transaction;
查看>>
Eclipse Preference Scope
查看>>
eclipse中取得指定目录文件
查看>>
pentaho启动过程solution的查询步骤
查看>>
eclipse查看jar对应的源代码
查看>>
jdk-6u29 导致 tomcat 启动时卡死
查看>>
Activiti配置数据源
查看>>
JDK1.3 中的本地绘制支持
查看>>
导入jme3的Unknown data type: uint64_t
查看>>
Oracle11g EM在SUSE上图片乱码解决
查看>>
Oracle 11g Alert Log日志位置及参数
查看>>
blender导入unity3d不显示部分面
查看>>