一个执着于技术的公众号

Nginx系列导读

给小白的 Nginx 10分钟入门指南

Nginx编译安装及常用命令

完全卸载nginx的详细步骤

Nginx 配置文件详解

理解正向代理与反向代理的区别

一文带你读懂Nginx反向代理

一文带你读懂nginx中的location指令

前言

nginx

Nginx是一款高性能的http 服务器/反向代理服务器电子邮件(IMAP/POP3)代理服务器。官方测试nginx能够支撑5万并发连接,并且cpu、内存等资源消耗却非常低,运行非常稳定。

负载均衡

什么是负载均衡,单从字面理解可以解释为N台服务器平均分担负载,不会因为某台服务器负载高宕机而出现某台服务器闲置的情况。那么负载均衡的前提就是要有多台服务器才能实现,目的是达到整个系统的高性能和高可用性。

1、Nginx负载均衡介绍

反向代理与负载均衡概念简介

严格地说,Nginx仅仅是作为Nginx Proxy反向代理使用的,因为这个反向代理功能表现的效果是负载均衡集群的效果,所以本文称之为Nginx负载均衡。那么,反向代理和负载均衡有什么区别呢?

  • 普通负载均衡软件,例如大名鼎鼎的LVS,其实功能只是对请求数据包的转发(也可能会改写数据包)、传递。其中DR模式明显的特征是:从负载均衡下面的节点服务器来看,接收到的请求还是来自访问负载均衡器的客户端的真实用户。

  • 而反向代理就不一样了,反向代理接收访问用户的请求后,会代理用户重新发起请求代理下的节点服务器,最后把数据返回给客户端用户,在节点服务器看来,访问的节点服务器的客户端用户就是反向代理服务器了,而非真实的网站访问用户。

  • 一句话,LVS等的负载均衡是转发用户请求的数据包,而Nginx反向代理是接收用户的请求后,会代理用户重新发起请求代理下的节点服务器。

2、Nginx负载均衡组件模块

实现Nginx负载均衡的组件主要有两个:

  • ngx_http_upstream_module

    负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查

  • ngx_http_proxy_module

    proxy代理模块,用于把请求转发给服务器节点或upstream服务器池

2.1、upstream模块

(1)upstream模块介绍

upstream模块允许Nginx定义一组或多组节点服务器组,使用时可以通过proxy_pass代理方式把网站的请求发送到事先定义好的对应upstream组的名字上,具体写法为:

proxy_pass http://server_pools

其中server_pools就是一个upstream节点服务器组名字。

(2)upstream配置案例

 范例1:基本的upstream配置案例:
