Nginx反向代理服务器

一、Nginx简介

Nginx(engine x)是一个轻量级的、高性能的、基于 Http 的、反向代理服务器,静态 web 服务器。Nginx最初是由俄罗斯人Igor Sysoev(伊戈尔·赛索耶夫)使用C语言为俄罗斯访问量第二的Rambler.ru站点开发的一款服务器。2004 年 10 月发布第一个版本。 国内大型的站点,例如百度、京东、新浪、网易、腾讯、淘宝等,都使用了 Nginx。

Nginx的官网:http://nginx.org
二、代理服务器
1.正向代理

1.1 隐藏

解读:由于某种原因,客户端不能直接访问服务器,这个时候,就在客户端架设一个服务器(正向代理服务器),由该代理服务器去访问服务器,服务器再将资源响应给代理服务器,然后由代理服务器将资源返回给客户端。相对于服务器而言,它根本不知道客户端的存在(隐藏客户端)

1.3 提速

1.4 缓存

1.5 授权

解读:比如在公司我们要安全的访问互联网,首先必须要经过防火墙(定义了相关的规则或协议),如果符合这些规则就可以正常联网,如果不符合就不能联网。

2.反向代理

2.1 保护隐藏

解读:反向代理,代理的是服务端,代理服务器架设在服务端。我们访问的是服务器,但是实际上访问的是反向代理服务器。

2.2 分布式路由

2.3 负载均衡

2.4 动静分离

2.5 数据缓存

3.正向代理和反向代理的区别
1.正向代理:
	正向代理是客户端的代理。
	正向代理是架设在客户端的主机。
	客户端在使用代理服务器时,是知道其要真正访问的服务器地址的。
2.反向代理:
	反向代理是对服务端的代理。
	反向代理是架设在服务端的主机。
	客户端在使用代理服务器时,是不知道真正访问的服务器的地址的。
三、Nginx的特点
高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。
高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等。

响应时间:系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间。
吞吐量:单位时间内处理的请求数量。
QPS:每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。
并发用户数:同时承载正常使用系统功能的用户数量。例如一个即时通讯系统,同时在线量一定程度上代表了系统的并发用户数。

1.高并发
一个Nginx服务器在不做任何配置的情况下并发量可达1000左右。在硬件条件允许的前提下,Nginx可以支持高达5-10万的并发量(除了 Nginx的设置外,Linux主机需要做大量的设置来配合Nginx)。 对比一下Tomcat。Tomcat服务器默认的并发量为150(不做任何配置)。即,当有超过150个用户同时访问某 Servlet 时,Tomcat 的响应就会变得非常慢。

2.低消耗
官方给出的测试结果,10000个非活跃连接,在 Nginx 中仅消耗 2.5M内存。对于一般性的DoS攻击来说就不是事儿,但对于 DDoS 也会是问题。

3.热部署
可以在7*24小时不间断服务的前提下,进行Nginx版本的平滑升级Nginx配置文件的平滑修改。即在不停机的情况下升级Nginx,修改替换Nginx配置文件。

4.高可用
Nginx之所以可以实现高并发,是因为其具有很多工作进程 worker。当这些工作进程中的某些出现问题停止工作时,并不会影响整个系统的整体运行。因为其它worker会接替那些出问题的线程。

5.高扩展:http://openresty.org/cn/
Nginx之所以现在的用户很多,是因为很多功能都已经开发好并模块化。若需要哪些功能,只需要安装相应功能的扩展模块即可。根据编写扩展模块所使用的语言的不同,可以划分为两类:C语言扩展模块与LUA脚本扩展模块。

四、Nginx的下载与安装

1.Nginx的下载:http://nginx.org
2.创建downloads文件夹

mkdir download


3.切换到download目录

[root@localhost ~]# cd download


4.下载nginx

wget http://nginx.org/download/nginx-1.18.0.tar.gz


5.安装Nginx基础依赖包

yum -y install pcre-devel openssl openssl-devel


6.创建解压目录在/usr下创建 local/nginx目录,用于存放解压后的安装包程序。

mkdir /usr/local/nginx


7.解压nginx到/usr/local/nginx

tar -zxvf nginx-1.18.0.tar.gz -C /usr/local/nginx



8.进入nginx的安装目录usr/local/nginx,执行命令./configure生成makefile

./configure



9.编译安装makefile

make && make install

10.在usr/local/nginx/sbin目录下面存在名为nginx文件。

11.在这个目录下面我们可以启动或停止nginx

./nginx –s reload  启动nginx

注意:如果出现启动失败:

说明在日志文件夹中没有nginx.pid文件。此时需要执行启动方式

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf  #使用nginx -c的参数指定nginx.conf文件的位置

12.查看nginx的版本信息

./nginx -v

13.查看nginx启动后的进程信息

ps -ef | grep nginx


14.注意我们如果需要外网访问nginx,必须关闭虚拟机防火墙。

centOS6及以前版本使用命令: systemctl stop iptables.service
centOS7关闭防火墙命令: systemctl stop firewalld.service

15.随后访问ip即可看见nginx的欢迎页面

16.停止命令 nginx –s stop/quit

./nginx -s stop  强制停止 Nginx,无论当前工作进程是否正在处理工作。
./nginx -s quit  优雅停止 Nginx,使当前的工作进程完成当前工作后停止

五、nginx的性能调优

在Nginx性能调优中,有两个非常重要的理论点(面试点)需要掌握。所以,下面首先讲解这两个知识点,再进行性能调优的配置。

1.零拷贝(Zero Copy)

1.1 什么是零拷贝

1.零拷贝指的是,从一个存储区域到另一个存储区域的copy任务没有CPU参与。零拷贝通常用于网络文件传输,以减少CPU消耗和内存带宽占用,减少用户空间与CPU内核空间的拷贝过程,减少用户上下文与CPU内核上下文间的切换,提高系统效率。
2.用户空间指的是用户可操作的内存缓存区域,CPU 内核空间是指仅 CPU 可以操作的寄存器缓存及内存缓存区域。 
3.用户上下文指的是用户状态环境,CPU 内核上下文指的是 CPU 内核状态环境。 
4.零拷贝需要 DMA 控制器的协助。DMA,Direct Memory Access,直接内存存取,是 CPU 的组成部分,其可以在 CPU 内核(算术逻辑运算器 ALU 等)不参与运算的情况下将数据从一个地址空间拷贝到另一个地址空间。

1.2 传统的拷贝方式
下面均以“将一个硬盘中的文件通过网络发送出去”的过程为例,来详细详细分析不同拷贝方式的实现细节。
1.实现细节:首先通过应用程序的 read()方法将文件从硬盘读取出来,然后再调用 send()方法将文件发送出去。

2.总结:该拷贝方式共进行了4次用户空间与内核空间的上下文切换,以及4次数据拷贝,其中两次拷贝存在CPU参与。我们发现一个很明显的问题:应用程序的作用仅仅就是一个数据传输的中介,最后将kernel buffer中的数据传递到了socket buffer。显然这是没有必要的。所以就引入了零拷贝

1.3 零拷贝的方式
1.实现细节: Linux 系统(CentOS6 及其以上版本)对于零拷贝是通过 sendfile 系统调用实现的。

2.总结:该拷贝方式共进行了 2 次用户空间与内核空间的上下文切换,以及 3 次数据拷贝,但整 个拷贝过程均没有 CPU 的参与,这就是零拷贝。
我们发现这里还存在一个问题:kernel buffer 到 socket buffer 的拷贝需要吗?kernel buffer 与 socket buffer 有什么区别呢?DMA 控制器所控制的拷贝过程有一个要求,数据在源 头的存放地址空间必须是连续的。kernel buffer 中的数据无法保证其连续性,所以需要将数 据再拷贝到 socket buffer,socket buffer 可以保证了数据的连续性。
这个拷贝过程能否避免呢?可以,只要主机的 DMA 支持 Gather Copy 功能,就可以避 免由 kernel buffer 到 socket buffer 的拷贝。

1.4 Gather Copy DMA 零拷贝方式
由于该拷贝方式是由 DMA 完成,与系统无关,所以只要保证系统支持 sendfile 系统调用功能即可。
1.实现细节:该方式中没有数据拷贝到 socket buffer。取而代之的是只是将 kernel buffer 中的数据描 述信息写到了 socket buffer 中。数据描述信息包含了两方面的信息:kernel buffer 中数据的 地址及偏移量。

2.总结:该拷贝方式共进行了 2 次用户空间与内核空间的上下文切换,以及 2 次数据拷贝,并且整个拷贝过程均没有 CPU 的参与。
该拷贝方式的系统效率是高了,但与传统相比,也存在有不足。传统拷贝中 user buffer 中存有数据,因此应用程序能够对数据进行修改等操作;零拷贝中的 user buffer 中没有了数据,所以应用程序无法对数据进行操作了。Linux 的 mmap 零拷贝解决了这个问题。

