推荐阅读:Nginx神来之笔,提高并发原来如此简单

前言:

最近在部署项目时要求实现负载均衡,有趣的是发现网上一搜全部都是以下类似的配置文件

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;
}

参数列表如下:

最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以免费送给我的读者朋友们

目录:

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!有需要的朋友戳这里即可免费获取

Java面试核心知识点

已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了,各位读者朋友们快来免费获取吧

a面试核心知识点

已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了,各位读者朋友们快来免费获取吧

[外链图片转存中…(img-K63qoosK-1623622775717)]

深入理解Nginx及使用Nginx实现负载均衡相关推荐

  1. nginx的反向代理以及负载均衡模块的使用

    内容: 1.何为代理 2.nginx的反向代理模块以及使用 3.nginx的负载均衡模块以及使用 一.何为代理 代理,由字面意思可以理解为代为服务的是意思. 代理服务技术是一门很古老的技术,是在互联网 ...

  2. 【网络编程】多个服务器的情况:nginx实现反向代理、nginx基于反向代理实现负载均衡

    如果我们有多个服务器,比如我们只有一个域名:我们可以利用其中一台服务器,通过nginx为这一个域名实现反向代理:进一步,我们可以利用这多台服务器,为这一个域名基于nginx的反向代理实现负载均衡. 文 ...

  3. nginx反向代理,实现负载均衡

    nginx反向代理,实现负载均衡 一,先启动nginx和php-cgi #启动 php-cgi /usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 8000 -C 5 ...

  4. Nginx+Keepalived实现Web服务器负载均衡

    说明: 操作系统:CentOS 5.X 64位 Web服务器:192.168.21.127.192.168.21.128 站点:bbs.osyunwei.com和sns.osyunwei.com部署在 ...

  5. Nginx之反向代理与负载均衡实现动静分离实战

    Nginx之反向代理与负载均衡实现动静分离实战 什么是反向代理与负载均衡 Nginx仅仅作为Nginx  proxy反向代理使用的,因为这个反向代理功能表现的效果是负载均衡集群的效果. 负载均衡指的是 ...

  6. keepalive+nginx实现负载均衡高可用_超详细的LVS+keepalived+nginx实现高性能高可用负载均衡集群教程...

    概述 前面已经介绍了前两部分内容,下面主要介绍在nginx服务器方面的配置和测试整个集群是否可用. 在realserver端配置VIP 1.两台nginx服务器都要执行下面脚本: #vi /etc/r ...

  7. nginx的反向代理及负载均衡

    查看内核版本号: uname  -r 查看Linux发行版本 :cat /etc/issue 或cat /etc/release 查看bash 版本 : bash  --version <?xm ...

  8. Nginx、LVS及HAProxy负载均衡软件的优缺点详解

    摘要:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,一般对负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术,具体的应用需求还得具体分析,本文总结了三者之间的优缺 ...

  9. Nginx+Tomcat集群与负载均衡

    Nginx+Tomcat集群与负载均衡 架构描述 前端一台nginx服务器做负载均衡器,后端放N台tomcat组成集群处理服务,通过nginx转发到后面(注:没做动静分离,静态动态全部都转给tomca ...

  10. Nginx(三):负载均衡策略 与 Nginx静态服务器

    相关阅读: Nginx(一):Nginx原理概述 与 安装步骤详解 Nginx(二):反向代理原理 与 配置文件详解 Nginx(三):负载均衡策略 与 Nginx静态服务器 Nginx(四):Ngi ...

最新文章

  1. [转]android selector 背景选择器
  2. 【学习笔记1】CentOS 下载
  3. 分享一个web页面背景全屏的jquery插件Fullscreen Background
  4. java 计算器_用Java编写一个简单的计算器
  5. Codeforces Round #408 (Div. 2)
  6. 前端学习(2138):前端工程化
  7. python类百度百科_Python抓取百度百科数据
  8. css元素居中实现方法
  9. 转载:手写SpringMVC框架
  10. 记一次open-falcon手动push数据
  11. python vimrc的安装,并用pep8检测python代码
  12. vue中修改了数据但视图无法更新的情况
  13. html javascript 表格id,javascript 获取表格中元素id的实现代码
  14. 爬虫入门(简单网页信息爬取)
  15. Java版本新零售小程序saas商城全开源系统
  16. PLC编程语言都在这里了!
  17. VS2005 SP1补丁下载与安装
  18. 基于Qt的连连看小游戏
  19. 中国网络游戏上市突击大事记
  20. 编程题总结 链表问题常用解决方法

热门文章

  1. VJC案例-风扇定时
  2. c语言做的计算器小程序,c语言实现计算器小程序
  3. 弹幕服务器维护,分布式弹幕服务架构
  4. linux 备份命令
  5. CNDS 签到在哪里
  6. turbo c 混编 汇编语言,浅谈Turbo C过程调用汇编
  7. 数字电路课程设计--电子钟实验报告
  8. java零基础自学首选黑马程序员Java入门教程笔记01
  9. 一到九乘法口诀VB源码
  10. Visio 2019