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方式实现