Nginx 是什么、为什么、怎么用?

  一、什么是Nginx

  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)

  运行容器

  参数说明:--name nginx-test:容器名称。-p 80:80: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。-d nginx: 设置容器在在后台一直运行。

  安装成功

  高级安装

  为了更方便开发和配置,需要将Docker容器内的信息进行宿主机间的配置docker exec -it nginx-test bash 可通过如下命令进入容器内部

  创建目录

  依次在该目录下创建三个文件目录

  拷贝配置文件

  修改配置文件将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保持,很显然就无法保证负载的均衡。 缺乏:如果后端某台服务器宕机,那么这台服务器的Session丢失,被分配到这台服务请求的用户还是需要重新登录,所以没有彻底的解决问题。

  实现方式:以Nginx为例,在upstream模块配置ip_hash属性即可实现粘性Session

  Session复制

  针对Session保持的容错性缺点,我们可以在所有服务器上都保存一份用户的Session信息。这种将每个服务器中的Session信息复制到其它服务器上的处理办法就称为会话复制。当任何一台服务器上的session发生改变时,该节点会把session的所有内容序列化,然后广播给所有其它节点,不管其他服务器需不需要session,以此来保证Session同步。

  优点:可容错,各个服务器间的Session能够实时响应。 缺点:将session广播同步给成员,会对网络负荷造成一定压力

  实现方式:tomcat本身已支持该功能

  tomcat的会话复制分为两种:

  全局复制(DeltaManager):复制会话中的变更信息到集群中的所有其他节点。 非全局复制(BackupManager):它会把Session复制给一个指定的备份节点。

  

  Session共享

  SpringSession+Redis方式实现