upstream server_pools {

# upstream是关键字必须有,后面的server_pools是upstream集群组的名字,可自定义名称,调用时就用这个名字。

server 192.168.1.251:80 weight=5;
server 192.168.1.252:80 weight=10;
server 192.168.1.253:80 weight=15; # server关键字是固定的,后面可以接域名或IP。如果不指定端口,默认是80端口。weight代表权重,数值越大被分配的请求越多。 }
范例2:较完整的upstream配置案例:
upstream blog__pools {

server 192.168.0.223;   #这行标签和下行是等价的
server 192.168.0.224:80 weight=1 max_fails=1 fail_timeout=10s; #这行标签和上一行是等价的,此行多余的部分就是默认配置,不写也可以。 server 192.168.0.225:80 weight=1 max_fails=2 fail_timeout=20s backup; # server最后面可以加很多参数,具体参数作用看下文 }

(3)upstream模块参数

  • server

负载后面的RS配置,可以是ip或者域名。

  • weight

请求服务器的权重。默认值为1,越大表示接受的请求比例越大。

  • max_fails

nginx 尝试连接后端主机失败的次数。

这个数值需配合proxy_net_upstreamfastcgi_next_upstreammemcached_next_upstream这三个参数来使用的。

当nginx接收后端服务器返回这三个参数定义的状态码时,会将这个请求转发给正常工作的后端服务器,例如404,502,503

  • fail_timeout

max_fails定义的失败次数后,距离下次检查的时间间隔,默认10s

  • backup

热备配置,标志这台服务器作为备份服务器,若主服务器全部宕机了,就会向它转发请求

  • down

表示这个服务器永不可用,可配合ip_hash使用

范例:

upstream web_pools {

server linux.example.com weight=5;
server 127.0.0.1:8080 max_fail=5 fail_timeout=10s;
# 当5次连续检查失败后,间隔10s后重新检测。
server linux.example.com:8080 backup;
# 指定备份服务器。作用:等上面服务器全部不可访问时就向它转发请求。 }

2.2、http_proxy_module模块

(1)proxy_pass指令介绍

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

location内容,参考:一文彻底读懂nginx中的location指令

(2)proxy_pass的使用案例

location /web/ {

proxy_pass http://127.0.0.1/abc/;

}

将匹配URI为web的请求抛给http://127.0.0.1/abc/

(3)http proxy模块参数

  • proxy_set_header

设置http请求header项传给后端服务器节点。例如,可以实现让代理后端的服务器节点获取访问客户端用户真实的IP地址

  • client_body_buffer_size

用于指定客户端请求主题缓冲区大小

  • proxy_connect_timeout

表示反向代理与后端节点服务器连接的超时时间,即发起握手等候响应的超时时间

  • proxy_send_timeout

表示代理后端服务器的数据回传时间,即在规定时间之内,后端服务器必须传完所有的数据,否则,nginx将断开这个连接

  • proxy_read_timeout

设置nginx从代理的后端服务器获取信息的时间,表示连接建立成功后,nginx等待后端服务器的响应时间,其实是nginx在后端排队等候处理的时间

  • proxy_buffer_size

设置缓冲区大小,默认该缓冲区大小等于指令proxy_buffers设置的大小

  • proxy_buffers

设置缓冲区的数量和大小,nginx从代理的后端服务器获取的响应信息,会放置在缓冲区

  • proxy_busy_buffers_size

用于设置系统很忙时可以使用的proxy_buffers大小,官方推荐的大小为proxy_bufer*2

  • proxy_temp_file_write_size

指定proxy缓存临时文件的大小

3、Nginx负载均衡调度算法

(1)rr轮询(默认)

默认调度算法,按照客户端请求逐一分配到不同的后端服务器,宕机的服务器会自动从节点服务器池中剔除。

upstream server_pools {
server 192.168.1.251;
server 192.168.1.252;
}

注意:对于服务器性能不同的集群,该算法容易引发资源分配不合理等问题。

(2)wrr加权轮询(weight)

在rr轮询算法的基础上加上权重,权重和用户访问成正比,权重值越大,被转发的请求也就越多

upstream server_pools {
server 192.168.1.251 weight=5;
server 192.168.1.252 weight=10;
}

加权轮询应用于服务器性能不等的集群中,使资源分配更加合理化。

(3)ip_hash(会话保持)

每个请求按访问 IP 的hash结果分配,每个访客固定访问一个后端服务器,可解决session不共享的问题。

upstream server_pools {
ip_hash;
server 192.168.1.251;
server 192.168.1.252;
}

Session 不共享是说,假设用户已经登录过,此时发出的请求被分配到了 A 服务器,但 A 服务器突然宕机,用户的请求则会被转发到 B 服务器。但由于 Session 不共享,B 无法直接读取用户的登录信息来继续执行其他操作。

(4)fair(动态调度算法)

根据后端节点服务器的响应时间来分配请求,响应时间短的优先分配。

upstream server_pools {
server 192.168.1.251;
server 192.168.1.252;
fair;
}

这是更加智能的调度算法,但Nginx本身不支持fair调度算法。如果需要使用fair调度,必须下载Nginx相关模块upstream_fair

(5)url_hash算法(web缓存节点)

根据访问URL的hash结果来分配请求,让每个URL定向到同一个后端服务器。

upstream server_pools {

server qll:9001;
server qll:9002;
hash $request_uri;
hash_method crc32; }

同样,Nginx本身是不支持url_hash,如果需要使用这种调度算法,必须安装Nginx的hash模块软件包。

4、Nginx负载均衡配置实例

(1)实现效果

在浏览器上输入地址http://www.qll.com,实现负载均衡效果(平均访问到两台服务器)

(2)准备工作

a)准备3台nginx服务器,如下:

主机名 IP地址 角色说明
web01 10.43.187.251 nginx web01服务器
web02 10.43.187.252 nginx web01服务器
lb 10.43.187.253 nginx 负载均衡服务器

b)三台服务器均安装nginx

安装nginx,参考:Nginx编译安装及常用命令

c)配置用于测试的Web服务

