文章目录
- 1. 什么是nginx
- 2. nginx具有哪些优势和性能
- 3. 简述为是那么要使用nginx
- 4. 为什么nginx性能这么高
- 5. nginx常用的算法
- 6. nginx是如何处理一个请求的呢
- 7. nginx处理一个请求的过程
- 8. 简述动态资源与静态资源分离
- 9. 动静资源分离的原因
- 10. 简述负载均衡
- 11. 正向代理与反向代理
nginx是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
nginx很快:在正常情况下,单次请求会得到更快的响应;在高峰期(如有数以万计的并发请求),nginx可以比其他Web服务器更快地响应请求。
高扩展性和跨平台:nginx的设计极具扩展性,它完全是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。因此,当对某一个模块修复Bug或进行升级时,可以专注于模块自身,无须在意其他。而且在HTTP模块中,还设计了HTTP过滤器模块:一个正常的HTTP模块在处理完请求后,会有一串HTTP过滤器模块对请求的结果进行再处理。这样,当我们开发一个新的HTTP模块时,不但可以使用诸如HTTP核心模块、events模块、log模块等不同层次或者不同类型的模块,还可以原封不动地复用大量已有的HTTP过滤器模块。这种低耦合度的优秀设计,造就了nginx庞大的第三方模块,当然,公开的第三方模块也如官方发布的模块一样容易使用。nginx的模块都是嵌入到二进制文件中执行的,无论官方发布的模块还是第三方模块都是如此。这使得第三方模块一样具备极其优秀的性能,充分利用nginx的高并发特性,因此,许多高流量的网站都倾向于开发符合自己业务特性的定制模块。
高可靠性:用于反向代理,宕机的概率微乎其微。高可靠性是我们选择nginx的最基本条件,因为Nginx的可靠性是大家有目共睹的,很多家高流量网站都在核心服务器上大规模使用nginx。nginx的高可靠性来自于其核心框架代码的优秀设计、模块设计的简单性;另外,官方提供的常用模块都非常稳定,每个worker进程相对独立,master进程在1个worker进程出错时可以快速“拉起”新的worker子进程提供服务。
低内存消耗:一般情况下,10 000个非活跃的HTTP Keep-Alive连接在nginx中仅消耗2.5MB的内存,这是Nginx支持高并发连接的基础。
单机支持10万以上的并发连接:这是一个非常重要的特性!随着互联网的迅猛发展和互联网用户数量的成倍增长,各大公司、网站都需要应付海量并发请求,一个能够在峰值期顶住10万以上并发请求的Server,无疑会得到大家的青睐。理论上,Nginx支持的并发连接上限取决于内存,10万远未封顶。当然,能够及时地处理更多的并发请求,是与业务特点紧密相关的。
热部署:master管理进程与worker工作进程的分离设计,使得nginx能够提供热部署功能,即可以在7×24小时不间断服务的前提下,升级nginx的可执行文件。当然,它也支持不停止服务就更新配置项、更换日志文件等功能。
最自由的BSD许可协议:这是Nginx可以快速发展的强大动力。BSD许可协议不只是允许用户免费使用Nginx,它还允许用户在自己的项目中直接使用或修改Nginx源码,然后发布。这吸引了无数开发者继续为Nginx贡献自己的智慧。
以上当然不是nginx的全部,拥有无数个官方功能模块、第三方功能模块使得Nginx能够满足绝大部分应用场景,这些功能模块间可以叠加以实现更加强大、复杂的功能,有些模块还支持nginx与Perl、Lua等脚本语言集成工作,大大提高了开发效率。这些特点促使用户在寻找一个Web服务器时更多考虑nginx,选择Nginx的核心理由还是它能在支持高并发请求的同时保持高效的服务。
因为其具有跨平台、配置简单、非阻塞、高并发连接(处理2-3万并发连接数,官方监测能支持5万并发)的优势。
内存消耗小:开启10个nginx才占150M内存 ,nginx处理静态文件好,耗费内存少。内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。节省宽带:支持GZIP压缩,可以添加浏览器本地缓存。稳定性高:宕机的概率非常小。接收用户请求是异步的:浏览器将请求发送到nginx服务器,它先将用户请求全部接收下来,再一次性发送给后端web服务器,极大减轻了web服务器的压力。一边接收web服务器的返回数据,一边发送给浏览器客户端,网络依赖性比较低。只要ping通就可以负载均衡,可以有多台nginx服务器。使用dns做负载均衡、事件驱动:通信机制采用epoll模型(nio2 异步非阻塞)。
它的事件处理机制是异步非阻塞事件处理机制,并且运用了epoll模型,提供了一个队列,排队解决。
round-robin:循环轮询算法是nginx默认的负载均衡算法,会把接收到的请求循环的分发给其包含的(当前可用的)服务器。如果设置了两台分发服务器10.0.0.1和10.0.0.2,nginx会把第一个请求发给10.0.0.1,会把第二个请求分发给10.0.0.2,第三个请求又分发给10.0.0.1,这就是所谓的循环轮询。
upstream app {
server 10.0.0.1;
server 10.0.0.2;
}
server {
listen 80;
location / {
proxy_pass http://app;
}
}
least-connected:最少连接,每次都找连接数最少的服务器来转发请求。如果10.0.0.1正在处理的请求数比10.0.0.2正在处理请求数少,如果再来一个请求,nginx会把请求交给10.0.0.1来处理。使用least-connected算法来配置:
upstream app {
least_conn;
server 10.0.0.1;
server 10.0.0.2;
}
server {
listen 80;
location / {
proxy_pass http://app;
}
}
ip-hash:据请求的客户端IP地址来决定当前请求应该交给谁,使用ip-hash算法时Nginx会确保来自同一客户端的请求都分发到同一服务器。
upstream app {
ip_hash;
server 10.0.0.1;
server 10.0.0.2;
}
server {
listen 80;
location / {
proxy_pass http://app;
}
}
weighted:weighted算法也就是权重算法,会根据每个服务的权重来分发请求,权重大的请求相对会多分发一点,权重小的会少分发一点。这通常应用于多个服务器的性能不一致时。需要使用权重算法时只需要在定义服务器组时在服务器后面指定参数weight。可以这样设置:
upstream app {
ip_hash;
server 10.0.0.1 weight 1;
server 10.0.0.2 weight 2;
}
server {
listen 80;
location / {
proxy_pass http://app;
}
}
nginx是采用单线程来异步非阻塞处理请求(管理员可以配置nginx主进程工作进程的数量),不会为每个请求分配cpu和内存资源。这节省了大量资源,同时也减少了大量的CPU的上下文切换,所以使得nginx支持更高的并发。
apache服务器是创建多个进程或多个线程,每个进程或线程都会被分配cpu和内存(线程要比进程小的多),并发过大会占用很多服务器资源。
首先,nginx启动时会解析配置文件,得到需要监听的ip和端口。在nginx的master进程中,初始化这个用于监听的socket进行监听。然后,主进程再分出多个子进程,子进程会等待竞争新的连接。这个时候,客户端发出连接nginx的请求,经过与nginx三次握手连接之后。某一个子进程会与客户端连接成功,然后创建nginx连接的封装,即ngx_connection_t结构。根据事件调用相应的事件处理模块。最后,nginx或者客户端主动关掉连接。
动态资源、静态资源分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来。动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作。这就是网站静态化处理的核心思路。动态资源、静态资源分离简单的概括是:动态文件与静态文件的分离。
在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的。这些不需要经过后台处理的文件称为静态文件,需要经过的处理的称为动态文件。如果我们在后台忽略客户端对静态文件的请求,但对后台的请求次数就明显增多了,造成后台服务器压力的增大。在我们对资源的响应速度有要求的时候,我们应该使用这种动静分离的策略去解决。动静分离将网站静态资源与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用的访问次数。一般我们将静态资源放到nginx中,动态资源转发到web服务器中。
简而言之:代理服务器将接收的请求均衡的分发到各服务器中。负载均衡主要解决网络拥塞问题,提高服务器响应速度,服务就近提供,达到更好的访问质量,减少后台服务器大并发压力。
.正向代理:一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器)。然后,代理向原始服务器转交请求并将获得的内容返回给客户端,此时代理服务器对外就表现为一个正向向代理服务器。正向代理总结就一句话就是:代理服务器代理的是客户端。
反向代理:代理服务器来接受网络上的连接请求,将请求发给内部网络上的服务器,并将从服务器上得到的结果返回给请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。反向代理总结就一句话:代理服务器代理的是服务端。
参考:
https://blog.csdn.net/ningyuxuan123/article/details/86705631
https://blog.csdn.net/Yang_Hui_Liang/article/details/90263906