特性
- 模块化设计,较好的扩展性,动态加载。
- 高可用性
- 支持热部署,不停机更新配置文件,升级版本,更换日志文件。
- 低内存消耗,10k keep-alive连接在非活动模式下大概2.5M。
- 事件驱动模型,Aio,mmap,sendfile。
传统网络传输过程
硬盘 >> kernel buffer >> user buffer>> kernel socket buffer >>协议栈
- 系统调用 read()产生一个上下文切换:从 user mode 切换到 kernel mode,然后 DMA 执行拷贝,把文件数据从硬盘读到一个 kernel buffer 里。
- 数据从 kernel buffer拷贝到 user buffer,然后系统调用 read() 返回,这时又产生一个上下文切换:从kernel mode 切换到 user mode。
- 系统调用write()产生一个上下文切换:从 user mode切换到 kernel mode,然后把步骤2读到 user buffer的数据拷贝到 kernel buffer(数据第2次拷贝到 kernel buffer),不过这次是个不同的 kernel buffer,这个 buffer和 socket相关联。
- 系统调用 write()返回,产生一个上下文切换:从 kernel mode 切换到 user mode ,然后 DMA 从 kernel buffer拷贝数据到协议栈。
开启sendfile后
硬盘 >> kernel buffer (快速拷贝到kernelsocket buffer) >>协议栈
- 系统调用sendfile()通过 DMA把硬盘数据拷贝到 kernel buffer,然后数据被 kernel直接拷贝到另外一个与 socket相关的 kernel buffer。这里没有 user mode和 kernel mode之间的切换,在 kernel中直接完成了从一个 buffer到另一个 buffer的拷贝。
- DMA 把数据从 kernelbuffer 直接拷贝给协议栈,没有切换,也不需要数据从 user mode 拷贝到 kernel mode,因为数据就在 kernel 里。
- sendfile是个比 read 和 write 更高性能的系统接口,sendfile 是将 in_fd 的内容发送到 out_fd ,而 in_fd 不能是 socket ,也就是只能文件句柄。
- 当 Nginx 是一个静态文件服务器的时候,开启 SENDFILE 配置项能大大提高 Nginx 的性能。
- 是当 Nginx 是作为一个反向代理来使用的时候,SENDFILE 则没什么用了,因为 Nginx 是反向代理的时候。 in_fd 就不是文件句柄而是 socket,此时就不符合 sendfile 函数的参数要求了。
综上所述,sendfile只能接受句柄参数,不能接收socket文件,静态服务器时开启可以大幅度提升性能,反向代理时由于传输socket,就无需开启了。
Nginx基本功能
- 静态资源的web服务器,不支持模块方式php,仅支持安装php-fpm(Tcp:9000,FastCGI通信方式),Apache内部有支持php的模块。
- 反向代理服务器,后端搭建多个web服务器,由Nginx进行七层调度,比LVS功能强,但是性能弱,LVS理论并发400万,Nginx 3万。
- LNMP架构中,如果想访问动态资源,FastCGI作为服务端,Nginx作为客户端;结构应该为 客户端–>Nginx服务器–>php-fpm–>DB。
- uWSGI Django架构服务器ÿ