注意:本小节是在两台Nginx Web服务器上操作

[root@web01 nginx]# cat conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65; server {
listen 80;
server_name localhost;
location / {
root html/www;
index index.html index.htm;
}
access_log logs/access_www.log main;
} }

创建测试文件数据

[root@web01 ~]# cd /usr/local/nginx/html/
[root@web01 html]# mkdir www
[root@web01 www]# echo "`hostname -I` www" > index.html 查看创建的文件内容:
[root@qll251 www]# cat index.html
10.43.187.251 www

别忘记启动nginx服务哦

d)配置nginx 负载均衡服务器

[root@lb01 nginx]# cat conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream www_server_pools { #这里定义Web服务器池,包含了251,252两个Web节点 server 10.43.187.251:80 weight=1; server 10.43.187.252:80 weight=1; }
server { #这里定义代理的负载均衡域名虚拟主机
listen 80;
server_name www.qll.com;
location / {
proxy_pass http://www_server_pools; #访问www.qll.com,请求发送给www_server_pools里面的节点
}
}
}

e)域名解析

由于不是真实环境,域名使用www.qll.com用作测试,所以www.qll.com的解析只能在hosts文件设置。

打开:

C:\Windows\System32\drivers\etc\hosts

在末尾添加:

10.43.187.253 www.qll.com

(3)测试验证

打开浏览器访问www.qll.com,不断刷新会发现所有请求被负载均衡器(10.43.187.253)均分配到web01(10.43.187.251)和web02(10.43.187.252)上,实现了负载均衡的效果。


结语

如果您觉得看完本文后有所收获, 还希望您随手帮忙点个在看 、或者分享转发。您的支持是我坚持分享的最大动力!

往期精彩

◆  必看 | Linux系列学习书籍免费送

◆  利用expect批量修改Linux服务器密码

◆  Linux运维工程师面试问答录

◆  LVM逻辑卷学习

◆  Linux网络重点知识总结性梳理

◆  抓包工具tcpdump用法说明

◆  一文带你速懂虚拟化KVM和XEN

◆  实战 | Hadoo大数据集群搭建

◆  运维工程师心法:6大技能让你告别背锅

◆  亿级web系统负载均衡几种实现方式

