Apache

1.Apache HTTP服务器是 Robert McCool 在1995年写成,并在1999年开始在Apache软件基金会的 框架下进行开发。

由于Apache HTTP服务器是基金会最开始的一个项目也是最为有名的一个项目, 所以通常大家提到Apache这个词都是说的Apache HTTP Server。

2.Apache web服务器从1996年开始就是互联网上最为流行的HTTP服务器

Apache之所以这么流行 很大程度上是由于相比其他的软件项目,在Apache基金会的精心维护下他的文档十分的详尽还有 集成的支持服务。

3.Apache由于其可变性、高性能和广泛的支持,经常是系统管理员的首选

他可以通过一系列 的语言相关的扩展模块支持很多解释型语言的后端,而不需要连接一个独立的后端程序。

4.Apache软件基金会也是利用开源软件盈利的一个范本。时至今日,Apache软件基金会 已经枝繁叶茂,在基金会名下的开源项目我们耳熟能详的有:

Apache HTTP Server

Ant(Java的编译工具)

ActiveMQ(MQ集群)

Cassandra(强一致的分布式KV数据库)

CloudStack(OpenStack的劲敌)

CouchDB(KV数据库)

Flume(日志收集工具)

Hadoop、Hbase、Hive

Kafka(流式计算)

Lucene(开源搜索引擎)

Maven(Java编译&依赖管理工具)

Mesos(分布式协调)

OpenNLP(开源自然语言处理库)

OpenOffice(开源的类Office工具)

Perl(Perl语言)

Spark(分布式计算集群)

Storm(流式计算)

Structs(Java SSH框架的第二个S)

Subversion(SVN,你懂的)

Tcl(Tcl语言)

Thrift(Java网络框架)

Tomcat(大名鼎鼎的Java容器)

ZooKeeper(分布式协调集群)

完整的Apache基金会的项目列表参见:Welcome to The Apache Software Foundation! 

