0.1 学习nginx目标

会用就行,不要研究过深,nginx不是Java知识体系的,因为我们不是专业的运维人员,我们学习的目标是为了帮我们Java程序员搭建架构体系,你知道nginx能做哪些事情,在架构体系中能干哪些事情就行了.

0.2 Nginx是什么

是一个俄罗斯的程序员,他觉得外部网关的程序做的性能都不够好,所以自己做了一个就叫做Nginx.

Nginx 是俄罗斯人编写的十分轻量级的 HTTP 服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个 IMAP/POP3/SMTP 代理服务器。
Nginx 因为它的稳定性、丰富的模块库、灵活的配置和低系统资源的消耗而闻名.业界一致认为它是 Apache2.2+mod_proxy_balancer 的轻量级代替者,不仅是因为响应静态页面的速度非常快,而且它的模块数量达到 Apache 的近 2/3。对 proxy 和 rewrite 模块的支持很彻底,还支持 mod_fcgi、ssl、vhosts ,适合用来做 mongrel clusters 的前端 HTTP 响应。
目前Nginx在国内很多大型企业都有应用,且普及率呈逐年上升趋势。选择Nginx的理由也很简单:
第一,它可以支持5W高并发连接;
第二,内存消耗少;
第三,成本低。

0.3 Nginx使用场景

网关
所有的服务都以Nginx为准,所有的客户他记录的你的系统也好,你的任何的请求也好,他记住的你这个地址都是你这个网关的地址.也叫做门户,所有系统的门户的地址,都是nginx的地址.

虚拟主机
一台硬件服务器与nginx来做虚拟主机的话,nginx可以让客户感觉是访问很多台机器.

一台机器为不同的域名/ip/端口提供服务

路由

假如我电商的体系,入口是nginx来负责的,但是电商的各个业务是分不同的业务模块儿,比如商品服务器,订单服务器它在后台是不一样的,假如我访问的url后面跟的是abc的这样一个path路径的,我可以把你路由到商品服务器上,我如果path路径是订单的,我可以给你路由到订单服务器上.
也就是nginx根据你url里面的内容路径不同给你选择不同的路由器,给你定向不同的地方,这样一个功能就是路由功能.

使用反向代理,整合后续服务为一个完整业务

静态服务器
我开发了一个静态的HTML,它里面包含了css/js/img等等,如果我浏览器想要直接访问,就需要有一个服务器帮我把它读取出来,传给我的浏览器.毕竟我静态的图片是放在我服务器磁盘上的,我浏览器访问我图片肯定是通过HTML过来的,来读取这个文件的内容,这样浏览器才能获取到.
这个时候nginx就是一个读取静态文件的一个非常高效的服务器,基本上我们静态服务器性能最高的就是nginx了.

负载集群
我如果有一个电商,nginx把路由到商品服务器之后,如果商品服务器访问量非常大,我一台Tomcat是扛不住的,于是我可能有很多台Tomcat都跑着商品服务器来承担压力,此时nginx就可以把这么多的服务器来做成一个负载集群,假如十台服务器,那么每台服务器就承受10分之一的访问量.

网络安全
从用户的浏览器到我们的服务器中间的一段过程里面是整个的外网的网络上来进行的,网络上的这些东西就会被抓包,比如说有一些黑客来监听我们的数据,我们服务器本来返回给浏览器的数据在网络上就会被一些监听软件监听,那么这个时候就会有安全问题.此时我们就可以给浏览器加一个https的服务,做一些加密方面的

当然微服务之间组合还会有跨域这样的小配置点,防盗链的小功能点就很小了就不说了

1 Nginx架构设计

1.1 Nginx的模块化设计

高度模块化的设计是 Nginx 的架构基础。Nginx 服务器被分解为多个模块,每个模块就是一个功能模块,只负责自身的功能,模块之间严格遵循“高内聚,低耦合”的原则。
01.[Nginx]概念 - 图1

  • 核心模块

核心模块是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能。

  • 标准 HTTP 模块

标准 HTTP 模块提供 HTTP 协议解析相关的功能,如:端口配置、网页编码设置、HTTP 响应头设置等。

  • 可选 HTTP 模块(nginx默认是有这些的,只是不启动,需要程序员手动启用)

可选 HTTP 模块主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,如:Flash 多媒体传输、解析 GeoIP 请求、SSL 支持等。

  • 邮件服务模块(基本没什么公司会用这个)

邮件服务模块主要用于支持 Nginx 的邮件服务,包括对 POP3 协议、IMAP 协议和 SMTP 协议的支持。

  • 第三方模块(最重要的是这个,可以程序员自己扩展第三方.)

第三方模块是为了扩展 Nginx 服务器应用,完成开发者自定义功能,如:Json 支持、Lua 支持等。

1.2 Nginx多进程模型

nginx为什么性能要高很多,一个原因是nginx的整体模型是多进程的模型,注意不是多线程,是多进程.

01.[Nginx]概念 - 图2
当nginx启动的时候,会有Master进程,Master只是一个管理者,Master负责读nginx的各项配置,来检测nginx的健康状态,可以监控用户和nginx之间的互动的一些管理性的命令指令,Master进程不做具体的事情,Master进程是一个领导.
Master进程会根据配置来启动多个Worker进程,这些Worker进程都是一些单独的进程,不是线程,当然一个进程里面默认是一个线程.

操作系统的资源 + 线程 = 进程