干货 | Nginx负载均衡原理及配置实例的更多相关文章

  1. Nginx进阶使用-负载均衡原理及配置实例

    介绍 跨多个应用程序实例的负载平衡是一种用于优化资源利用率,最大化吞吐量,减少延迟和确保容错配置的常用技术.可以将Nginx用作非常有效的HTTP负载平衡器,以将流量分配到多个应用程序服务器,并使用N ...

  2. Nginx 负载均衡原理简介与负载均衡配置详解

    Nginx负载均衡原理简介与负载均衡配置详解   by:授客  QQ:1033553122   测试环境 nginx-1.10.0 负载均衡原理 客户端向反向代理发送请求,接着反向代理根据某种负载机制 ...

  3. 搞懂分布式技术9:Nginx负载均衡原理与实践

    搞懂分布式技术9:Nginx负载均衡原理与实践 本篇摘自<亿级流量网站架构核心技术>第二章 Nginx负载均衡与反向代理 部分内容. 当我们的应用单实例不能支撑用户请求时,此时就需要扩容, ...

  4. nginx负载均衡之入门配置

    先来简单了解一下什么是负载均衡,单从字面上的意思来理解就可以解释N台服务器平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况.那么负载均衡的前提就是要有多台服务器才能实现,也就是两台以上 ...

  5. Nginx记录-nginx 负载均衡5种配置方式(转载)

    nginx 负载均衡5种配置方式 1.轮询(默认)   每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除.  2.weight 指定轮询几率,weight和访问比率成 ...

  6. nginx 负载均衡5种配置方式

    nginx 负载均衡5种配置方式 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight 指定轮询几率,weight和访问比率成正比, ...

  7. Nginx几种负载均衡算法及配置实例

    本文装载自: https://yq.aliyun.com/articles/114683 Nginx负载均衡(工作在七层"应用层")功能主要是通过upstream模块实现,Ngin ...

  8. [转]Nginx负载均衡原理初解

    什么是负载均衡 我们知道单台服务器的性能是有上限的,当流量很大时,就需要使用多台服务器来共同提供服务,这就是所谓的集群. 负载均衡服务器,就是用来把经过它的流量,按照某种方法,分配到集群中的各台服务器 ...

  9. nginx负载均衡tomcat和配置ssl

    目录 tomcat 组件功能 engine host context connector service server valve logger realm UserDatabaseRealm 工作流 ...

随机推荐

  1. 当一个线程进入某个对象的一个 synchronized 的实例方 法后,其它线程是否可进入此对象的其它方法?

    如果其他方法没有 synchronized 的话,其他线程是可以进入的. 所以要开放一个线程安全的对象时,得保证每个方法都是线程安全的.

  2. 如何实现集群中的 session 共享存储?

    Session 是运行在一台服务器上的,所有的访问都会到达我们的唯一服务器上,这 样我们可以根据客户端传来的 sessionID,来获取 session,或在对应 Session 不 存在的情况下(s ...

  3. su 和 sudo的区别

    su是一个命令,可切换其他用户进行操作:而 '-' 号则是代表是否完全切换指定的用户环境信息 sudo是一个服务,可通过/etc/sudoers进行配置文件,让被限制的用户只能执行被授予的命令操作.

  4. java中的VO、PO、BO、DAO、POJO

     针对java工程里的各种带O的对象,进行分析,了解各自的作用. PO: persistent object,持久对象.与数据库里表字段一一对应.PO是一些属性,以及set和get方法组成.一般情况下 ...

  5. 谷歌浏览器postman插件安装,亲测可用

    将谷歌浏览器进入扩展程序,将crx文件拖入即可. https://pan.baidu.com/s/1rIEe9RSby5EgTkygSx_dDA 百度云链接: https://pan.baidu.co ...

  6. ACM - 动态规划 - UVA437 The Tower of Babylon

    UVA437 The Tower of Babylon 题解 初始时给了 \(n\) 种长方体方块,每种有无限个,对于每一个方块,我们可以选择一面作为底.然后用这些方块尽可能高地堆叠成一个塔,要求只有 ...

  7. ACM - 动态规划 - UVA323 Jury Compromise

    UVA323 Jury Compromise 题解 考虑用动态规划.该问题要求解的最终状态为,选出的 \(m\) 个人,使得辩方总分与控方总分差的绝对值最小,总分之和最大.即 \(\left| D(\ ...

  8. 2_状态空间_State Space

  9. C# 将Excel转为PDF时设置内容适应页面宽度

    将Excel转为PDF格式时,通常情况下转换出来的PDF页面都是默认的宽度大小:如果Excel表格数据的设计或布局比较宽或者数据内较少的情况,转出来的PDF要么会将原本的一个表格分割显示在两个页面,或 ...

  10. JWT介绍及使用

    目录 JWT-JSON WEB TOKEN JWT组成 header payload signature JWT校验 JWT获取信息 JJWT(java jwt api)使用 导入依赖 测试代码 JW ...