nginx的优点:
1、轻量,配置简洁
2、异步的,多个连接(万级别)可以在一个进程中处理(每个worker进程默认支持1024个连接数)
nginx 采用的是 多进程(单线程) + io多路复用(epoll)模型 实现高并发
通过eopll 对 多个文件描述符 ,通过事件回调机制对就绪描述符进行处理, 实现单线程io复用
3、nginx适合做静态请求,简单,效率高,占用更少的内存及资源,前端一般用nginx作为反向代理
4 功能丰富:Nginx提供负载均衡,可以做做反向代理,前端服务器
进程模型
nginx采用一个master进程,多个woker进程的模式 实现对 多cpu 的利用
- master进程主要负责收集、分发请求。当一个请求过来时,master拉起一个worker进程负责处理这个请求。
- master进程也要负责监控woker的状态,保证高可靠性
- woker进程一般设置为跟cpu核心数一致。nginx的woker进程跟apache不一样。apche的进程在同一时间只能处理一个请求,所以它会开很多个进程,几百个。而nginx的woker进程在同一时间可以处理的请求数只受内存限制,因此可以处理多个请求。
worker_processes,工作进程数
1.默认:worker_processes: 1
2.调大:worker_processes: CPU核心数,(双核4线程,可以设置为4)
worker_connections,单个工作进程可以允许同时建立外部连接的数量
数字越大,能同时处理的连接越多
1.默认:worker_connections: 1024
2.调大:worker_connections: 100000,(调大到10万连接)
根据系统的最大打开文件数来调整,worker_connections进程连接数量要小于等于系统的最大打开文件数
理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。
事件模型
nginx是异步非阻塞的。
每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker不会这么傻等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。
web server的工作性质决定了每个request的大部份生命都是在网络传输中,实际上花费在server机器上的时间片不多。这是几个进程就解决高并发的秘密所在。
apache的优点:
1、配置稍微复杂,但rewrite强大
2、同步多进程模型,一个连接对应一个进程
3、apache适合处理动态请求,稳定,功能强
一般来说,需要性能的web 服务,用nginx。如果不需要性能只求稳定,那就apache吧!现在好多集群站,前端nginx抗并发,后端apache集群,配合一起使用!至于好与不好,只是相对的。
目前也有单独使用Nginx处理PHP请求:nginx转发给PHP-FPM模块来执行,也很稳定了。
为什么现在很多企业使用Nginx代替Apache?
http://www.ttlsa.com/news/why-use-nginx-not-apache/
客户端请求一个资源的时候,需要经历两部分:
1 客户端和服务端建立连接:也就是三次握手的过程。有些长连接场景,需要保持长时间的TCP/IP协议。对于一个大型的系统,服务器可能要同时承担和处理数以万计的并发连接。
Apache是同步多进程模型,Apache只有500条进程即500个HTTP连接的处理能力,很容易超负荷;
而Nginx是 异步的,多个连接(万级别)可以在一个进程中处理
2 应用程序处理部分,这部分承担了代码运算;在大多数系统中,这部分工作是最消耗RAM和CPU资源的,因此进程数量必须被严格限制;
目前有两个主要的解决方法。
第一个方法对之前使用Apache服务器的应用改动小:前端安装负载均衡服务器或者Nginx来处理客户端连接部分。像 HAProxy或者Nginx能轻松处理成千上万条并发的连接,Apache仅作为后端应用程序工作;
第二种方案,也是最通用的办法就是用Nginx替换Apache,同时使用PHP-PFM作为应用服务器。Nginx处理HTTP通讯协议,同时FPM处理后端应用程序部分
客户端http请求从服务器server到nginx到php响应返回整个流程?
客户端(浏览器)做出请求操作(输入网址、点击链接、提交表单)。
客户端对域名进行解析,向设定的 DNS 服务器请求 IP 地址。
客户端根据 DNS 服务器返回 IP 地址采用三次握手与服务端建立 TCP/IP 连接。
TCP/IP 连接成功后,客户端向服务端发送 HTTP 请求。
服务端的 Web Server 会判断 HTTP 请求的资源类型,进行内容分发处理;如果请求的资源为 PHP 文件,服务端软件会启动对应的 CGI 程序进行处理,并返回处理结果。
服务端将 Web Server 的处理结果响应给客户端
客户端接收服务端的响应,并渲染处理结果,如果响应内容需要请求其他静态资源,通过 CDN 加速访问所需资源。
客户端将渲染好的视图呈现出来并断开 TCP/IP 连接