Nginx——1.基础知识

作为高速、轻量、高性能等优点集于一身的服务器,Nginx在近些年迅速发展并不断扩大市场份额,甚至在最近其市场份额一举超过微软的IIS,跃身到第二位,仅次于Apache。

但是由于其高性能的特点,尤其适用于高流量网站,在全球前 10,000个站点中的市场份额为58.4%,稳居第一。

Nginx的诞生

Nginx是俄罗斯人Igor Sysoev在2002年开发的一个HTTP站点服务器,它被声称可以每天处理5亿个请求。并于2004年公开,使用BSD开源协议,能运行在几乎所有主流的操作系统上。

在Nginx诞生的年代,软件界中有一个问题被大家讨论得最为热烈,那就是C10K问题(如何解决10万个客户端的并发请求问题)。

即使当时的硬件规格依旧在不断上升,但是如果像Apache HTTP那样对于每一个请求都要单独分成一个进程或者线程来执行,进程号或者线程堆栈这些系统资源将不可避免地会被耗尽。因此,轻量级服务器势在必行。

在当时,为了解决C10K问题,还有其它两款轻量级Web服务器被广泛关注————lighttpdBoa,但是它们的表现性能都难以企及Nginx。

Nginx的反向代理

Nginx能在众多轻量级服务器中脱颖而出的一个很重要的原因,就是它拥有超强的反向代理能力。

不同于一般中小型网站的服务器直接接受用户请求,然后运行对应的PHP、Java等程序代码,反向代理是把反向代理服务器作为接受用户请求的终端,然后在其后方在配置若干真正提供服务的web应用服务器。

反向代理服务器一般会根据请求的任务类型和备选逻辑服务器的负载情况进行任务分发(负载均衡)。

除此以外Nginx支持HTTPS的SSL/TLS协议,可以为本来不具备此功能的应用添加HTTPS支持(用户与反向代理服务器通过有加密功能的HTTPS进行通信,反向代理服务器再通过安全的内网直接和各逻辑服务器通信)。

同时,反向代理服务器还能缓存各种静态资源(如图片文件和HTML文件),这使得它十分善于处理大量的重复请求。

除了上面提到的最主流的HTTP/HTTPS以外,Nginx也能处理SMTP、IMAP、POP3等协议的负载均衡。甚至很快也能支持“下一代的HTTP”——SPDY协议。

谈谈模块的扩展

因为Nginx是一个轻量级的Web服务器,因此除了反向代理和资源缓存等核心功能外,要尽可能地避免添加不必要的功能模块。

当然,Nginx不乏许多优秀的标准库和第三方模块,比如流量和连接监控和限制、图像格式转换等等。

但是,如果要添加新模块的话,必须将整个程序重新编译。虽然这样不如Apache HTTP的动态加载来得方便,但是可以保证运行效率的最大化和占用资源的最小化。

Nginx一般有各种各样的安装包,里面附带有不尽相同的非核心模块,在安装前务必了解清楚。

如何处理动态资源

Nginx很擅长负载均衡和处理HTML文件和图片等静态资源,但是除了SSI(Server Side Include)技术以外基本不能够自己动态地生成资源。

这时,其实我们可以通过UNIX Domain Socket来让其他进程处理并返回对应的动态资源。如果该进程位于其他机器上,则可以通过TCP来进行通信。

特别地,对于和PHP程序之间的通信可以使用FastCGI,对于Python可以使用uWSGI,对于Ruby on Rails可以使用Phusion Passenger

高性能的秘诀————事件驱动

Nginx之所以能同时处理大量的请求,原因在于它采用了十分巧妙的事件驱动机制。

作为一个Web服务器,要同时处理多个请求,不可避免地要面对这么一个问题,如何同时处理像磁盘和网络等等的I/O请求,即如何实现I/O复用。

为了解决该问题,操作系统在很久之前就开始提供诸如“select”、“poll”等系统调用。Apache HTTP的多处理模块(MPM,multi-processing module)就会用到这些系统调用。

但是,select/poll为了识别出哪些文件或者socket已经准备就绪,必须将所有已注册的文件描述符(fd)一个个地检查一遍。如果注册列表越长,那么每次的扫描所需的时间也越长。

而Nginx的I/O复用机制使用的是“epoll”这个基于事件驱动的系统调用。因为epoll会在系统内核管理和监听这些文件描述符(fd),并自动把就绪的加入到Ready队列当中。

所以,程序只需在需要时往Ready队列中取出一个进行处理即可,而不用切换到内核态,然后一个个地检查,然后又切换回用户态。

这样,无论需要注册监听的I/O有多少,都不会影响程序的运行效率。

为了避免select/poll带来的线性增长的负担,Apache HTTP必须将这些IO分散到各个进程/线程中处理,这样势必会造成占用内存的增长。