(https://link.zhihu.com/?target=http%3A//apache.org/index.html%23projects-list)

Nginx

2002年,一个叫Igor Sysoev的俄罗斯哥们儿(貌似俄罗斯叫Igor的人挺多的) 写出了一个叫Nginx(和Engine X谐音,取引擎之义)。 那时候有一个时代背景,当时C10K(Concurrency 10K,1万并发)问题还是困扰绝大多数 web服务器的一个难题。Nginx利用异步事件驱动的架构写成,是C10K问题的一个很好的答卷。 Nginx的第一个公开发行版是在2004年发布的,之前都是作为俄罗斯访问量第二的网站Rambler 的内部使用。

一、Nginx的主要优势在于“轻、快、活”:

1.轻

很低的资源占用,甚至能在很多嵌入式设备上运行。

2.快

响应速度超快,几乎不会由于高并发影响响应速度。

3.活

配置灵活,广泛的模块支持。

网上关于Apache和Nginx性能比较的文章非常多,基本上有如下的定论:

1.Nginx在并发性能上比Apache强很多,如果是纯静态资源(图片、JS、CSS)那么Nginx是不二之选。

2.Apache有mod_php、在PHP类的应用场景下比Nginx部署起来简单很多。一些老的PHP项目用Apache 来配置运行非常的简单,例如Wordpress。

3.对于初学者来说Apache配置起来非常复杂冗长的类XML语法,甚至支持在子目录放置.htaccess 文件来配置子目录的属性。Nginx的配置文件相对简单一点。

4.Nginx的模块比较容易写,可以通过写C的mod实现接口性质的服务,并且拥有惊人的性能。 分支OpenResty,可以配合lua来实现很多自定义功能,兼顾扩展性和性能。

二、这里我们要着重讨论的是:为什么Nginx在并发性能上比Apache要好很多?

想要了解这个问题,不得不先做一些铺垫,讲讲并发网络编程的一些历史:

 ——最原始

最原始的网络编程的伪代码大致是这样:

—— 每个连接开一个进程

后来,大家想到了办法:

用子进程来处理连接,父进程继续等待连接进来。但这种方式有如下两个明显的缺陷:

1.fork()调用比较费时,需要对进程进行内存拷贝。即使现在的Linux普遍 引入了COW(Copy On Write)技术(fork的时候不做内存拷贝,只有其中一个 副本发生了write的时候才进行copy)加速了fork的效率,但fork依旧是个 比较“重”的系统调用。

2.较多的内存占用,也是由于上述的内存复制造成的。

——引入线程

得益于之前提过的Linux对于线程的引入,上面例子的开进程,被换成了开线程, 这样,上一小节说的两个缺陷都大大的被缓解了。

—— 进程/线程池

计算机领域有很多算法或者是方法都会用到一种智慧:“空间换时间”。 即用使用更多内存的方式换取更快的运行速度:事先创建出很多进程/线程 ,就像一个池子,这样虽然会浪费一部分的内存,但连接过来的时候就省去了 开启进程/线程的时间。

但这种方式会有一个比较显著的缺陷:当并发数大于进程/线程池的大小的时候 性能就会发生很大的下滑,退化成“贰”的情况。

伍 ——非阻塞&事件驱动

那么,是不是想要达到高性能就一定要付出高系统资源占用呢? 答案是否定的,如果我们注意观察生活中的一个细节,肯德基和麦当劳的不同 服务方式:

肯德基

服务员在前台问:“先生/小姐,有什么可以帮你?”

顾客,思考一下点什么比较好:“我要,xxxxx”

服务员去后台配餐、取餐,3分钟过去了:“您的餐齐了,下一位”

麦当劳

服务员在前台问:“先生/小姐,有什么可以帮你?”

顾客:“我要,xxxxx”。如果顾客思考超过5秒:“后面的顾客请先点”; 点完餐,前台服务员继续为下一位顾客点餐。后台有别的服务员完成配餐。

可以思考一下,这两种运作方式那种比较好:

1.在肯德基,如果遇到需要纠结半天吃什么的客户。服务员和后面的顾客 都会陷入较长时间的等候。原因就是如果最前面的客户先让后面的顾客点餐 ,他想好了还需要较长时间的等候。相比之下,麦当劳就更胜一筹。

2.在麦当劳,后面配餐的服务员如果发现有两个订单都要了可乐。他可以 智能地把两个订单的可乐一次性灌好,这样会大大的提高效率。各个岗位上 的服务员可以灵活的采用各种方式优化自己的工作效率。

这里,肯德基的服务方式就是古老的进程/线程池;麦当劳的服务方式 就是一个简单的非阻塞&事件驱动。

那么,非阻塞&事件驱动这么好,为什么大家没有一开始就采用这种方式呢?

原因有二:

1.非阻塞&事件驱动需要系统的支持,提供non-blocking版的整套 系统调用。

2.非阻塞&事件驱动编程难度较大,需要很高的抽象思维能力, 把整个任务拆解;采用有限状态机编程才能实现。

作者: auxten

转载自公众号:51reboot运维开发

网络编程的演进——从Apache到Nginx的更多相关文章

  1. 网络编程懒人入门(十):一泡尿的时间,快速读懂QUIC协议

    1.TCP协议到底怎么了? 现时的互联网应用中,Web平台(准确地说是基于HTTP及其延伸协议的客户端/服务器应用)的数据传输都基于 TCP 协议. 但TCP 协议在创建连接之前需要进行三次握手(如下 ...

  2. (转)apache和nginx的区别

    nginx 相对 apache 的优点: 轻量级,同样起web 服务,比apache 占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下ngin ...

  3. Apache与Nginx网络模型

    Nginx的高并发得益于其采用了epoll模型,与传统的服务器程序架构不同,epoll是linux内核2.6以后才出现的.下面通过比较Apache和Nginx工作原理来比较. 传统Apache都是多进 ...

  4. 脑残式网络编程入门(四):快速理解HTTP/2的服务器推送(Server Push)

    本文原作者阮一峰,作者博客:ruanyifeng.com. 1.前言 新一代HTTP/2 协议的主要目的是为了提高网页性能(有关HTTP/2的介绍,请见<从HTTP/0.9到HTTP/2:一文读 ...

  5. Java网络编程和NIO详解开篇:Java网络编程基础

    Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...

  6. Web服务(Apache、Nginx、Tomcat、Jetty)与应用(LAMP、CMS-WordPress&Ghost、Jenkins、Gitlab)

    Web服务和应用是目前信息技术领域的热门技术.如何使用Docker来运行常见的Web服务器(包括Apache.Nginx.Tomcat等),以及一些常用应用(LAMP.CMS等).包括具体的镜像构建方 ...

  7. python面试题——网络编程和并发

    1.简述 OSI 七层协议. 物理层(电信号.比特流) 基于电器特性发送高低电压(电信号) RJ45.IEEE802.3 数据链路层(数据帧) 定义了电信号的分组方式,分组方式后来形成了统一的标准,即 ...

  8. python面试题三:Python 网络编程与并发

    1 简述 OSI 七层协议. OSI七层协议模型主要是: 应用层(Application):为用户的应用程序(例如电子邮件.文件传输和终端仿真)提供网络服务. 表示层(Presentation):使用 ...

  9. 猫哥网络编程系列:详解 BAT 面试题

    从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...

随机推荐

  1. 基于scrapyd爬虫发布总结

    一.版本情况 python以丰富的三方类库取得了众多程序员的认可,但也因此带来了众多的类库版本问题,本文总结的内容是基于最新的类库版本. 1.scrapy版本:1.1.0 D:\python\Spid ...

  2. 17级-车辆工程-周金霖 计算机作业 MP4音乐网站

  3. P4906 小奔关闹钟

    题目背景 由于今天是星期一,闹钟准时响了,由于小奔太困了,所以她想关停闹钟. 题目描述 可是,他的闹钟电路太复杂了,有很多个开关,每个开关都连着其他开关,其他开关又连着更多的开关,当且仅当所有开关都关 ...

  4. kendo ui - DatePicker 日期时间系列

    kendo-ui 官网:https://www.telerik.com/documentation 初始化 grid: 引入文件: <link rel="stylesheet" ...

  5. ASP.NET Core下载大文件的实现

    当我们的ASP.NET Core网站需要支持下载大文件时,如果不做控制可能会导致用户在访问下载页面时发生无响应,使得浏览器崩溃.可以参考如下代码来避免这个问题. 关于此代码的几点说明: 将数据分成较小 ...

  6. 【LeetCode2】Add Two Numbers★★

    题目描述: 解题思路: 给定两个链表(代表两个非负数),数字的各位以倒序存储,将两个代表数字的链表想加获得一个新的链表(代表两数之和). 如(2->4->3)(342) + (5-> ...

  7. RHEL 7.6 安装 Oracle 18c RAC

    RHEL 7.6 安装 Oracle 18c RAC 第一部分 安装规划 虚拟环境 VirtualBox 6.0 OS 版本 Red Hat Enterprise Linux Server relea ...

  8. Xamarin 编写混合APP趟坑记录(二)

    前言 公司要开发一个App,为了便于维护和更新,而不用每次去苹果审核,采用的是混合开发方式:用WebVie+WebApp的方式. 因为本人不会Java和ObjectC,公司又不想花钱招这两个岗位的人, ...

  9. MySql修改WordPress密码

    首先,需要几样东西:Xshell,MySql的密码 具体过程:这里我的服务器用的是Vultr, 登上数据库: 使用的语句是:mysql -u root -p 出现的结果如下图: 接着输入语句:show ...

  10. MySQL数据表命令

    显示表的相关信息: show table status like "表名": show table status like "表名" \G       格式化, ...