突变linux
Apache是一个开源的HTTP服务器,可以在大多数计算机操作系统中运行。由于其跨平台性和安全性(注1),所以应用非常广泛,是目前最流行的Web服务器端软件之一。它快速、可靠,并可通过简单的API进行扩展,Perl/Python等解释器可以编译到服务器中。
历史
街头流氓
它最初是由伊利诺伊大学厄巴纳-香槟分校的国家高级计算计划中心开发的。从那以后,阿帕奇
开源社区的成员在不断发展壮大。街头流氓
服务器有着可靠和可信的声誉,已经在超过一半的互联网网站上使用,尤其是几乎所有最受欢迎和访问量最大的网站。
起初,Apache只是一个网景网络服务器(现在的Sun
一)开源选项。渐渐地,它开始在功能和速度上。超越其他基于Unix的HTTP服务器。自1996年4月以来,阿帕奇一直在
互联网上最流行的HTTP服务器:1999 May,它运行在57%的web服务器上;到2005年7月,这一比例上升到69%。
工作
作者声称,最初选择这个名称是因为它容易记忆,但最流行的解释是,这个名称来自于1995年初开发Apache时的事实。
侯,是用当时最流行的HTTP服务器NCSAHTTPd1.3的代码修改的,所以是“打了补丁的(A)
零零碎碎)”服务器。但在服务器官网的FAQ中是这样解释的:“‘阿帕奇’这个名字是为了纪念一个名叫阿帕奇(印地语)的美国印第安人。
土著之一,众所周知他们有高超的作战策略和无尽的耐心。“无论如何,Apache2.x分支不包含任何NCSA代码。
特点
街头流氓
支持很多功能,大部分是通过编译模块实现的。这些特性包括从服务器端编程语言支持到身份验证方案。一些公共语言接口支持Perl、Python、Tcl,
还有PHP。常见的认证模块包括mod_access、mod_auth和mod_digest。其他例子有SSL和TLS支持。
(mod_ssl),代理模块,非常有用的URL重写(通过mod_rewrite实现),自定义日志文件。
(mod_log_config)和过滤支持(mod_include和。
mod_ext_filter).Apache日志可以通过web浏览器使用免费脚本AWStats或Visitors进行分析。
2.x版本
Apache的2.x版本对Apache1.x版本进行了重要的增强。这包括:线程、对非UNIX平台(如Windows)的更好支持、新的ApacheAPI和IPv6支持。
评价
2004年8月,PCMagazine》2004评选出10过去30年最佳软件产品。
他们中的一些人要么有最辉煌的历史,要么最有创造力。它对阿帕奇的评价是:第三名:阿帕奇(apache,1995引入)阿帕奇目前已经进化。
它变成了一个“灯”,即Linux、Apache、MySQL和PHP的组合。这是一个开源软件项目,已经对微软构成了严重的威胁”。NET”战略。
尤其是Apache web server,让用户充分体验开发源码软件的稳定性、可靠性和定制性。
当Apple.com评估阿帕奇时,
Apache是不断发展的服务器软件的重要组成部分。它是免费的,但却是无价的。街头流氓
它是资源开放运动中的绝对宝藏,因为它不是个人专利而是免费向公众开放的。一旦你有了这些源代码,程序员就可以自由地做他们想做的事情——当其他程序员接手时,他们可以被赋予同样的工作。
种权限来更改和修改自己的源代码。
给…作注解
虽然新的漏洞不断被发现,但由于其开源的特性,总是可以很快被修复。所以总的来说,它的安全性还是相当高的。
()AddHandlercgi-script.cgi
AddHandlerserver-parsed.shtml
Sethandlercgi-script
AddHandler定义哪个扩展名由哪个字符串描述。
SetHandler指定目录中的所有文件都由该字符串描述。
我在这里提到的命令与它们的结构密切相关。下面将描述处理程序和类型之间的关系。很多东西从外面看不清楚。下面,我们从内部来看。
程序的基本结构
-
Apache是非常跨平台的。为了实现这个目标,简化模块编写者的负担,Apache完成了很多基本功能,比如IO和内存分配,这些功能都是独立于具体平台的。还有一些有用的例程,比如Hashtable和Array。在整个系统中,Apache有一个基本点,尽可能使用简单的结构和算法,不仅易于理解和维护,而且提高了其稳定性。
存在
在UNIX系统上,Apache采用多进程模型,在Window上采用多线程模型。在多流程模型中,其子流程处理客户请求,
父进程用于管理子进程。当系统过载时,父进程会多启动几个子进程,当系统空闲时,父进程会杀死几个子进程。
子进程的数量介于“MinSpareServers”和“MaxSpareServers”之间。此外,每个子流程处理的请求数量也是有限的。
这可以解决内存泄漏等问题。所有进程状态都记录在共享内存中。由于每个进程的状态都记录在一小块内存中,
它通常只读写这个内存,所以Apache不使用任何同步机制。
Apache使用了RichardSteve的书中提到的几种多进程服务器模型,并根据它们的特点选择在不同的系统上使用不同的方法:
1 .接受:
只有在内核级实现accept时,才有可能在accept时阻塞。
2 .选择:
选择时阻塞。
3.mutex/lock_file:
使用mutex或lock_file互斥accpet。
三
两种方法都需要封堵,不同的是封堵不一样。前两种方法会造成所谓的巨人组问题:同一资源上阻塞的多个进程同时被唤醒,会导致重新竞争。
不过根据RichardSteve的评价,第一种方法最快,第二种是第二种,第三种最慢。事实上,第三种方法在linux上也会有一个巨人组问题。
虽然Apache不强调性能,但不代表他们不重视性能。反而Apache认为realiable是服务器端第一,但是Apache的表现还是不错的。
30个请求redis和30个请求数据库哪个更快?
纯内存数据库,如果只是简单的键值,内存不是瓶颈。一般来说,哈希查找可以达到每秒百万次的量级。瓶颈在于网络IO。
根据你10000/s的测量,客户端和redis应该部署在两台不同的机器上,同步请求redis。每个请求都需要通过网络发送到redis所在的机器上,然后等待redis返回数据。
大部分时间花在网络传输上。
如果把redis和客户端放在同一台机器上,网络延迟会小一些,一般情况下可以打到每秒6万次甚至更高,具体取决于机器性能。
锁不是影响性能的主要因素。
线程锁(mutex_lock)的性能只有在遇到冲突时才会下降,但一般情况下,遇到冲突的概率很低。
如果只是简单的锁定和解锁,速度很快,每秒几千万次是没有问题的。
Memcache在内部使用了大量的锁,并没有看到性能下降。
线程不是影响吞吐量的重要因素。
关于第一点,一般来说,程序处理内存数据的速度远远高于网卡接收的速度。
使用线程的好处是可以同时处理多个连接,在极端情况下,可能会提高响应速度。
使用epoll或libevent等。因为异步非阻塞IO编程只能做到这一点。
与之相对应的是同步阻塞IO编程,利用多进程或多线程来实现多个连接的处理,比如apache。
总的来说,异步非阻塞IO模型的性能远高于同步阻塞IO模型,可以参考nginx和apache的对比。
Libevent并不比redis自己实现的ae_event慢,代码多是因为ae_event只实现了redis需要的功能,而libevent的功能更多,比如更快的定时器,bufferevent模型,甚至还有自己的DNS和HTTP协议。
而libevent比较通用,redis只关注linux平台。最后,最主要的问题,在哪里?
1,纯内存操作2,异步非阻塞IO
如何利用Linux提供的信号量实现进程的互斥和同步?
设置互斥体的初始值为1,进程执行操作前为P(互斥体),操作完成后为V(互斥体)。p操作使互斥量减1,如果互斥
(之前听过一个关于光伏运营的回答,你看看有用吗?)