1.5 mmap 零拷贝
mmap 零拷贝是对零拷贝的改进。当然,若当前主机的 DMA 支持 Gather Copy,mmap 同样可以实现 Gather Copy DMA 的零拷贝。
1.实现细节:该方式与零拷贝的唯一区别是,应用程序与内核共享了 Kernel buffer。由于是共享,所 以应用程序也就可以操作该 buffer 了。当然,应用程序对于 Kernel buffer 的操作,就会引发用户空间与内核空间的相互切换。

2.总结:该拷贝方式共进行了 4 次用户空间与内核空间的上下文切换,以及 2 次数据拷贝,并且 整个拷贝过程均没有 CPU 的参与。虽然较之前面的零拷贝增加了两次上下文切换,但应用 程序可以对数据进行修改了。

2.多路复用器 select|poll|epoll

1.基本知识
若要理解 select、poll 与 epoll 多路复用器的工作原理,就需要首先了解什么是多路复用器。而要了解什么是多路复用器,就需要先了解什么是“多进程/多线程连接处理模型”。
2.多进程/多线程连接处理模型

在该模型下,一个用户连接请求会由一个内核进程处理,而一个内核进程会创建一个应用程序进程,即 app 进程来处理该连接请求。应用程序进程在调用 IO 时,采用的是 BIO 通讯方式,即应用程序进程在未获取到 IO 响应之前是处于阻塞态的。
该模型的优点是,内核进程不存在对app 进程的竞争,一个内核进程对应一个app 进程。但,也正因为如此,所以其弊端也就显而易见了。需要创建过多的 app 进程,而该创建过程十分的消耗系统资源。且一个系统的进程数量是有上限的,所以该模型不能处理高并发的情况。

3.多路复用连接处理模型

在该模型下,只有一个 app 进程来处理内核进程事务,且 app 进程一次只能处理一个内 核进程事务。故这种模型对于内核进程来说,存在对 app 进程的竞争。
在前面的“多进程/多线程连接处理模型”中我们说过,app 进程只要被创建了就会执 行内核进程事务。那么在该模型下,应用程序进程应该执行哪个内核进程事务呢?谁的准备 就绪了,app 进程就执行哪个。但 app 进程怎么知道哪个内核进程就绪了呢?需要通过“多 路复用器”来获取各个内核进程的状态信息。那么多路复用器又是怎么获取到内核进程的状态信息的呢?不同的多路复用器,其算法不同。常见的有三种:select、poll 与 epoll。
app 进程在进行 IO 时,其采用的是 NIO 通讯方式,即该 app 进程不会阻塞。当一个 IO 结果返回时,app 进程会暂停当前事务,将 IO 结果返回给对应的内核进程。然后再继续执 行暂停的线程。  
该模型的优点很明显,无需再创建很多的应用程序进程去处理内核进程事务了,仅需一 个即可。

4.多路复用器工作原理

select 
select 多路复用器是采用轮询的方式,一直在轮询所有的相关内核进程,查看它们的进 程状态。若已经就绪,则马上将该内核进程放入到就绪队列。否则,继续查看下一个内核进 程状态。在处理内核进程事务之前,app 进程首先会从内核空间中将用户连接请求相关数据 复制到用户空间。  
该多路复用器的缺陷有以下几点:
对所有内核进程采用轮询方式效率会很低。因为对于大多数情况下,内核进程都不属于 就绪状态,只有少部分才会是就绪态。所以这种轮询结果大多数都是无意义的。
由于就绪队列底层由数组实现,所以其所能处理的内核进程数量是有限制的,即其能够 处理的最大并发连接数量是有限制的。 
从内核空间到用户空间的复制,系统开销大。

poll 
poll多路复用器的工作原理与select几乎相同,不同的是,由于其就绪队列由链表实现, 所以,其对于要处理的内核进程数量理论上是没有限制的,即其能够处理的最大并发连接数量是没有限制的(当然,要受限于当前系统中进程可以打开的最大文件描述符数 ulimit,后面会讲到)。

epoll 
epoll 多路复用是对 select 与 poll 的增强与改进。其不再采用轮询方式了,而是采用回调方式实现对内核进程状态的获取:一旦内核进程就绪,其就会回调 epoll 多路复用器,进入到多路复用器的就绪队列(由链表实现)。所以 epoll 多路复用模型也称为 epoll 事件驱动模型。
另外,应用程序所使用的数据,也不再从内核空间复制到用户空间了,而是使用 mmap 零拷贝机制,大大降低了系统开销。  
当内核进程就绪信息通知了 epoll 多路复用器后,多路复用器就会马上对其进行处理, 将其马上存放到就绪队列吗?不是的。根据处理方式的不同,可以分为两种处理模式:LT 模式与 ET 模式。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值