但是,Nginx可以通过利用“epoll”,保证可以使用一个进程/线程完成所有请求的处理,这样可以大大减少内存的占用,从而使应对上万并发请求成为可能。

Apache VS Nginx

横坐标代表并发连接数 



Nginx——1.基础知识的更多相关文章

  1. nginx 的基础知识(二)

    Nginx 多进程网络模型 进程模型 nginx启动后以daemon的方式在后台运行,后台进程包括一个master进程和多个worker进程 master进程主要作用,接收来自外界的信号:向各work ...

  2. nginx 的基础知识(一)

    Nginx  HTTP 和 反向代理web服务器 epoll 占用少的系统资源.支持更多的并发连接 负载均衡 安装简单.配置灵活 热部署.启动快.不间断服务情况下对软件配置进行升级 反向代理 反向代理 ...

  3. nginx 的基础知识(三)

    Nginx命令 nginx -s reopen 重启nginx nginx -s reload  重新加载nginx文件 nginx -s stop  停止nginx服务 nginx -s quit ...

  4. nginx Location 语法基础知识

    URL地址匹配是Nginx配置中最灵活的部分 Location 支持正则表达式匹配,也支持条件匹配,用户可以通过location指令实现Nginx对动丶静态网页的过滤处理. Nginx locatio ...

  5. Nginx入门篇-基础知识与linux下安装操作

    我们要深刻理解学习NG的原理与安装方法,要切合实际结合业务需求,应用场景进行灵活使用. 一.Nginx知识简述Nginx是一个高性能的HTTP服务器和反向代理服务器,也是一个 IMAP/POP3/SM ...

  6. Nginx基础知识介绍

    Nginx基础知识介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Nginx概述 Nginx是免费的.开源的.高性能的HTTP和正向/反向代理服务器.邮件代理服务器.以及T ...

  7. day63:Linux:nginx基础知识&nginx基础模块

    目录 1.nginx基础知识 1.1 什么是nginx 1.2 nginx应用场景 1.3 nginx组成结构 1.4 nginx安装部署 1.5 nginx目录结构 1.6 nginx配置文件 1. ...

  8. nginx应用总结(1)-- 基础知识和应用配置梳理

    在linux系统下使用nginx作为web应用服务,用来提升网站访问速度的经验已五年多了,今天在此对nginx的使用做一简单总结. 一.nginx服务简介Nginx是一个高性能的HTTP和反向代理服务 ...

  9. Linux基础知识整理

    一.基础知识 1.Linux简介 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件 ...

随机推荐

  1. 如何平衡MMO游戏

    转自:http://blog.sina.com.cn/s/blog_9f56a65f01013eti.html 前言 这是一篇出自国外博客“Elder Game”的一篇文章,笔者觉得里面很多东西说的很 ...

  2. 数据库:ubantu下MySQL数据库备份方法

    1.编辑/etc/crontab文件设定定时任务,在制定时间执行backup_databases.sh vi /etc/crontab # /etc/crontab: system-wide cron ...

  3. springmvc----demo1---hello---bai

    import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import ...

  4. c#的日志插件NLog基本使用

    本文介绍c#的日志插件NLog 安装插件 创建logger 日志级别 书写日志信息 配置 包装器 布局 安装插件 直接下载插件包 Install-Package NLog.Config 创建logge ...

  5. JavaScript基本概念C - 真与假

    真与假 与 c 和 c++ 非常相似, 但与 Java 不同, JS中被认为true或false范围很广.所有对象 (空字符串除外) 和非零数字都被视为 true.空字符串.零.null 和undef ...

  6. SpringMVC的Date与String互转

    摘要:        项目里经常需要用到日期和String之间的转换,比如后台的Date对象以Json形式返回给前端页面的时候,希望转换为yyyy-MM-dd HH:mm:ss格式的字符串,而前端页面 ...

  7. windows 10微软账户不能访问局域网共享,但是本地账户可以访问

    windows10有时候无法访问局域网的共享文件夹.会提示没有权限. 如果共享的文件夹已经设置为everyone,那么通常是windows 10用的是微软账户登录的. 有两个方案可以处理这种情况. 一 ...

  8. 重命名File

    File completeFile = new File(mFilePath + mFileName); if (completeFile.exists()) { File fileWithSuffi ...

  9. [tensorflow]异或门的实现

    一段小程序:待理解 import tensorflow as tf import numpy as np #输入训练数据,这里是python的list, 也可以定义为numpy的ndarray x_d ...

  10. Ros学习topic——小海龟

    ROS Topics 1.rqt_graph:创建一个显示当前系统运行情况的动态图形 安装 $ sudo apt-get install ros-<distro>-rqt $ sudo a ...