nginx内部是每一个进程就是一个线程来去访问对应的操作系统资源,这样就不会有线程安全问题和竞争关系,也就不会有因为锁导致的资源消耗.所以nginx的性能比较高的.

使用进程的好处是各个进程之间相互独立,不需要加锁,减少了使用锁对性能造成影响,同时降低编程的复杂度,降低开发成本。

其次,采用独立的进程,可以让进程互相之间不会影响,如果一个进程发生异常退出时,其它进程正常工作,master 进程则很快启动新的 worker 进程,确保服务不中断,将风险降到最低。

缺点是操作系统生成一个子进程需要进行内存复制等操作,在资源和时间上会产生一定的开销;当有大量请求时,会导致系统性能下降。

然后每一个Worker进程会去做用户的任务,比如读取静态文件负载均衡等等.

Nginx会按需同时运行多个进程:
一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程(cache manager)等。
所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。
主进程以root用户身份运行,而worker、cache loader和cache manager均应以非特权用户身份(user配置项)运行。

主进程主要完成如下工作:
1. 读取并验正配置信息;
2. 创建、绑定及关闭套接字;
3. 启动、终止及维护worker进程的个数;
4. 无须中止服务而重新配置工作特性;
5. 重新打开日志文件;

worker进程主要完成的任务包括:
1. 接收、传入并处理来自客户端的连接;
2. 提供反向代理及过滤功能;
3. nginx任何能完成的其它任务;

1.3 epoll模式

nginx用的是epoll模型,用的是惊群方式

nginx监控的是我们网络上的http请求,当有一个http请求的包通过网络发送到网卡的时候,会触发一个event事件,会引发一个poll的动作,会让所有的线程都惊醒,然后所有的线程,每一个线程来询问网卡是否有网络包过来,最终有一个线程竞争成功来进行这次任务,这样的过程就是epoll 模式 .

01.[Nginx]概念 - 图3

select和poll的处理模式如上图:
—在某一时刻,进程收集所有的连接,其实这100万连接中大部分是没有事件发生的。因此,如果每次收集事件时,都把这100万连接的套接字传给操作系统(这首先就是用户态内存到内核内存的大量复制),而由操作系统内核寻找这些链接上没有处理的事件,将会是巨大的浪费。
而epoll改进了收集连接的动作,提高效率。

epoll的优点:

1.支持一个进程打开大数目的socket描述符(FD)
2.IO效率不随FD数目增加而线性下降
3.使用mmap加速内核与用户空间的消息传递

1.4 正向代理与反向代理

  1. 代理:意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

步骤:
1.用户发送请求到自己的代理服务器
2、自己的代理服务器发送请求到服务器
3、服务器将数据返回到自己的代理服务器
4、自己的代理服务器再将数据返回给用户
假如我要去国外买东西,我人去不了,于是我让代购帮我去买东西,他买了之后把东西给我,于是这就是正向代理,代理的是需求方,这就是正向代理.

作用:正向代理隐藏了用户,用户的请求被代理服务器接收代替,到了服务器,服务器并不知道用户是谁。
用途:当你用浏览器访问国外的网站时,被block(拒绝)时,你可以在国外搭建一个代理服务器,这样就可以正常访问了(只是举一个列子)

01.[Nginx]概念 - 图4

  1. 反向代理,服务端推出的一个代理招牌。

反向代理:reverse proxy,是指用代理服务器来接受客户端发来的请求,然后将请求转发给内网中的上游服务器,上游服务器处理完之后,把结果通过nginx返回给客户端。

1.用户发送请求到服务器(访问的其实是反向代理服务器,但用户不知道)
2、反向代理服务器发送请求到真正的服务器
3、真正的服务器将数据返回给反向代理服务器
4、反向代理服务器再将数据返回给用户

反向代理是对于来自外界的请求,先通过nginx统一接受,然后按需转发给内网中的服务器,并且把处理请求返回给外界客户端,此时代理服务器对外表现的就是一个web服务器,客户端根本不知道“上游服务器”的存在。
反向代理是代理的服务器,
作用:用户请求过多,服务器会有一个处理的极限。所以使用反向代理服务器接受请求,再用均衡负载将请求分布给多个真实的服务器。既能提高效率还有一定的安全性。
用途:如果不采用代理,用户的IP、端口号直接暴露在Internet(尽管地址转换NAT),外部主机依然可以根据IP、端口号来开采主机安全漏洞,所以在企业网,一般都是采用代理服务器访问互联网。
01.[Nginx]概念 - 图5

两者区别

一个是用户向代理服务器发送的请求,一个是用户直接请求的目标主机,虽然都是代理服务器转发请求,但是用户看来是不一样的。
也是同上边所说的一样,正向代理服务器不知道真正是谁发的请求,反向代理服务器是用户不知道真正访问了哪个服务器。

两个代理服务器所存放的位置也不一样,正向代理服务器是专门来转接请求的,这点用户是知道的,所以用户直接访问代理服务器,用户希望代理服务器转交他的内容,因此正向代理服务器是放在用户与目标主机中间的。

与正向代理服务器不同,反向代理是用来保护目标主机服务器的,用户只知道自己访问了一个站点,并不知道是不是代理服务器,而代理服务器都是放在目标主机服务器端上的,通常都是使用第三方的反向代理服务器,目前用的最多的应该就是ngnix,ngnix可以帮助目标主机服务器做负载均衡,缓存等等,提高网站的访问速度。百度啦,淘宝啦,京东等都在用。

正向代理与反向代理最简单的区别:
正向代理隐藏的是用户,反向代理隐藏的是服务器