承接一文初步认识Nginx,本篇文章,继续将基础知识和原理罗列出来,然后将实际操作演示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模块来实现的,此处详细介绍了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/hosts
192.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/hosts
192.168.10.10 www.test2.com
四.实验现象
[root@localhost application]# curl www.test1.com
this is test 1 //192.168.10.20
[root@localhost application]# curl www.test1.com
this is test 1 //192.168.10.30
[root@localhost application]# curl www.test1.com
this is test 1 //192.168.10.20
[root@localhost application]# curl www.test1.com
this is test 1 //192.168.10.30
五.实验中遇到的问题
由于笔者,在安装Nginx之前安装了Apache,并开启但是没有关闭,导致80端口一直被占用,造成了实验无法完成的现象。这里也给大家提个醒!查看端口是否被占用netstat -tunpl | grep 80