转载 深入理解Nginx及使用Nginx实现负载均衡
转载:https://developer.51cto.com/art/202001/609322.htm
正向代理是代理客户端,也就是客户端能真正接触到的,比如访问外网时需要使用VPN软件,在这个软件中用户可以选择连接哪里的服务器。
- 作者:Java架构学习交流来源:今日头条|2020-01-14 09:40

前言
最近在部署项目时要求实现负载均衡,有趣的是发现网上一搜全部都是以下类似的配置文件
- upstream localhost{
- server 127.0.0.1:8080 weight=1;
- server 127.0.0.1:8081 weight=1;
- }
- server {
- listen 80;
- server_name localhost;
- location / {
- proxy_pass http://localhost;
- index index.html index.htm index.jsp;
- }
- }
所以打算来看看Nginx内部原理,这篇博客主要介绍Nginx如何实现反向代理以及在Nginx中负载均衡的参数使用
一、正向代理与反向代理
正向代理是代理客户端,也就是客户端能真正接触到的,比如访问外网时需要使用VPN软件,在这个软件中用户可以选择连接哪里的服务器。
反向代理则是代理服务端,用户感知不到,只是客户端把请求发到服务端的端口时,Nginx监听到了便把该端口的请求转发到不同的服务器上。就以上面配置文件来讲解,当在网址中输入http://localhost:80/时(不加80一样时默认进入80端口,这里为了表示清楚),而后Nginx监听到80端口的请求之后,就会查找对应的location来执行。由上面的配置文件我们可以看出是将请求转发到了不同的端口。这是在服务器中执行的,用户不可见。
而服务端中我们最常使用的反向代理的工具就是Nginx。
二、Nginx内部基本架构
nginx在启动后以daemon的方式在后台运行,会有一个master进程和多个worker进程。
master进程:主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。
worker进程:处理基本的网络事件了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,或者直接设置参数worker_processes auto;

所以Nginx基本的架构就如下:

当我们输入./nginx -s reload,就是来重启nginx,./nginx -s stop,就是来停止nginx的运行,这里面是如何做到的?执行命令时,我们是启动一个新的nginx进程,而新的nginx进程在解析到reload参数后,就知道我们的目的是控制nginx来重新加载配置文件了,它会向master进程发送信号。master进程在接到信号后,会先重新加载配置文件,然后再启动新的worker进程,并向所有老的worker进程发送信号,告诉他们可以光荣退休了。新的worker在启动后,就开始接收新的请求,而老的worker在收到来自master的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出。所以使用上面命令重启Nginx的时候服务是不中断的。
三、Nginx如何处理客户端请求
首先来解释一下上面的架构图:每个worker进程都是从master进程分支过来的,在master进程里面,先建立好需要监听的socket之后,然后再分支出多个worker进程。所有worker进程的listenfd(socket中listenfd是指客户端连接本机时的fd,是用来和客户端通信用的)会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。
在Nginx中worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当Nginx监听80端口时,一个客户端的连接请求过来,每个进程都有可能处理这个连接,上面说到是每个worker进程都会去抢注listenfd读事件。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。这里需要注意的是一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。
下面两幅流程图能很好的帮我们理解


四、Nginx如何处理事件并且实现高并发
Nginx内部采用了异步非阻塞的方式来处理请求,也就是说,Nginx是可以同时处理成千上万个请求的。
异步非阻塞:当一个网络请求过来时,我们并不依赖于这个请求才能做后续操作,那么这个请求就是异步操作,也就是调用者在没有得到结果之前同样可以执行后续的操作。非阻塞就是当前进程/线程没有得到请求调用的结果时也不会妨碍到进程/线程后续的操作。可以看出异步和非阻塞的对象是不同的。
五、Nginx负载均衡的算法及参数
round robin(默认):轮询方式,依次将请求分配到后台各个服务器中,适用于后台机器性能一致的情况,若服务器挂掉,可以自动从服务列表中剔除
weight:根据权重来分发请求到不同服务器中,可以理解为比例分发,性能较高服务器分多点请求,较低的则分少点请求
IP_hash:根据请求者ip的hash值将请求发送到后台服务器中,保证来自同一ip的请求被转发到固定的服务器上,解决session问题
- upstream localhost {
- ip_hash;
- server 127.0.0.1:8080;
- server 127.0.0.1:8080;
- }
上面是最基本的三种算法,我们还可以通过改变参数来自行配置负载均衡
- upstream localhost{
- ip_hash;
- server 127.0.0.1:9090 down;
- server 127.0.0.1:8080 weight=2;
- server 127.0.0.1:6060;
- server 127.0.0.1:7070 backup;
- }
参数列表如下:

