文章开始前给需要学习的同学提供一份nginx官方中文文档,希望能帮到大家,下方卡片直达领取。 开始正文! Show
分享一篇来自简书的文章,对Nginx的讲解非常到位,文章链接:深入浅出Nginx,作者主页:张丰哲 - 简书。 Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。 架构图上图基本上说明了当下流行的技术架构,其中Nginx有点入口网关的味道。 反向代理服务器?经常听人说到一些术语,如反向代理,那么什么是反向代理,什么又是正向代理呢? 正向代理: 正向代理示意图反向代理: 反向代理示意图由于防火墙的原因,我们并不能直接访问谷歌,那么我们可以借助VPN来实现,这就是一个简单的正向代理的例子。这里你能够发现,正向代理“代理”的是客户端,而且客户端是知道目标的,而目标是不知道客户端是通过VPN访问的。 当我们在外网访问百度的时候,其实会进行一个转发,代理到内网去,这就是所谓的反向代理,即反向代理“代理”的是服务器端,而且这一个过程对于客户端而言是透明的。 Nginx的Master-Worker模式nginx进程启动Nginx后,其实就是在80端口启动了Socket服务进行监听,如图所示,Nginx涉及Master进程和Worker进程。 Master-Worker模式nginx.confMaster进程的作用是? 读取并验证配置文件nginx.conf;管理worker进程; Worker进程的作用是? 每一个Worker进程都维护一个线程(避免线程切换),处理连接和请求;注意Worker进程的个数由配置文件决定,一般和CPU个数相关(有利于进程切换),配置几个就有几个Worker进程。 所谓热部署,就是配置文件nginx.conf修改后,不需要stop Nginx,不需要中断请求,就能让配置文件生效!(nginx -s reload 重新加载/nginx -t检查配置/nginx -s stop) 通过上文我们已经知道worker进程负责处理具体的请求,那么如果想达到热部署的效果,可以想象: 方案一: 修改配置文件nginx.conf后,主进程master负责推送给woker进程更新配置信息,woker进程收到信息后,更新进程内部的线程信息。(有点valatile的味道) 方案二: 修改配置文件nginx.conf后,重新生成新的worker进程,当然会以新的配置进行处理请求,而且新的请求必须都交给新的worker进程,至于老的worker进程,等把那些以前的请求处理完毕后,kill掉即可。 Nginx采用的就是方案二来达到热部署的! 思考:Nginx如何做到高并发下的高效处理?上文已经提及Nginx的worker进程个数与CPU绑定、worker进程内部包含一个线程高效回环处理请求,这的确有助于效率,但这是不够的。 作为专业的程序员,我们可以开一下脑洞:BIO/NIO/AIO、异步/同步、阻塞/非阻塞... 要同时处理那么多的请求,要知道,有的请求需要发生IO,可能需要很长时间,如果等着它,就会拖慢worker的处理速度。 Nginx采用了Linux的epoll模型,epoll模型基于事件驱动机制,它可以监控多个事件是否准备完毕,如果OK,那么放入epoll队列中,这个过程是异步的。worker只需要从epoll队列循环处理即可。 思考:Nginx挂了怎么办?Nginx既然作为入口网关,很重要,如果出现单点问题,显然是不可接受的。 答案是:Keepalived+Nginx实现高可用。 Keepalived是一个高可用解决方案,主要是用来防止服务器单点发生故障,可以通过和Nginx配合来实现Web服务的高可用。(其实,Keepalived不仅仅可以和Nginx配合,还可以和很多其他服务配合) Keepalived+Nginx实现高可用的思路: 第一:请求不要直接打到Nginx上,应该先通过Keepalived(这就是所谓虚拟IP,VIP) 第二:Keepalived应该能监控Nginx的生命状态(提供一个用户自定义的脚本,定期检查Nginx进程状态,进行权重变化,,从而实现Nginx故障切换) Keepalived+Nginx我们的主战场:nginx.conf很多时候,在开发、测试环境下,我们都得自己去配置Nginx,就是去配置nginx.conf。 nginx.conf是典型的分段配置文件,下面我们来分析下。 虚拟主机http的server段访问结果其实这是把Nginx作为web server来处理静态资源。 第一:location可以进行正则匹配,应该注意正则的几种形式以及优先级。(这里不展开) 第二:Nginx能够提高速度的其中一个特性就是:动静分离,就是把静态资源放到Nginx上,由Nginx管理,动态请求转发给后端。 第三:我们可以在Nginx下把静态资源、日志文件归属到不同域名下(也即是目录),这样方便管理维护。 第四:Nginx可以进行IP访问控制,有些电商平台,就可以在Nginx这一层,做一下处理,内置一个黑名单模块,那么就不必等请求通过Nginx达到后端在进行拦截,而是直接在Nginx这一层就处理掉。 反向代理【proxy_pass】所谓反向代理,很简单,其实就是在location这一段配置中的root替换成proxy_pass即可。root说明是静态资源,可以由Nginx进行返回;而proxy_pass说明是动态请求,需要进行转发,比如代理到Tomcat上。 反向代理,上面已经说了,过程是透明的,比如说request -> Nginx -> Tomcat,那么对于Tomcat而言,请求的IP地址就是Nginx的地址,而非真实的request地址,这一点需要注意。不过好在Nginx不仅仅可以反向代理请求,还可以由用户自定义设置HTTP HEADER。 负载均衡【upstream】上面的反向代理中,我们通过proxy_pass来指定Tomcat的地址,很显然我们只能指定一台Tomcat地址,那么我们如果想指定多台来达到负载均衡呢? 第一,通过upstream来定义一组Tomcat,并指定负载策略(IPHASH、加权论调、最少连接),健康检查策略(Nginx可以监控这一组Tomcat的状态)等。 第二,将proxy_pass替换成upstream指定的值即可。 负载均衡可能带来的问题? 负载均衡所带来的明显的问题是,一个请求,可以到A server,也可以到B server,这完全不受我们的控制,当然这也不是什么问题,只是我们得注意的是:用户状态的保存问题,如Session会话信息,不能在保存到服务器上。 缓存缓存,是Nginx提供的,可以加快访问速度的机制,说白了,在配置上就是一个开启,同时指定目录,让缓存可以存储到磁盘上。具体配置,大家可以参考Nginx官方文档,这里就不在展开了。 最近看到一些相关文章,比较详细。想深入了解可以看看。 Nginx详解 一文详解负载均衡和反向代理的真实区别 你想更深入了解学习Linux知识体系,你可以看一下我们花费了一个多月整理了上百小时的几百个知识点体系内容: 往期精彩文章,欢迎点赞收藏! 一份超全的Python学习资料汇总! 这是我见过最全的《MySQL笔记》,涵盖MySQL所有高级知识点! 一份超全的Linux自学资源整理合集! 不用怀疑!Kubernetes决定弃用Docker 一键申请多个证书 shell 脚本 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器, Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。 二、为什么使用Nginx?在传统的Web项目中,并发量小,用户使用的少。 所以在低并发的情况下,用户可以直接访问tomcat服务器,然后tomcat服务器返回消息给用户。 而在互联网项目下,因单个tomcat默认并发量有限制。如果请求量过大,会产生如下问题:
高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一, 它通常是指,通过设计保证系统能够同时并行处理很多请求。 高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等。 响应时间:系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间。 吞吐量:单位时间内处理的请求数量。 QPS:每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。 并发用户数:同时承载正常使用系统功能的用户数量。 高可用(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。 (一直都能用 99.9999%) 高性能是指服务响应时间快,(CPU/处理器/内存)特别是在高并发下响应时间不会急剧增加。 Nginx特点:高并发、高性能 可扩展性好 高可靠性 热部署 BSD许可证 三、简介Nginx (engine x) 是一款轻量级的Web 服务器 、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。 反向代理: 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。 正向代理: 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。 正向代理和反向代理区别?正向代理,是在客户端的。比如需要访问某些国外网站,我们可能需要购买vpn。并且vpn是在我们的用户浏览器端设置的(并不是在远端的服务器设置)。浏览器先访问vpn地址,vpn地址转发请求,并最后将请求结果原路返回来。 反向代理是作用在服务器端的,是一个虚拟ip(VIP)。对于用户的一个请求,会转发到多个后端处理器中的一台来处理该具体请求。 四、Nginx下载官方网址: http://nginx.org/
五、Nginx安装与使用Windows安装1、解压文件夹 2、双击nginx.exe ,一闪而过,nginx启动成功了,通过访问:http://localhost (端口号默认80) 使用nginx 的使用比较简单,就是几条命令。 常用到的命令如下:
windows下 需要带上exe 提示: 如果不想每次都敲命令,可以在nginx安装目录下新添一个启动批处理文件startup.bat,双击即可运行。内容如下:
Linux安装Nginx源执行以下命令:
安装该rpm后,我们就能在/etc/yum.repos.d/ 目录中看到一个名为nginx.repo 的文件。 安装完Nginx源后,就可以正式安装Nginx了。 Nginx默认目录输入命令: 即可看到类似于如下的内容:
以下是Nginx的默认路径:
事实上,只需知道Nginx配置路径,其他路径均可在/etc/nginx/nginx.conf 以及/etc/nginx/conf.d/default.conf 中查询到。 常用命令(1) 启动: (2) 测试Nginx配置是否正确: (3) 优雅重启: (4) 查看nginx的进程号: (5)nginx服务停止 kill -9 pid 杀死进程 Docker安装基本安装拉取Nginx镜像 查看本地镜像列表(即可看到nginx) 运行容器
参数说明:
安装成功 高级安装为了更方便开发和配置,需要将Docker容器内的信息进行宿主机间的配置 创建目录
依次在该目录下创建三个文件目录
拷贝配置文件
修改配置文件 将usr/local/nginx/conf/nginx.conf 内容中的 include 默认路径改为当前路径 重新创建/运行容器
测试重新访问 Docker-compose安装配置文件描述nginx.conf配置文件描述:nginx/conf 目录下:
基本配置全局块配置:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
events块配置events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
max_client: nginx作为http服务器的时候:
nginx作为反向代理服务器的时候:
http块配置可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
server块配置配置虚拟主机的相关参数,一个http中可以有多个server。
server2块配置和上方很类似,主要是配置另一个虚拟机信息
server3块配置配置https服务
六、应用场景需求1: 静态资源静态配置文件处理由于Nginx性能很高,对于常用的静态资源,可直接交由Nginx进行访问处理 示例:
Docker示例:
需求2:反向代理让nginx进行转发,即所 谓的反向代理 访问localhost时转到tomcat 修改nginx.conf文件,查看server 节点,相当于一个代理服务器,可以配置多个。
localhost时转到tomcat时。修改两个地方:
proxy_pass,它表示代理路径,相当于转发,而不像之前说的root必须指定一个文件夹。 需求3: 动静分离我们需要分文件类型来进行过滤,比如jsp直接给tomcat处理,因为nginx并不是servlet 容器,没办法处理JSP,而html,js,css这些不需要处理的,直接给nginx进行缓存即可。
让JSP页面直接给tomcat,而html,png等一些图片和JS等直接给nginx进行缓存
解决方案:
同时,页面上方要进行 静态资源的变更:(以绝对路径方式进行访问)
结束:nginx对location访问优先是以精确优先为原则,故将精确细的请求放在前面。这样可以完成基本的动静分离配置。
七、集群集群同一个业务,部署在多个服务器上
1进入nginx-1.10.1conf路径,修改配置文件nginx.conf 配置服务器组,在http{}节点之间添加upstream配置。(注意不要写localhost,不然访问速度会很慢)
2在location{}中,利用proxy_pass配置反向代理地址; 此处“http://”不能少,后面的地址要和第一步upstream定义的名称保持一致
注意: upstream中的server元素必须要注意,不能加http://,但proxy_pass中必须加 proxy_pass,它表示代理路径,相当于转发,而不像之前说的root必须指定一个文件夹。 完整如下:
八、Nginx负载均衡策略负载均衡是高可用网络基础架构的的一个关键组成部分,有了负载均衡,我们通常可以将我们的应用服务器部署多台,然后通过负载均衡将用户的请求分发到不同的服务器用来提高网站、应用、数据库或其他服务的性能以及可靠性。 负载均衡:将服务器接收到的请求按照规则分发的过程,称为负载均衡 1、轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除 2、指定轮询几率weight和访问比率成正比,用于后端服务器性能不均的情况默认选项,当weight不指定时,各服务器weight 相同, (weight=1) 3、ip_hash每个请求按访问ip的hash值分配,这样同一客户端连续的Web请求都会被分发到同一服务器进行处理,可以解决session的问题。当后台服务器宕机时,会自动跳转到其它服务器。
4、url_hash(第三方)
nginx按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存服务器、文件服务器、静态服务器时比较有效。缺点是当后端服务器宕机的时候,url_hash不会自动跳转的其他缓存服务器,而是返回给用户一个503错误。 5、fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配 九、集群/分布式环境下session处理策略集群是个物理形态,分布式是个工作方式。
为什么要处理session?
解决方案我们将处理Session的方式大致分为三种: Session保持(也有人叫黏性Session)、 Session复制。 Session共享。 Session保持(或者叫黏性Session)Session保持(会话保持)就是将用户锁定到某一个服务器上。比如上面说的例子,用户第一次请求时,负载均衡器(Nginx)将用户的请求分发到了A服务器上,如果负载均衡器(Nginx)设置了Session保持的话,那么用户以后的每次请求都会分发到A服务器上,相当于把用户和A服务器粘到了一块,这就是Session保持的原理。Session保持方案在所有的负载均衡器都有对应的实现。而且这是在负载均衡这一层就可以解决Session问题。 优点:非常简单,不需要对session做任何处理。 缺点:1、负责不均衡了:由于使用了Session保持,很显然就无法保证负载的均衡。 缺乏 实现方式:以Nginx为例,在upstream模块配置ip_hash属性即可实现粘性Session
Session复制针对Session保持的容错性缺点,我们可以在所有服务器上都保存一份用户的Session信息。这种将每个服务器中的Session信息复制到其它服务器上的处理办法就称为会话复制。当任何一台服务器上的session发生改变时,该节点会把session的所有内容序列化,然后广播给所有其它节点,不管其他服务器需不需要session,以此来保证Session同步。 优点:可容错,各个服务器间的Session能够实时响应。 缺点:将session广播同步给成员,会对网络负荷造成一定压力 实现方式:tomcat本身已支持该功能 tomcat的会话复制分为两种: 全局复制(DeltaManager):复制会话中的变更信息到集群中的所有其他节点。 非全局复制(BackupManager):它会把Session复制给一个指定的备份节点。 Session共享SpringSession+Redis方式实现 |