1、Nginx为什么不使用多线程?apache:创建多个进程或线程,而每个进程或线程都会为其分配cpu和内存(线程要比进程小的多,所以worker支持比perfork高的并发),并发过大会榨干服务器资源。Nginx:采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量)(epoll),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换。所以才使得Nginx支持更高的并发。2、Nginx为什么不使用多线程?采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换,所以才使得Nginx支持更高的并发。3、Nginx主要特性?支持SSL 和TLSSNI. Nginx它支持内核Poll模型,能经受高负载的考验,有报告表明能支持高达50,000个并发连接数。Nginx具有很高的稳定性。例如当前 apache一旦上到200个以上进程,web响应速度就明显非常缓慢了。而Nginx采取了分阶段资源分配技术,使得它的CPU与内存占用率非常低。nginx官方表示保持10,000个没有活动的连接,它只占2.5M内存,所以类似DOS这样的攻击对nginx来说基本上是毫无用处的。Nginx支持热部署。它的启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。对软件版本进行进行热升级。Nginx采用master-slave模型,能够充分利用SMP的优势,且能够减少工作进程在磁盘IO的阻塞延迟。当采用select()/poll()调用时,还可以限制每个进程的连接数。Nginx采用master-slave模型,能够充分利用SMP的优势,且能够减少工作进程在磁盘IO的阻塞延迟。当采用select()/poll()调用时,还可以限制每个进程的连接数。Nginx采用了一些os提供的最新特性如对sendfile (Linux2.2+), accept-filter (FreeBSD4.1+),TCP_DEFER_ACCEPT (Linux 2.4+)的支持,从而大大提高了性能。免费开源,可以做高并发负载均衡。4、Nginx常用命令1、启动1、Nginx为什么不使用多线程?apache:创建多个进程或线程,而每个进程或线程都会为其分配cpu和内存(线程要比进程小的多,所以worker支持比perfork高的并发),并发过大会榨干服务器资源。Nginx:采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量)(epoll),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换。所以才使得Nginx支持更高的并发。2、Nginx为什么不使用多线程?采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换,所以才使得Nginx支持更高的并发。3、Nginx主要特性?支持SSL 和TLSSNI. Nginx它支持内核Poll模型,能经受高负载的考验,有报告表明能支持高达50,000个并发连接数。Nginx具有很高的稳定性。例如当前 apache一旦上到200个以上进程,web响应速度就明显非常缓慢了。而Nginx采取了分阶段资源分配技术,使得它的CPU与内存占用率非常低。nginx官方表示保持10,000个没有活动的连接,它只占2.5M内存,所以类似DOS这样的攻击对nginx来说基本上是毫无用处的。Nginx支持热部署。它的启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。对软件版本进行进行热升级。Nginx采用master-slave模型,能够充分利用SMP的优势,且能够减少工作进程在磁盘IO的阻塞延迟。当采用select()/poll()调用时,还可以限制每个进程的连接数。Nginx采用master-slave模型,能够充分利用SMP的优势,且能够减少工作进程在磁盘IO的阻塞延迟。当采用select()/poll()调用时,还可以限制每个进程的连接数。Nginx采用了一些os提供的最新特性如对sendfile (Linux2.2+), accept-filter (FreeBSD4.1+),TCP_DEFER_ACCEPT (Linux 2.4+)的支持,从而大大提高了性能。免费开源,可以做高并发负载均衡。4、Nginx常用命令1、启动7、Nginx怎么做的动静分离?只需要指定路径对应的目录。location/可以使用正则表达式匹配。并指定对应的硬盘中的目录。如下:8、什么是动静分离?动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路,实际上,何谓动?何谓静呢?拿我们 Java 来说 jsp、servlet 等就是动,因为他们离开我们的 web 服务器的支持就会无法正常工作。而 js、css 等文件就是静了。因为离开 web 服务器他一样能正常的工作。动静分离简单的概括是:动态文件与静态文件的分离。9、Nginx动静态资源分离做过吗,为什么要这样做?动态资源、静态资源分离,是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来。比如说 js、css、hrml从A服务器返回。图片从B服务器返回,其他请求从Tomcat服务器C返回。后台应用分开部署,提高用户访问静态代码的速度。而且现在还有CDN服务,不需要限制于服务器的带宽。10、Nginx如何做动静分离Nginx 根据客户端请求的 url 来判断请求的是否是静态资源,如果请求的 url 包含 jpg、png,则由 Nginx 处理。如果请求的 url 是 .php 或者 .jsp 等等,这个时候这个请求是动态的,将转发给 tomcat 处理。总结来说,Nginx 是通过 url 来区分请求的类型,并转发给不同的服务端。11、Nginx动静分离的好处api 接口服务化:动静分离之后,后端应用更为服务化,只需要通过提供 api 接口即可,可以为多个功能模块甚至是多个平台的功能使用,可以有效的节省后端人力,更便于功能维护。前后端开发并行:前后端只需要关心接口协议即可,各自的开发相互不干扰,并行开发,并行自测,可以有效的提高开发时间,也可以有些的减少联调时间减轻后端服务器压力,提高静态资源访问速度:后端不用再将模板渲染为 html 返回给用户端,且静态服务器可以采用更为专业的技术提高静态资源的访问速度。12、Nginx 和 Apache、Tomcat 之间的不同点Tomcat 和Nginx/Apache区别:Nginx/Apache 是Web Server,而Apache Tomact是一个servlet containertomcat可以对jsp进行解析,nginx和apache只是web服务器,可以简单理解为只能提供html静态文件服务。Nginx和Apache区别:Nginx轻量级,同样起web 服务,比apache占用更少的内存及资源 。Nginx 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能 。Nginx提供负载均衡,可以做做反向代理,前端服务器Nginx多进程单线程,异步非阻塞;Apache多进程同步,阻塞。13、Nginx和Apache 之间的不同点nginxapache1.nginx 是一个基于web服务器1.Apache 是一个基于流程的服务器2.所有请求都由一个线程来处理2.单线程处理单个请求3.nginx避免子进程的概念3.apache是基于子进程的4.nginx类似于速度4.apache类似于功率5.nginx在内存消耗和连接方面比较好5.apache在内存消耗和连接方面并没有提高6.nginx在负载均衡方面表现较好6.apache当流量达到进程的极限时,apache将拒绝新的连接7.对于PHP来说,nginx更可取,因为他支持PHP7.apache支持的php python Perl和其他语言,使用插件,当应用程序基于python和ruby时,它非常有用8.nginx 不支持像ibmi 和 openvms 一样的os8.apache支持更多的os9.nginx 只具有核心功能9.apache 提供了比Nginx更多的功能10.nginx 性能和可伸缩性不依赖于硬件10.apache 依赖于CPU和内存等硬件组件9、Nginx动静态资源分离做过吗,为什么要这样做?动态资源、静态资源分离,是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来。比如说 js、css、hrml从A服务器返回。图片从B服务器返回,其他请求从Tomcat服务器C返回。后台应用分开部署,提高用户访问静态代码的速度。而且现在还有CDN服务,不需要限制于服务器的带宽。10、Nginx如何做动静分离Nginx 根据客户端请求的 url 来判断请求的是否是静态资源,如果请求的 url 包含 jpg、png,则由 Nginx 处理。如果请求的 url 是 .php 或者 .jsp 等等,这个时候这个请求是动态的,将转发给 tomcat 处理。总结来说,Nginx 是通过 url 来区分请求的类型,并转发给不同的服务端。11、Nginx动静分离的好处api 接口服务化:动静分离之后,后端应用更为服务化,只需要通过提供 api 接口即可,可以为多个功能模块甚至是多个平台的功能使用,可以有效的节省后端人力,更便于功能维护。前后端开发并行:前后端只需要关心接口协议即可,各自的开发相互不干扰,并行开发,并行自测,可以有效的提高开发时间,也可以有些的减少联调时间减轻后端服务器压力,提高静态资源访问速度:后端不用再将模板渲染为 html 返回给用户端,且静态服务器可以采用更为专业的技术提高静态资源的访问速度。12、Nginx 和 Apache、Tomcat 之间的不同点Tomcat 和Nginx/Apache区别:Nginx/Apache 是Web Server,而Apache Tomact是一个servlet containertomcat可以对jsp进行解析,nginx和apache只是web服务器,可以简单理解为只能提供html静态文件服务。Nginx和Apache区别:Nginx轻量级,同样起web 服务,比apache占用更少的内存及资源 。Nginx 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能 。Nginx提供负载均衡,可以做做反向代理,前端服务器Nginx多进程单线程,异步非阻塞;Apache多进程同步,阻塞。13、Nginx和Apache 之间的不同点nginxapache1.nginx 是一个基于web服务器1.Apache 是一个基于流程的服务器2.所有请求都由一个线程来处理2.单线程处理单个请求3.nginx避免子进程的概念3.apache是基于子进程的4.nginx类似于速度4.apache类似于功率5.nginx在内存消耗和连接方面比较好5.apache在内存消耗和连接方面并没有提高6.nginx在负载均衡方面表现较好6.apache当流量达到进程的极限时,apache将拒绝新的连接7.对于PHP来说,nginx更可取,因为他支持PHP7.apache支持的php python Perl和其他语言,使用插件,当应用程序基于python和ruby时,它非常有用8.nginx 不支持像ibmi 和 openvms 一样的os8.apache支持更多的os9.nginx 只具有核心功能9.apache 提供了比Nginx更多的功能10.nginx 性能和可伸缩性不依赖于硬件10.apache 依赖于CPU和内存等硬件组件15、Nginx与Apache选择Apache● apache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache● apache 发展到现在,模块超多,基本想到的都可以找到● apache 更为成熟,少 bug ,nginx 的 bug 相对较多● apache 超稳定● apache 对 PHP 支持比较简单,nginx 需要配合其他后端用● apache 在处理动态请求有优势,nginx 在这方面是鸡肋,一般动态请求要 apache 去做,nginx 适合静态和反向。● apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区Nginx● 轻量级,采用 C 语言 进行编写,同样的 web 服务,会占用更少的内存及资源● 抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比 apache 高很多,而 apache 则是阻塞型的。在高并发下 nginx 能保持低资源低消耗高性能 ,而 apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。● nginx 处理静态文件好,静态处理性能比 apache 高三倍以上● nginx 的设计高度模块化,编写模块相对简单● nginx 配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题,apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃● nginx 作为负载均衡服务器,支持 7 层负载均衡● nginx 本身就是一个反向代理服务器,而且可以作为非常优秀的邮件代理服务器● 启动特别容易, 并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动,还能够不间断服务的情况下进行软件版本的升级● 社区活跃,各种高性能模块出品迅速16、Nginx如何处理HTTP请求。Nginx使用反应器模式。主事件循环等待操作系统发出准备事件的信号,这样数据就可以从套接字读取,在该实例中读取到缓冲区并进行处理。单个线程可以提供数万个并发连接。17、Nginx是如何处理一个请求的呢?首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在nginx的master进程里面,先初始化好这个监控的socket,再进行listen然后再fork出多个子进程出来, 子进程会竞争accept新的连接。此时,客户端就可以向nginx发起连接了。当客户端与nginx进行三次握手,与nginx建立好一个连接后,此时,某一个子进程会accept成功,然后创建nginx对连接的封装,即ngx_connection_t结构体,接着,根据事件调用相应的事件处理模块,如http模块与客户端进行数据的交换,最后,nginx或客户端来主动关掉连接,到此,一个连接就寿终正寝了18、Nginx处理HTTP请求过程的 11 个阶段?Nginx 处理 HTTP 请求的过程大概可以分为 11 个阶段,如下:Read Request Headers:解析请求头。Identify Configuration Block:识别由哪一个 location 进行处理,匹配 URL。Apply Rate Limits:判断是否限速。例如可能这个请求并发的连接数太多超过了限制,或者 QPS 太高。18、Nginx处理HTTP请求过程的 11 个阶段?Nginx 处理 HTTP 请求的过程大概可以分为 11 个阶段,如下:Read Request Headers:解析请求头。Identify Configuration Block:识别由哪一个 location 进行处理,匹配 URL。Apply Rate Limits:判断是否限速。例如可能这个请求并发的连接数太多超过了限制,或者 QPS 太高。Perform Authentication:连接控制,验证请求。例如可能根据 Referrer 头部做一些防盗链的设置,或者验证用户的权限。Generate Content:生成返回给用户的响应。为了生成这个响应,做反向代理的时候可能会和上游服务(Upstream Services)进行通信,然后这个过程中还可能会有些子请求或者重定向,那么还会走一下这个过程(Internal redirects and subrequests)。Response Filters:过滤返回给用户的响应。比如压缩响应,或者对图片进行处理。Log:记录日志。以上这七个步骤从整体上介绍了一下处理流程,下面还会再说一下实际的处理过程。18、Nginx处理HTTP请求的11个阶段下面介绍一下详细的 11 个阶段,每个阶段都可能对应着一个甚至多个 HTTP 模块,通过这样一个模块对比,我们也能够很好的理解这些模块具体是怎么样发挥作用的。0Nginx处理HTTP请求过程.pngPOST_READ:在 read 完请求的头部之后,在没有对头部做任何处理之前,想要获取到一些原始的值,就应该在这个阶段进行处理。这里面会涉及到一个 realip 模块。SERVER_REWRITE:和下面的 REWRITE 阶段一样,都只有一个模块叫 rewrite 模块,一般没有第三方模块会处理这个阶段。FIND_CONFIG:做 location 的匹配,暂时没有模块会用到。REWRITE:对 URL 做一些处理。POST_WRITE:处于 REWRITE 之后,也是暂时没有模块会在这个阶段出现。接下来是确认用户访问权限的三个模块:PREACCESS:是在 ACCESS 之前要做一些工作,例如并发连接和 QPS 需要进行限制,涉及到两个模块:limt_conn 和 limit_reqACCESS:核心要解决的是用户能不能访问的问题,例如 auth_basic 是用户名和密码,access 是用户访问 IP,auth_request 根据第三方服务返回是否可以去访问。POST_ACCESS:是在 ACCESS 之后会做一些事情,同样暂时没有模块会用到。最后的三个阶段处理响应和日志:PRECONTENT:在处理 CONTENT 之前会做一些事情,例如会把子请求发送给第三方的服务去处理,try_files 模块也是在这个阶段中。CONTENT:这个阶段涉及到的模块就非常多了,例如 index, autoindex, concat 等都是在这个阶段生效的。LOG:记录日志 access_log 模块。以上的这些阶段都是严格按照顺序进行处理的,当然,每个阶段中各个 HTTP 模块的处理顺序也很重要,如果某个模块不把请求向下传递,后面的模块是接收不到请求的。而且每个阶段中的模块也不一定所有都要执行一遍,下面就接着讲一下各个阶段模块之间的请求顺序。19、Nginx处理HTTP请求的11个阶段的顺序处理如下图所示,每一个模块处理之间是有序的,那么这个顺序怎么才能得到呢?其实非常简单,在源码 ngx_module.c 中,有一个数组 ngx_module_name,其中包含了在编译 Nginx 的时候的 with 指令所包含的所有模块,它们之间的顺序非常关键,在数组中顺序是相反的。19、Nginx处理HTTP请求的11个阶段的顺序处理如下图所示,每一个模块处理之间是有序的,那么这个顺序怎么才能得到呢?其实非常简单,在源码 ngx_module.c 中,有一个数组 ngx_module_name,其中包含了在编译 Nginx 的时候的 with 指令所包含的所有模块,它们之间的顺序非常关键,在数组中顺序是相反的。灰色部分的模块是 Nginx 的框架部分去执行处理的,第三方模块没有机会在这里得到处理。在依次向下执行的过程中,也可能不按照这样的顺序。例如,在 access 阶段中,有一个指令叫 satisfy,它可以指示当有一个满足的时候就直接跳到下一个阶段进行处理,例如当 access 满足了,就直接跳到 try_files 模块进行处理,而不会再执行 auth_basic、auth_request 模块。在 content 阶段中,当 index 模块执行了,就不会再执行 auto_index 模块,而是直接跳到 log 模块。整个 11 个阶段所涉及到的模块和先后顺序如下图所示:21、在Nginx中,如何使用未定义的服务器名称来阻止处理请求?只需将请求删除的服务器, 可以定义为:这里,服务器名被保留为一个空字符串,它将在没有"主机"头字段的情况下匹配请求,而一个特殊的Nginx的非标准代码444被返回,从而终止连接。
相关推荐
M78佐菲1 小时前
Linux学习笔记:文件IOVcaker1 小时前
Linux学习22-openstack部署与使用智购科技自动贩卖机2 小时前
自动售货机嵌入式系统Go语言开发实践:从资源受限设备到RTOS协程调度的工程化之路姓刘的哦2 小时前
STM32的启动流分析XUEYUAN52122 小时前
代理日志分析与监控:代理池健康状态巡检与分级告警体系搭建(运维实战)Fcy6482 小时前
Linux下 Socket编程 —— UDP网络编程酒神dnspup3 小时前
服务器端口检测怎么做?用 DNSPup 核对开放端口、监听服务与暴露风险lajidecrd3 小时前
Ubuntu 24.04 LTS安装沫璃染墨3 小时前
《从零入门Linux系统篇(二十九):文件篇·二——深入文件描述符:从文件描述符表到重定向,再到Shell实现》