转载 深入理解Nginx及使用Nginx实现负载均衡的更多相关文章
- 转载:Nginx做反向代理和负载均衡时“X-Forwarded-For”信息头的处理
转载自:https://blog.51cto.com/wjw7702/1150225 一.概述 如今利用nginx做反向代理和负载均衡的实例已经很多了,针对不同的应用场合,还有很多需要注意的地方,本文 ...
- 配置nginx实现windows/iis应用负载均衡(转载)
配置nginx实现windows/iis应用负载均衡 nginx是俄罗斯人开发的一款跨平台的高性能HTTP和反向代理服务器,可以利用它实现web应用服务器的负载均衡. 反向代理是指将用户请求通过代 ...
- 在ubuntu上面配置nginx实现反向代理和负载均衡
上一篇文章(http://www.cnblogs.com/chenxizhang/p/4684260.html),我做了一个实验,就是利用Visual Studio,基于Nancy框架,开发了一个自托 ...
- 图文解说:Nginx+tomcat配置集群负载均衡
图文解说:Nginx+tomcat配置集群负载均衡 博客分类: appserver nginxTomcatUbuntuLinux网络应用 作者:niumd Blog:http://ari.iteye ...
- linux 常用命令 和 nginx(反响代理、负载均衡)安装和配置
(1)linux常用命令 [1]在光标前输入内容:i [2]删除输入方式下所输入的文本:Ctrl+u [3]文件保存退出:wq [4]文件不保存退出:q [5]文件强制退出:q! [6]常规删除文件 ...
- Nginx+keepalived构建双主负载均衡代理服务器
引言 Nginx是一个高性能的代理服务器,单台Nginx容易出现单点故障,使用keepalived可以实现Nginx的故障转移,保证了网站的高可用性 一.使用Nginx+keepalived的两种方案 ...
- Windos环境用Nginx配置反向代理和负载均衡
Windos环境用Nginx配置反向代理和负载均衡 引言:在前后端分离架构下,难免会遇到跨域问题.目前的解决方案大致有JSONP,反向代理,CORS这三种方式.JSONP兼容性良好,最大的缺点是只支持 ...
- Nginx + Tomcat Windows下的负载均衡配置
Nginx + Tomcat Windows下的负载均衡配置 一.为什么需要对Tomcat服务器做负载均衡? Tomcat服务器作为一个Web服务器,其并发数在300-500之间,如果超过50 ...
- nginx的反向代理和负载均衡的一个总结
之前一直觉的nginx的反向代理和负载均衡很厉害的样子,最近有机会接触了一下公司的这方面的技术,发现技术就是一张窗户纸呀,捅破了啥都明白了! 接下来先看一下nginx的反向代理: 简单的来说就是ngi ...
- nginx简单反向代理和负载均衡(ubuntu)
nginx简单反向代理与负载均衡 环境:三台ubuntu 12.04.5 虚拟机 均装有nginx 1.1.19 以下u1(192.168.240.129) ,u2(192.168.240.13 ...
随机推荐
- java_抽象类、接口、多态的使用
抽象类 抽象类:包含抽象方法的类. 抽象方法 : 没有方法体的方法. 使用 abstract关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体. 格式为:修饰符 abstra ...
- Azure Application Gateway(一)对后端 Web App 进行负载均衡
一,引言 今天,我们学习一个新的知识点-----Azure Application Gateway,通过Azure 应用程序网关为我么后端的服务提供负载均衡的功能.我们再文章头中大概先了解一下什么是应 ...
- 深度强化学习:Deep Q-Learning
在前两篇文章强化学习基础:基本概念和动态规划和强化学习基础:蒙特卡罗和时序差分中介绍的强化学习的三种经典方法(动态规划.蒙特卡罗以及时序差分)适用于有限的状态集合$\mathcal{S}$,以时序差分 ...
- LeetCode 309 Best Time to Buy and Sell Stock with Cooldown 解决方案
题目描述 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 . 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 你不能同时参与多笔 ...
- 我的第一个程序Hello world
//include:导入一个文件:stdio:标准输入输出库(std是一个标准库:i:input:o:output:):.h:头文件:<>:表示导入系统文件:“”表示导入系统文件 #inc ...
- java中三大集合框架
一.List集合 1.List实现的超级父类接口:Collection 存储一组不唯一(允许重复),有序的对象. 2.了解ArrayList类 A):定义的格式:ArrayList<具体类型&g ...
- JDBC+MySQL入门实战(实现CURD的例子)
前言 hello我是bigsai,今天咱们进行JDBC+MySQL实战,非常适合初入门的小伙伴打开新的世界.实现一个增删改查(curd)的例子.先点赞再观看.帅哥靓女养成好习惯! 在这个案例进行之前, ...
- 【luogu1613】跑路 - 倍增+Floyd
题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的空间跑路器,每秒钟 ...
- Jmeter 常用函数(2)- 详解 __RandomDate
如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 产生一个随机日期 语法格式 ${__R ...
- openvswitch常用bond相关命令
1.列出bondovs-appctl bond/list[root@test~]# ovs-appctl bond/listbond type recircID slavesbond1 balance ...