欢迎各位兄弟 发布技术文章
这里的技术是共享的
代理
Web 代理服务器工作于web客户端和web服务器之间,它负责接收来自于客户端的http请求,并将其转发至对应的服务,而后接收来自于服务端的响应,并将响应报文回送至客户端
apache: 17年,很多服务器的标准都是参照apache的工作特性来制定的,它是一个开源软件
早期源于NCSA?它早期提供的web服务器的软件,应该就叫 httpd,
httpd一直也是作为web服务器最早出现的一个代表而使用的
httpd作为软件,作为服务已经很完善了,NCSA觉得这个项目没有继续维持下去的必要了,
因此此项目解散,此项目很多研发者(程序员)到了各公司去工作,他们又非常喜欢httpd这个软件,所以不想把它从此没落下去,于是大家自发的通过互联网协作起来,继续为这个软件新增很多功能,主要的工作就是打上补丁,补补漏洞,通过补丁来新增一些额外的功能,因此有人对它们重新发行的基于互联网协作来实现发行的服务器httpd 戏称为 一个充满了补丁的服务器 叫 A Patchy Server = 简写为apache
当然 apache 本身也是美国武装攻击机的代称
apache 是一个著名的软件基金会 ASF: Apache Software Foundation,这个基金会是开源界最著名的基金会之一,
跟FSF 基金会不相上下了
(FSF:GNU组织的,发布了GPL协定的软件基金会)
事实上互联网上开源界的基金会有很多,当数FSF和ASF最为著名
ASF 软件基金会主导的项目有很多,有几个项目非常有名
web: httpd 很多时候以apache的名字来称呼httpd,那是因为早期httpd就是被称为apache server的,我们提到apache,非要表示一个具体的项目的时候,那就是表示apache的web服务器httpd的,,,到今天为止apache软件基金会已经有了数十个近百个著名的开源项目,httpd只是其中一种而已
Tomcat 能够提供jsp执行环境的container,这是一个非常著名的开源的作为jsp (java EE) 实现规范和参照的应用程序的
Hadoop 在互联网上非常著名,提供并行处理运行环境的,提供并行处理环境的,提供高性能运算的一个非常重要的计算框架,还可以将数千台电脑组织起来来完成同一个任务
ASF著名的一级项目有很多,这里不一一举例,有兴趣可以看看apache的官方网站,
我们要学习的 web的站点,在apache的官方网站上,链接叫 http://httpd.apache.org apache的很多子项目的网站的直接访问路径就是 http://项目名称.apache.org 作为其访问入口的
包括 hadoop tomcat 都是如此的 ,当然指的顶级基目(一级项目)
apache还有很多的二级子项目,比如说在某些项目底下的一些很小的,来提供某种特殊解决的小软件等等
httpd:
纯粹的 Web Server,开源 Open Source ,只不过它的开源协定目前不使用GPL了,而是Apache的开源协定,它的开源license 就是 apache license,可以到apache的官方网站上看一看 apache license 到底是怎么规定它的开源软件如何被使用的,其实它所定义的规范比GPL要松散一些,更易于被人们所接受
httpd目前来讲,官方主导维护的版本有三个
马哥的看到 2.0 2.2 2.4
主版本依然是2
次版本号不同,它们的配置有着巨大的差别,提供的功能也有着很大的差别,
可以到2.4的版本里面看看 new features 看看它的新特性有哪些
2.4相比2.2有新特性,2.2相比2.0有新特性,2.0本身就相比原来的有新特性
我现在看不到了
有2.0 2.2 2.4 正处于维护状态 2.2是目前的主流, 2.4是最新版本 2.0以稳定著称
之前还维护了1.3的版本
它们的配置和着眼点有着巨大的差别,当然它们配置所遵循的风格和规范都是近似的,
只是支持的参数 特性 以及服务器本身的很多运行特性有巨大的差别
httpd的传统风格的特性:
1)进程控制上通常是事先创建进程的,
(web服务器响应用户请求的模型有多种)(一个用户请求使用一个进程来响应)(万一用户请求进来了,临时创建一个进程来响应用户请求,可能速度比较慢)(所以apache事先把进程启动起来放在那儿,作为空闲进程,一旦有用户请求进来,把空闲进程分配给用户请求,予以响应了)(空闲进程不够的话,就继续创建新的空闲进程)
2)按需维持适当的进程
事先创建的进程有一定的数目性的要求的,适应性按需创建进程,,(500请求创建了500个进程,400个请求完了,400个进程就空闲了,我们不能让400个进程空闲,因为空闲太多没有意义,所以会将太多的空闲进程进行销毁,直到其满足我们所应该维持的最小或最大空闲进程数为止)
3)模块化设计
所以核心只具备最基本的功能,核心比较小,各种功能都通过模块添加,而且这些模块可以在运行时启用,(它像我们的linux内核一样,平时启用的时候,只启用核心功能,当我们用到很多额外的功能的时候,只需要将额外功能的模块装载进来,此时它就具有这种能力了) 甚到连php功能的支持,我们都可以以模块化的形式装载进httpd,所以apache和php结合有很多种方式,模块化就是其中比较常见的一种,也是我们红帽系列的服务器上默认的一种
支持运行时配置,支持单独编译模块 (运行时配置的意义还有另外一种,我们如果需要用到某种额外的功能的话,只需要去编译这个模块就行了,可以不用编译整个httpd ,所以用到什么模块,可以单独编译什么模块)
4)支持多种方式的虚拟主机配置
Web服务器只有一个 ,(客户端访问的时候)目标ip只有一个(假设只有一个),端口也都是80,如何实现让用户访问的时候,却是不同的站点?
我们的服务器在特定的地方,特定的地址(Socket 套接字)上提供服务的话,每一种服务,每一个独立的服务必须要占据一个套接字的 ( Socket: IP:port ),一个套接字通常只能为一个服务器提供服务的
配置虚拟主机的常见方法如下三种 (还有第四种,很少用,不再提)
1)一台主机提供多个ip地址,每一个ip地址提供一个网站(ip地址很紧俏,想获得ip,使用费不少)
2)基于端口的虚拟主机,不同的端口提供不同的站点
(电脑有6万多端口,别人不好猜你的端口是哪一个,不使用标准80端口,在互联网上没法让别人使用的)
3)基于域名的虚拟主机,ip和端口都一样,但是由于其站点访问时使用的dns的主机名不一样,却也可以打开不同的虚拟主机 (这一种最适用)
URL protocol://HOST:PORT/path/to/source
客户端请求报文的格式
Method URL version
header
body
例如
(没有指协议,因为请求web服务的, 协议显然是http 这里没有HOST)(HOST在首部)(协议有 0.9 1.0 1.1)(1.1增加的功能 增进了缓存功能,支持长连接 ) (把host和Method后面的URL组织起来,就是一个完整意义上的规范的URL)
GET /download/linux.tar.bz2 HTTP/1.1
Host: www.magedu.com
服务器端完全根据Host来区别到底是访问的哪个主机,这就是基于域名实现虚拟主机的最基本的前提,这就是为什么,在我们的请求报文中必须有一个首部host予以标识的原因
假如只使用ip地址来访问呢?那只能返回一个默认的虚拟主机了(可以访问,一般而言是一个默认的虚拟主机,因为你使用了一个压根就不存在的,没有基于这个名称(域名)提供服务的虚拟主机的时候,可以给你一个默认的)(要使用ip地址来访问的话,给你一个默认的,就访问不到特定的虚拟主机了)
虚拟主机
物理服务器
Web服务器程序(httpd)也只有一个
却可以服务多个不同的站点 (web程序本身却可以根据用户请求的不同,提供不同的站点)(使用 www.a.com 和 www.b.org 访问的虽然都发现了同一台主机,但是打开的网站都是不一样的)
虚拟主机对于web服务器来讲,是一个非常重要的功能,
httpd还有很多额外的其它功能,比如支持https协议 (通过 mod_ssl 模块来支持的)
支持用户认证,
1)简单认证
2)摘要认证
3)基于表单的认证
支持访问控制机制(支持基于IP或主机名的访问控制机制(ACL Access Control List 访问控制机制) )
支持每目录的访问控制 (用户访问主站点的时候,不需要提供用户名密码,但是访问某个特殊路径的话,就需要提供账号和密码了)
支持URL重写 (本来访问的是 /image/a.jpg, 给重写成,请重新访问 /bbs/images/abc.jpg ,,,对于客户端来说是透明,,我们可以在服务器上自动的将这些内容通通给转发到另外一个路径下让你去重新访问) URL重写的功能特别强大,还支持条件式重写等等
没必要一个个的从头到尾介绍了
apache服务器几乎是互联网上服务器应该具有功能的标准,像nginx是一个非常牛的服务器,它是多进程响应,n个用户请求的这样一个模型,所以nginx能够使用有限的资源响应比apache更多的用户请求,但它却替代不了httpd,那是因为nginx目前来讲,作为一个完整意义上的(完善意义上的)提供诸多丰富特性方面来讲,它是没有办法跟httpd相比较的,就其稳定性方面来讲,也没办法与httpd相比较,所以它们两个各自有各自的发挥场所,一般nginx用来做反向代理,而httpd仍然是web里面当之无愧的老大(提供web服务的)
httpd在我们的RedHat上,要想安装,安装机制,安装方式常用的有两种
1)rpm包, 简单进行安装配置 (有些功能我们不需要,rpm给我们编译了,有些功能我们需要了,它却没编译,)(因此rpm作为我们简单安装学习web服务器,是一个比较容易入门的途径,但是将来我们为某个企业服务的时候,很可能对方企业所需要的web服务器默认情况下rpm是无法满足的,因此在RedHat上源码安装是我们所必须具有的能力,还要自己能够定义定制它的某些新特性,更重要的是rpm包的版本比较老,)(所以在很多时候,我们可能需要自己去编译安装的)(因为rpm包版本落后的问题,版本漏洞的问题)(更重要的是对于某些我们需要的特性,rpm包不支持的问题我们也得考虑,)
(对于简单的应用和配置,我们先使用rpm包来演示,而后还会一步一步地去演示怎么去源码编译安装httpd,并为其提供服务控制脚本)(后面还会讲到apache的动态平台的构建,能够支持php,像LAMP这样的平台的构建)
[root@localhost ~]# yum list all http*
rpm包是 2.2.3
源码包 是 2.2.23
2)源码编译,
如何安装配置使用httpd,
在红帽系统上,httpd本身是受SELinux控制的(目前我们还没有说SELinux怎么使用它,因此请确保SELinux事先是禁用的 (permissive 或者 disabled 状态)) (不然的话,很多服务,很多配置可能都无法正常进行的)
[root@localhost ~]# getenforce
Permissive
(如果是enforcing 确保使用 # setenforce 0 将其设置为 Permissive 状态 )(这种设定只是当前生效,重启系统就无效了)
(要想永久生效 vim /etc/sysconfig/selinux 或者 vim /etc/selinux/config 这两个是同一个文件
)把 enforcing 改为 permissive ,,,最好改成permissive ,因为将来我们还要打开并使用它的,因为使用了 permissive (许可的,容许的,放大的,自由的) ,将来想启用的话,就能够容易启用起来 (若使用--disabled,要重启系统,重新打标之后,才能启用起来,使用--disabled,想重新启用时,稍有点麻烦)
[root@localhost ~]#
[root@localhost ~]# yum list all http*
Loaded plugins: product-id, security, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
file:///media/cdrom/Server/repodata/repomd.xml: [Errno 5] OSError: [Errno 2] 没有那个文件或目录: '/media/cdrom/Server/repodata/repomd.xml'
Trying other mirror.
Installed Packages
httpd.i386 2.2.3-82.el5_9 installed #服务器端包 只需要装它就可以了
httpd-manual.i386 2.2.3-82.el5_9 installed # manual 手册,文档 与 http://httpd.apache.org/docs/2.2/ 打开的内容是一样的,详细介绍web服务器的使用机制 ,所以 这里 httpd-manual 提供给我们的是基于本地的手册页面,装上它后,在本地服务器上就能够看到与 http://httpd.apache.org/docs/2.2/ 相匹配的手册页 因此它也可以不用装
Available Packages
httpd-devel.i386 2.2.3-82.el5_9 development #针对httpd作二次开发,或针对httpd做某些依赖它的软件编译的话,才用得上它 ( devel 就是 development ,它的开发包,一些开发库或头文件在这里头,大多数情况下用不着它)
[root@localhost ~]#
http://httpd.apache.org/docs/2.4/
http://httpd.apache.org/docs/2.2/ 看上去是中文,事实上点进去之后是英文
http://apache.chinahtml.com/ 中文 有大用
httpd
httpd.i386 安装包叫httpd
安装完成后 执行进程服务在 /usr/sbin/httpd 所以进程也叫httpd
在红帽5.8上,httpd的工作模式(MPM 多道处理模块 multi path module ,Multi-Processing Module ) 是 prefork (默认是prefork),
它需要事先启动几个空闲进程,进行接受用户请求的
所以启动的这个服务,执行程序叫httpd,但一旦启动起来以后,系统里面有好多个叫做httpd进程,只不过在这众多的进程当中,有一个httpd,它运行的属主属组是 root ,root ,除了它之外,剩下的其它的运行的 httpd 进程的属主属组是 apache,apache
(在linux上,小于1024的端口,要想使用,只有管理员有权限,所以启动这个服务( 80 端口 ),一定是管理员才能启动它),那因此第一个httpd进程,是管理员启动的,第一个httpd进程本身并不负责响应用户请求,它就是专门用来负责创建空闲进程或销毁那些多余的空闲进程,所以第一个httpd进程是个主导进程,可以称之为master( 叫httpd 的master process ),其它的httpd进程,是真正处理用户请求的 才是工作进程 (叫 worker process )
以上这就是可执行程序和对应进程的说明
/etc/rc.d/init.d/httpd (服务脚本)
使用 service httpd start {restart|stop|status}
来控制服务的启动或停止或显示服务的状态
这就是红帽系列的系统上所具有的特性
服务启动起来以后,所占据的端口 Port: (tcp/80)(占据80端口) (ssl:tcp/443) (如果基于ssl工作(https),就占据443端口)
基于rpm包编译安装的话,它假设自己工作的根目录是在 /etc/httpd 下, (也就是进程运行的根目录)(可以假设为软件的安装目录,可以这么理解)(事实上并没有安装在这个位置,只是相对于这个位置而言的)
/etc/httpd/conf 目录,就是配置文件目录, 主配置文件就是 /etc/httpd/conf/httpd.conf
httpd.conf 非常大,红帽将它们分段来引用了,因此所有的 /etc/httpd/conf.d/*.conf 文件也都是 httpd.conf文件的组成部分,主配置文件通过 include 把 conf.d/*.conf 文件包括进来了 (linux服务器上的很多程序都是这样来使用其配置文件的)
/etc/httpd/modules 模块目录 (这是个链接目录),这是apache的各种模块目录,事实上这个模块目录是个链接,并不在这个位置(真正的文件应该是在 /lib/httpd 目录下?)
/etc/httpd/logs -->指向/var/log/httpd (这也是个链接目录) (它是日志目录)
里面的文件叫日志文件: 有两类
1)访问日志 名字通常叫 access_log (客户端每一次发起的访问请求,以及服务器端响应的结果)
2)错误日志 名字通常叫 error_log?err_log (错误的访问,或者是服务器运行过程中出现了问题等,(包括服务器启动出现了问题))
响应用户请求的页面放在哪里
/var/www (一般来讲)路径下
主要有两个目录
1)html 通常是静态页面所在的目录路径
1)cgi-bin 这是apache提供动态内容的时候所使用的路径
httpd或web服务自身并不处理任何动态内容,它是通过某种协议调用额外的其它程序来运行动态脚本并将结果取回来以后响应给客户端的
cgi就是让web服务器能够跟额外的应用程序通信的一种机制,能够让web服务器在必要的时候启动一个额外的程序来处理动态内容的
cgi: Common Gateway Interface (cgi的统称),就是通用网关接口,它就是让web服务器能够跟应用程序服务器打交道的一种协议,它是一种协议
client --> httpd (index.cgi) -->Spawn Process (index.cgi) -->httpd -->client 当客户端向httpd服务器请求index.cgi的时候,httpd可以判断得出来 客户端请求的 这个 cgi脚本 需要一个应用程序来执行,于是它就发起 一个进程 (Spawn Process),这个进程 ( Spawn Process ) 一定是跟cgi的程序语言相关的一个进程,来运行 index.cgi,在这个脚本index.cgi执行完成后,再重新响应给httpd,httpd把它组合起来,形成一个响应报文再发给客户端
到底什么样的程序语言可以开发cgi呢,到底什么样的程序语言可以开发写出来的动态网站? (java c c++ bash php , 其实只要是程序语言,它都可以开发成动态网站) (c语言也可以,只不过c语言是一种编译型语言,开发成网站后,得把它动态编译成可执行程序) (当然,得让web服务器能够识别你到底是哪一种语言开发的)(只要web服务器能识别,它就能够调用相应的程序来执行) (无论哪一种语言开发的,它通常都叫 cgi,这样一来,web服务器如何识别呢? ) (其实每一个可执行程序,包括index.cgi ,记得bash脚本的时候,开头一行是 #!/bin/bash 根据这些前几个字节也能够判断出来你的可执行程序的类型的,也能够给你调用相应的执行环境来执行, 只不过它们通常都叫cgi)(但是我们很少拿C或C++来开发动态网站,是因为(每一种程序开发语言都有它最适用的场景),C和C++非常底层,执行效率非常的高,但是它非常底层,不适合开发那些多媒体表现能力很丰富的程序,只适合开发像能够驱动我们硬件工作的驱动程序,或者是非常底层,对性能要求非常高的大型软件程序,使用C或C++比较不错,所以它们不适合网站程序的开发,而且程序执行完之后,还要把它返回成html文档的,使用C来返回的话,很麻烦)(因此有些语言专门开发过来,专门用来写网页页面的)(或者说这个程序本身(开发语言本身)不具备这个能力,或者说能力不是很明显,但是我们通过为这个程序开发语言添加一些个额外的插件或框架,却能够让它在开发动态页面(开发网页内容方面)变得非常有能力)(比如 1) Perl ,perl是一种脚本语言,它是比bash功能更强大的,能够帮我们完成系统自动化管理的脚本语言,有人在perl基础上添加了能够丰富的简单的快速的开发动态网页内容的这种插件(或者叫模块)以后,perl也变得非常易于开发动态网站了,现在很多的cgi文档或者cgi格式的页面,都使用perl开发的) ( 2) python也可以开发动态网页,python默认情况下开发动态网页也很困难,有人给python开发了一个框架,这个框架就是python的一个模块,基于这个模块来开发动态网页的话,非常简单,很容易运行,目前慢慢流行起来, ( 3)java,java事实上是一个纯面向类的编程语言,人们为java新增了一个叫 Servlet 这样一个类,使得java本身也可以易于开发一种动态页面,这个页面可以嵌入到html页面里面,把动态内容和静态内容混合起来写,使得页面的维护变得非常简单和方便,而且更重要的是,由于它使用Servlet开发,而且基于java语言来实现,所以java官方把它命名为JSP,JSP在运行之前也需要编译,但是由Servlet自动完成编译和转换,所以它的运行效率比其它语言更高更快,( 4)php 更为流行的是php,php 也是一种cgi语言,只不过php生就的,专门用来开发网页的,它也是一种脚本语言,但是这种脚本语言很少拿来开发一个像bash脚本一样的系统自动化管理,让系统完成一些自动化任务的,perl,python都可以,因为它俩专门用来做脚本的,但是要想开发网页它俩还需要额外的模块,但是php天生就是用来写网页的,开发动态站点的,php是非常流行的一种开发动态页面的语言,,,,,这些语言都是cgi,或者说它们都是以cgi的方式跟web服务器(apache服务器)结合起来工作. 当然有些程序跟 apache 结合起来的方式可不仅仅是cgi一种
cgi怎么工作的?
有人访问web服务器的时候,需要执行一个动态页面,web服务器能够识别这个动态页面,并且系统告诉web服务器,我们当前主机上有这个对应的动态页面相对应的执行程序的执行环境,于是web服务器就将这个执行环境的解释器执行起来,并将文件交给解释器运行(发起一个进程),进程执行完毕后,自动返回给web服务器一个html页面,web服务器再把这个html页面响应给客户端
因此进程执行结束,这个进程就销毁了,
再有其它用户访问的话,就再生成一个动态页面
请求10动态页面,就会启动10个解释器的进程了,每个进程运行完成还得销毁,
500个用户,每个用户请求10个动态页面,
500个web进程,又有5000个动态进程,共5500个进程
动态的(解释器运行的)进程与web服务器的进程不是同一个进程,
web服务器还得负责动态进程的管理 创建和回收
所以系统开销特别大
动态内容的执行(动态进程)需要大量的cpu时间周期来执行的(因为程序的执行必然要用到cpu的,所以cpu很容易满负荷)
因此为了尽可能的降低web服务器本身的工作压力,我们可以让动态进程跟 web服务器结合
web服务器无论用不用 (无论有没有请求过来) ,动态进程像web服务器一样,也事先给你生成好,我们有一个专门启动的服务,叫动态服务进程,它还创建很多空闲子进程,,,,当有人向web服务器发起内容请求, 当web服务器发现这是一个动态内容的时候,它直接使用空闲的动态进程,(web服务器只需要将用户请求的动态页面交给一个空闲的动态服务进程执行一次就行了),那因此这些动态进程的创建和回收不再由web服务器维护,而是由动态进程的专门管理的进程(master process 动态进程)来进行管理
像这种 web服务器和动态服务器通信的机制叫 Fastcgi
fastcgi: 可以理解成快速cgi,这只是cgi的一种,这是 php 工作的cgi模式的一种 (python用的还是别的cgi的机制) 在现在的这种fastcgi机制模式下,我们的动态进程再也不需要web服务器自己去启动或者销毁了,由一个专门的进程来负责的,而这个专门的进程是工作在某个端口上(某个套接字上)跟我们的web服务器通信的,,这样子的话,web服务器和应用程序服务器(动态进程所在的服务器)可以放在不同的主机上(不然的话,只能放在同一台主机上,不然的话,因为web服务器启动另外一个进程,它们必须在同一台主机上)
工作在fastcgi模式下,我们可以将web服务器跟动态程序服务器分离
做两台服务器,一台服务器专门用来处理用户请求的静态内容(请求静态,直接从本机返回),,,,当用户请求的是动态内容的时候,通过本地的TCP/IP协议,通过本地网络发给另一台主机,另一台主机上运行的有一个动态服务进程,同时它还启动了许多空闲子进程随时等待响应前端发过来的请求
在 prefork 模型下,在多进程模式下,一个用户请求来了,我们的web服务器也生成了很多的子进程来等待响应用户的请求(主进程并不真正响应),,,一个用户请求来了,web服务器就把这个请求分给一个子进程来进行响应,这个子进程发现用户请求的是动态内容,通过网络把这个请求转给另一台主机,,,另一台主机 的主动态程序进程找一个空闲的动态子进程进行处理,并把执行的结果通过网络再返回给 web服务器的子进程,web服务器的子进程(工作进程)再把结果响应给客户端
这样一来,两个处理层次就隔开了,所以静态内容跟动态内容就使用不同的主机来分别进行处理了,这就是为什么处理动态内容的服务器被称为应用程序服务器的原因 (动态程序服务器,是专门用来处理应用程序,专门用来处理动态内容的) (左边的web服务器专门用来处理静态内容)
(比如用户请求的是一个图片,我们就不用交给后台服务器(动态程序服务器)执行了,图片直接从前端服务器(web服务器)返回就可以了)
所以这就把动静给它们分离开了
前端可以使用两个web服务器
比如客户发出5000个请求里面,可能里面只有500个才是动态内容的请求,
前端有2个web服务器,无论哪个web服务器,需要用到动态内容的时候,都向同一台动态服务器发起执行内容的请求
一个域名可以有两个A记录,假设我们有一个域名叫 www.magedu.com
当用户请求的时候,来自不同用户的请求,我们能解析到不同的web服务器,,这两个web服务器,如果静态内容都是一模一样的,当请求的动态内容需要执行的话,只要交给同一台后台服务器一执行,将结果返回就可以了
这就是说明动态内容怎么跟静态内容分层次的
程序分层,大家各司其职,一个人只完成特定的工作,但是我们还讲过,
程序: 指令和数据
指令 (在cpu上需要运行的命令,需要执行的指令,它本来就是一个最小的执行单元了,没法解释了)和数据组成的
事实上指令的意义并不大,程序的主要目的是为了处理数据的,指令是帮我们处理数据的 如果我们需要处理的数据量非常大,(早期数据是放在文件当中的,比如用户账号密码放在/etc/passwd中,/etc/shadow中,passwd和shadow就是数据库文件)如果数据量条目达数十万个,从中挑一个,速度非常慢,而且管理起来很慢,因此我们必须有一个行之有效的数据管理机制
数据库 专门用来管理数据的应用程序服务器,叫数据库服务器
存储数据的地方叫数据库,而能够帮你管理数据的,运行数据库软件的这么一种服务就叫数据库服务
无论是应用程序服务器 还是 数据库服务器,它们都是cpu密集型的,
它们对cpu的占用率都非常大 (CPU-bound)
请求的用户太多,cpu忙不过来 ,怎么办,再增加一个应用程序服务器,分隔开? 没必要 ,,原因有:1)两个数据库里面的数据不能保持一致
请求的用户太多,cpu忙不过来 ,怎么办,更好的办法,是将数据库服务器独立出来,找一台物理主机,专门提供数据服务,当应用程序需要访问数据库的时候,这个应用程序再次向后端数据库服务器发起请求,数据库服务器把数据返回给应用程序服务器,应该程序服务器把数据格式化为html文档,再返回给web服务器,web服务器再响应给客户端
三层: 静态内容层 应用程序层 数据库层(数据层)
每一个对应的层次上都需要一个专门的服务来提供
前端 httpd (apache)
中间 php
最后一端 MySQL 著名的流行的开源的数据库服务器
它们都运行在linux上,性能非常好,于是 被简写为 LAMP,这就是LAMP名称的由来,这就是黄金组合
LAMP 本身是将这几种机制组合起来,不必要每一种都放在一个独立的服务器上,把这三个放在同一台服务器上也可以,只不过同一台服务器有可能忙不过来
我们没有展开去说,比如淘宝站,访问量太大,在一台主机上装16G内存,2颗cpu,对于动态内容的请求,前端,中端,后端,各放一个服务器,500个到1000个动态请求同时运行的话,服务器可能基本上就满载了(可能不同的应用来讲,有些小网站2000请求才满载)(比如淘宝秒杀什么之类的抢,200万个请求同时到达,一台服务器很容易垮,肯定满足不了需要) (我们考虑的不光是简单的扩展问题,还要考虑架构,层次结构上规划,我们都要考虑) (所以web服务器 我们学习的主要内容就是围绕这些展开的)(hadoop 也无非就是处理这些常用的应用中的机制之一)(淘宝上支持搜索,"路由器" 关键字,全局搜有多少路由器的,有太多店铺,太多商品,怎么能达到快速响应)(淘宝要分析下今天为止哪个店铺的访问量最大,哪件商品卖出去的最多,怎么能快速的分析结果?可能一天的访问量用一台服务器去分析,10天都分析不完)
(所以对于这些生成概要信息去分析的话,一台服务器绝对工作不了完成不了任务的,我们就要做成hadoop集群,做成hadoop这种机制,比如弄几千台电脑,来并行处理这种机制,一般3-5秒,最多半分钟之内基本能搞定)(这些不同的应用场景里面,可能需要n台服务器协同工作的)(这些服务器怎么协同,怎么连接起来,这就是后期学的主要内容)(大多数内容,哪怕就一个web服务器来讲,众多公司像facebook,tittter,linkdin,淘宝等不停地在为这些服务器进行优化,新增了很多新的功能,代码改写的,让它尽可能去加大服务器所提供的哪怕一点点的计算能力,尽可能让它榨干榨净,让它服务器最大负荷的工作,而且也能够提供最好的运算性能)(我们个人买的计算机 , cpu 大多数时间是空闲的,有些服务器上根本不可想象的,一般平均负载率70%-80%左右,)(所以我们要涉及到怎么能够尽可能的让程序运行起来更高效,更能够一点一滴的榨干榨尽服务器的计算能力)(这些作为系统工程师来讲都是应该考虑的问题)(虽然不是程序员,但是架构怎么设计,需要不停地跟程序员开发团队进行交流,需要不停地去开会去研究,从物理的方面,系统的方方面,从软件方面进行架构等等)(比如新浪的微博,全球来讲,用户量非常大的一种在线的用户请求,那就要用到应用程序服务器了,每秒种,新浪微博服务器可能要接受多少次的微博发送请求,每秒钟假设50万,(每秒钟接受50万个更新微博的请求),需要多高性能的服务器才能满足需要呢?)
web服务器是一个非常复杂的话题,
先看看httpd,一个简单的静态服务器怎么构建,它有多少种不同的配置,使用方式,它的各种参数怎么慢慢进行调整;;然后php程序服务器怎么构建,php怎么跟静态服务器结合起来进行工作,mysql服务器怎么构建,,怎么能让三个协调起来进行工作,而后将三个协调成一个主机后,再让它们分开,而后在每一个层次上多提供几台服务器,我们由浅入深的来, 在这期间还要讲很多东西,讲一些别的东西,当然接下来的主线就是讲相关内容的
httpd:
安装
[root@localhost ~]# yum list all http*
[root@localhost ~]# yum -y install httpd (因为上一命令 # yum list all http* 显示已安装,所以这里ctrl+c 未执行)
[root@localhost ~]# rpm -ql httpd | less (看安装生成了哪些文件)
/etc/httpd #目录
/etc/httpd/conf #目录
/etc/httpd/conf.d #目录
/etc/httpd/conf.d/README
/etc/httpd/conf.d/proxy_ajp.conf # .conf结尾的文件 是主配置文件的组成部分?
/etc/httpd/conf.d/welcome.conf # .conf结尾的文件 也是主配置文件的组成部分?
/etc/httpd/conf/httpd.conf #这是主配置文件
/etc/httpd/conf/magic #就是用于定义本地主机如何识别MIME格式的, 通过MIME编码而来的其它的多媒体(或者说非纯文本文档)
/etc/httpd/logs # 日志目录
/etc/httpd/modules #模块目录
/etc/httpd/run
/etc/logrotate.d/httpd
/etc/rc.d/init.d/httpd #这是服务脚本
/etc/sysconfig/httpd #这是服务脚本的配置文件,可以把这个配置文件里面的某些配置参数一改,服务脚本就能够工作在不同的模式下了
/usr/bin/ab # apache bunch mark ? apache的服务器压力测试工具,将来会经常遇到它,来评估你的apache服务器性能的
/usr/bin/htdbm # 创建apache认证用户账号密码的命令
/usr/bin/htdigest # 也是创建apache认证用户账号密码的命令
/usr/bin/htpasswd # 同样是创建apache认证用户账号密码的命令
/usr/bin/logresolve
/usr/lib/httpd #目录
/usr/lib/httpd/modules #目录 (/etc/httpd/modules是个链接,指向 /usr/lib/httpd/modules )
/usr/lib/httpd/modules/mod_actions.so #模块都是.so结尾的,这些模块分别用于提供不同的功能
/usr/lib/httpd/modules/mod_alias.so
/usr/lib/httpd/modules/mod_asis.so
/usr/lib/httpd/modules/mod_auth_basic.so
/usr/lib/httpd/modules/mod_auth_digest.so
/usr/lib/httpd/modules/mod_authn_alias.so
/usr/lib/httpd/modules/mod_authn_anon.so
/usr/lib/httpd/modules/mod_authn_dbd.so
/usr/lib/httpd/modules/mod_authn_dbm.so
/usr/lib/httpd/modules/mod_authn_default.so
/usr/lib/httpd/modules/mod_authn_file.so
/usr/lib/httpd/modules/mod_authnz_ldap.so
/usr/lib/httpd/modules/mod_authz_dbm.so
/usr/lib/httpd/modules/mod_authz_default.so
/usr/lib/httpd/modules/mod_authz_groupfile.so
/usr/lib/httpd/modules/mod_authz_host.so
/usr/lib/httpd/modules/mod_authz_owner.so
/usr/lib/httpd/modules/mod_authz_user.so
/usr/lib/httpd/modules/mod_autoindex.so
/usr/lib/httpd/modules/mod_cache.so #能够提供缓存的,缓存可以基于磁盘来实现,也可以基于内存来实现,这是apache的一个重要特性之一(能够在本地提供缓存)
/usr/lib/httpd/modules/mod_cern_meta.so
/usr/lib/httpd/modules/mod_cgi.so #调用cgi的模块?
/usr/lib/httpd/modules/mod_cgid.so
/usr/lib/httpd/modules/mod_dav.so
/usr/lib/httpd/modules/mod_dav_fs.so
/usr/lib/httpd/modules/mod_dbd.so
/usr/lib/httpd/modules/mod_deflate.so
/usr/lib/httpd/modules/mod_dir.so
/usr/lib/httpd/modules/mod_disk_cache.so
/usr/lib/httpd/modules/mod_dumpio.so
/usr/lib/httpd/modules/mod_env.so
/usr/lib/httpd/modules/mod_expires.so
/usr/lib/httpd/modules/mod_ext_filter.so
/usr/lib/httpd/modules/mod_file_cache.so
/usr/lib/httpd/modules/mod_filter.so
/usr/lib/httpd/modules/mod_headers.so
/usr/lib/httpd/modules/mod_ident.so
/usr/lib/httpd/modules/mod_imagemap.so
/usr/lib/httpd/modules/mod_include.so
/usr/lib/httpd/modules/mod_info.so
/usr/lib/httpd/modules/mod_ldap.so
/usr/lib/httpd/modules/mod_log_config.so
/usr/lib/httpd/modules/mod_log_forensic.so
/usr/lib/httpd/modules/mod_logio.so
/usr/lib/httpd/modules/mod_mem_cache.so
/usr/lib/httpd/modules/mod_mime.so
/usr/lib/httpd/modules/mod_mime_magic.so
/usr/lib/httpd/modules/mod_negotiation.so
/usr/lib/httpd/modules/mod_proxy.so #apache可以提供反向代理
/usr/lib/httpd/modules/mod_proxy_ajp.so #可以基于ajp协议进行反向代理
/usr/lib/httpd/modules/mod_proxy_balancer.so #反向代理的时候还能支持负载均衡的功能
/usr/lib/httpd/modules/mod_proxy_connect.so
/usr/lib/httpd/modules/mod_proxy_ftp.so
/usr/lib/httpd/modules/mod_proxy_http.so
/usr/lib/httpd/modules/mod_reqtimeout.so
/usr/lib/httpd/modules/mod_rewrite.so
/usr/lib/httpd/modules/mod_setenvif.so
/usr/lib/httpd/modules/mod_speling.so
/usr/lib/httpd/modules/mod_status.so
/usr/lib/httpd/modules/mod_substitute.so
/usr/lib/httpd/modules/mod_suexec.so
/usr/lib/httpd/modules/mod_unique_id.so
/usr/lib/httpd/modules/mod_userdir.so
/usr/lib/httpd/modules/mod_usertrack.so
/usr/lib/httpd/modules/mod_version.so
/usr/lib/httpd/modules/mod_vhost_alias.so
/usr/sbin/apachectl
/usr/sbin/htcacheclean
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
/usr/sbin/httxt2dbm
/usr/sbin/rotatelogs
/usr/sbin/suexec
/usr/share/doc/httpd-2.2.3
/usr/share/doc/httpd-2.2.3/ABOUT_APACHE
/usr/share/doc/httpd-2.2.3/CHANGES
/usr/share/doc/httpd-2.2.3/LICENSE
/usr/share/doc/httpd-2.2.3/NOTICE
/usr/share/doc/httpd-2.2.3/README
/usr/share/doc/httpd-2.2.3/VERSIONING
/usr/share/doc/httpd-2.2.3/migration.css
/usr/share/doc/httpd-2.2.3/migration.html
/usr/share/man/man1/ab.1.gz
/usr/share/man/man1/htdbm.1.gz
/usr/share/man/man1/htdigest.1.gz
/usr/share/man/man1/htpasswd.1.gz
/usr/share/man/man1/logresolve.1.gz
/usr/share/man/man8/apachectl.8.gz
/usr/share/man/man8/htcacheclean.8.gz
/usr/share/man/man8/httpd.8.gz
/usr/share/man/man8/rotatelogs.8.gz
/usr/share/man/man8/suexec.8.gz
/var/cache/mod_proxy
/var/lib/dav
/var/log/httpd
/var/www # 网页文件的存放位置 通常称为文档路径
/var/www/cgi-bin #动态文件存放位置
/var/www/error #错误文件存放位置
/var/www/error/HTTP_BAD_GATEWAY.html.var #错误信息页面 下面都是错误信息页面 不同的错误信息是由不同的文件返回过来的,事实上这些错误页面是可以自我定义的
/var/www/error/HTTP_BAD_REQUEST.html.var
/var/www/error/HTTP_FORBIDDEN.html.var
/var/www/error/HTTP_GONE.html.var
/var/www/error/HTTP_INTERNAL_SERVER_ERROR.html.var
/var/www/error/HTTP_LENGTH_REQUIRED.html.var
/var/www/error/HTTP_METHOD_NOT_ALLOWED.html.var
/var/www/error/HTTP_NOT_FOUND.html.var # 404错误页面,未发现错误页面,事实上是使用这个文件显示出来的
/var/www/error/HTTP_NOT_IMPLEMENTED.html.var
/var/www/error/HTTP_PRECONDITION_FAILED.html.var
/var/www/error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var
/var/www/error/HTTP_REQUEST_TIME_OUT.html.var
/var/www/error/HTTP_REQUEST_URI_TOO_LARGE.html.var
/var/www/error/HTTP_SERVICE_UNAVAILABLE.html.var
/var/www/error/HTTP_UNAUTHORIZED.html.var
/var/www/error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var
/var/www/error/HTTP_VARIANT_ALSO_VARIES.html.var
/var/www/error/README
/var/www/error/contact.html.var
/var/www/error/include
/var/www/error/include/bottom.html
/var/www/error/include/spacer.html
/var/www/error/include/top.html
/var/www/error/noindex.html
/var/www/html #网页文件存放位置
/var/www/icons
/var/www/icons/README
/var/www/icons/a.gif
/var/www/icons/a.png
/var/www/icons/alert.black.gif
/var/www/icons/alert.black.png
/var/www/icons/alert.red.gif
/var/www/icons/alert.red.png
/var/www/icons/apache_pb.gif
[root@localhost ~]# service httpd status
httpd 已停
[root@localhost ~]# service httpd start 启动httpd服务
启动 httpd: [确定]
[root@localhost ~]#
如果想让它开机自动启动 chkconfig on ( # chkconfig httpd on )
[root@localhost ~]# netstat -tnlp | grep :80 (看有没有启动起来httpd服务)
tcp 0 0 :::80 :::* LISTEN 19383/httpd
[root@localhost ~]#
[root@localhost ~]# ps aux | grep httpd (通过这个可以看到是哪个MPM多道处理模块 如果看到 httpd.worker 表示worker模式 ,像下面这样表示 prefork模式,因为 2.2当中,默认 /usr/sbin/httpd就是 prefork模式 )
有一大堆的httpd进程 第一个httpd进程是以root用户的身份运行的( master process ),其它8个httpd进程是以apache用户的身份运行的( worker process )
这里就已经启动了多个空闲进程了,一旦有用户请求,它就从空闲进程中找一下予以响应了
root 19383 0.0 0.9 22764 9392 ? Ss 15:44 0:00 /usr/sbin/httpd
apache 19385 0.0 0.4 22764 4772 ? S 15:44 0:00 /usr/sbin/httpd
apache 19386 0.0 0.4 22764 4772 ? S 15:44 0:00 /usr/sbin/httpd
apache 19387 0.0 0.4 22764 4772 ? S 15:44 0:00 /usr/sbin/httpd
apache 19388 0.0 0.4 22764 4772 ? S 15:44 0:00 /usr/sbin/httpd
apache 19389 0.0 0.4 22764 4772 ? S 15:44 0:00 /usr/sbin/httpd
apache 19390 0.0 0.4 22764 4772 ? S 15:44 0:00 /usr/sbin/httpd
apache 19391 0.0 0.4 22764 4772 ? S 15:44 0:00 /usr/sbin/httpd
apache 19392 0.0 0.4 22764 4772 ? S 15:44 0:00 /usr/sbin/httpd
root 19460 0.0 0.0 4276 688 pts/0 S+ 16:03 0:00 grep httpd
[root@localhost ~]#
打开浏览器看看 http://192.168.1.45/
这是红帽提供给我们的一个欢迎页面,如果自己编译安装的话,它的欢迎页面可能不是这样子的,而显示为
It works! 当然对于不同的服务器来讲,可能是不一样的
[root@localhost ~]# cd /etc/httpd/
[root@localhost httpd]# pwd
/etc/httpd
[root@localhost httpd]# tree conf.d/
conf.d/
|-- README
|-- manual.conf
|-- perl.conf
|-- php.conf
|-- proxy_ajp.conf
|-- python.conf
|-- squid.conf
|-- ssl.conf
|-- webalizer.conf
`-- welcome.conf #这个文件,欢迎信息就是以它来显示的,如果用户没有定义什么文档的话,就显示welcome.conf所定义的欢迎页面(也就是首页找不到了应该展开目录 但是Options -Indexes 是不让展开目录 ( 403禁止访问时 ) 就使用 /error/noindex.html 页面
)
如果删了或重命名welcome.conf 首页这不是这样子的了
0 directories, 10 files
[root@localhost httpd]# cd conf.d/
[root@localhost conf.d]# pwd
/etc/httpd/conf.d
[root@localhost conf.d]# mv welcome.conf welcome.conf.bak (只要不以.conf结尾就行)
[root@localhost conf.d]#
[root@localhost conf.d]# service httpd restart (重启一下吧)
停止 httpd: [确定]
启动 httpd: [确定]
[root@localhost conf.d]# service httpd reload (或者重载一下,最好还是重启吧)
重新载入 httpd:
[root@localhost conf.d]#
再次打开浏览器看看 http://192.168.1.45/
表示没有任何内容
默认情况下 网页在 /var/www/html 目录下
[root@localhost conf.d]# cd /var/www/html/
[root@localhost html]# pwd
/var/www/html
[root@localhost html]#
[root@localhost html]# ls 没有内容,所以 http://192.168.1.45/ 显示不出来任何东西
[root@localhost html]#
[root@localhost html]# vim a.html
<html>
<title>Hello world</title>
<h1>Haha</h1>
Welcome to our website
</html>
~
不用重启服务器 ,刷新 http://192.168.1.45/
就可以看到 a.html 了
点击 a.html 就打开了 http://192.168.1.45/a.html
默认页面,web服务器的默认页面一般在web服务器的配置文件中指定应该是哪一个文件的
我们来看一看web服务器本身的配置文件倒底是如何定义的
[root@localhost conf.d]# cd /etc/httpd/conf
[root@localhost conf]# pwd
/etc/httpd/conf
[root@localhost conf]#
[root@localhost conf]# ls 主配置文件是 httpd.conf
httpd.conf magic
[root@localhost conf]#
[root@localhost conf]# cp httpd.conf httpd.conf.bak (备份一下)
[root@localhost conf]# grep "Section" httpd.conf
### Section 1: Global Environment #第一段 全局环境段 全局配置段 (假如使用虚拟主机,对所有的虚拟主机都生效的)
### Section 2: 'Main' server configuration #第二段 主服务器配置
### Section 3: Virtual Hosts #第三段虚拟主机
第二段和第三段不能同时生效的, 要有主服务器配置 就不能使用虚拟主机
要有虚拟主机就不能使用主服务器配置
默认使用主服务器段 没有使用 虚拟主机段
[root@localhost conf]#
[root@localhost conf]# vim httpd.conf (ctrl+c 未执行)
所有以井号 (#) 开头的都是注释信息
井号 (#) 后面没有加空格,直接跟字符,表示可以启用的选项(在apache当中,叫指令) 在 apache的配置文件当中,就是由指令和指令对应的值组成(可以理解成参数和值)
directive value
指令是不区分字符大小写的,
但是值value,尤其是路径是要区分大小写(根据需要有可能需要区分大小写)
指令基本上都是全写的单词,一般都能做到见名知义的,
下图关于服务器的信息,都是由 ServerTokens 输出的
[root@localhost conf]# vim httpd.conf
#
# This is the main Apache server configuration file. It contains the
# configuration directives that give the server its instructions.
# See <URL:http://httpd.apache.org/docs/2.2/> for detailed information.
# In particular, see
# <URL:http://httpd.apache.org/docs/2.2/mod/directives.html>
# for a discussion of each configuration directive.
#
#
# Do NOT simply read the instructions in here without understanding
# what they do. They're here only as hints or reminders. If you are unsure
# consult the online docs. You have been warned.
#
# The configuration directives are grouped into three basic sections:
# 1. Directives that control the operation of the Apache server process as a
# whole (the 'global environment').
# 2. Directives that define the parameters of the 'main' or 'default' server,
# which responds to requests that aren't handled by a virtual host.
# These directives also provide default values for the settings
# of all virtual hosts.
# 3. Settings for virtual hosts, which allow Web requests to be sent to
# different IP addresses or hostnames and have them handled by the
# same Apache server process.
#
# Configuration and logfile names: If the filenames you specify for many
# of the server's control files begin with "/" (or "drive:/" for Win32), the
# server will use that explicit path. If the filenames do *not* begin
# with "/", the value of ServerRoot is prepended -- so "logs/foo.log"
# with ServerRoot set to "/etc/httpd" will be interpreted by the
# server as "/etc/httpd/logs/foo.log".
#
### Section 1: Global Environment
#
# The directives in this section affect the overall operation of Apache,
# such as the number of concurrent requests it can handle or where it
# can find its configuration files.
#
#
# Don't give away too much information about all the subcomponents
# we are running. Comment out this line if you don't mind remote sites
# finding out what major optional modules you are running
ServerTokens OS #指令后面跟值 例子 上面的未发现错误页面时输出的信息, OS表示还要输出操作系统版本相关的信息的,它可以接受好多个值 在 http://httpd.apache.org/docs/2.2/ "指令快速参考" 中
点 S 快速定位
ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full 这些值是用于定义如上面的例子未发现页面下方的信息显示的详细程度, 这是信息泄漏,所以这里显示的信息越少越好,,,,如果不想显示,或显示的最简略, 使用Major,只显示apache的主版本号,别的什么都不显示 , Minor 还有显示次版本号 min 还有显示最后位号 Prod[uctOnly] 显示你的软件是什么,当然包括版本号 OS 连操作系统版本都显示了 Full 显示全部信息
如果上不了网查的话,也可以装 httpd-manual 包 ,把这个包装了之后, 也会自动给你生成一个配置文件的
#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# NOTE! If you intend to place this on an NFS (or otherwise network)
# mounted filesystem then please read the LockFile documentation
# (available at <URL:http://httpd.apache.org/docs/2.2/mod/mpm_common.html#lockfile>);
# you will save yourself a lot of trouble.
#
# Do NOT add a slash at the end of the directory path.
#
ServerRoot "/etc/httpd"
[root@localhost conf]# yum -y install httpd-manual
Loaded plugins: product-id, security, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
file:///media/cdrom/Server/repodata/repomd.xml: [Errno 5] OSError: [Errno 2] 没有那个文件或目录: '/media/cdrom/Server/repodata/repomd.xml'
Trying other mirror.
Setting up Install Process
Package httpd-manual-2.2.3-82.el5_9.i386 already installed and latest version
Nothing to do
提示 已经安装
[root@localhost conf]#
[root@localhost conf]# cd /etc/httpd/conf.d/
[root@localhost conf.d]# pwd
/etc/httpd/conf.d
[root@localhost conf.d]# ls
看到了一个配置文件 manual.conf
manual.conf proxy_ajp.conf squid.conf welcome.conf
perl.conf python.conf ssl.conf
php.conf README webalizer.conf
[root@localhost conf.d]#
[root@localhost conf.d]# vim manual.conf
#
# This configuration file allows the manual to be accessed at
#
AliasMatch ^/manual(?:/(?:de|en|fr|ja|ko|ru))?(/.*)?$ "/var/www/manual$1"
# 只要在访问路径的后面加上 manual 就可以了
<Directory "/var/www/manual">
Options Indexes
AllowOverride None
Order allow,deny
Allow from all
</Directory>
~
[root@localhost conf.d]# service httpd restart #重启服务器
停止 httpd: [确定]
启动 httpd: [确定]
[root@localhost conf.d]#
浏览器访问 http://192.168.1.45/manual/
可惜是英文的 英文好对深入学习帮助很大的
其实是有人翻译的,叫 "apache指令参考手册",跟以前讲的内核的配置文档的翻译手册一样,叫金杜伯?翻译的,他是非科班出身的,不是学计算机的,在linux界非常有名,计算机界的很多大牛都是非科班出身的, 学金融的,学机械的,学国贸的,有个叫张叶的人,原来在新浪,后在金山,现在某公司做CTO,人家学国贸的(东南明科大学学国贸的) 冯大科的,在丁山云网做CTO,原来在阿里巴巴工作,学机械的,半路出家也未必不能成为真佛
[root@localhost conf.d]# cd - (进入上一次目录)
/etc/httpd/conf
[root@localhost conf]#
[root@localhost conf]# ls
httpd.conf httpd.conf.bak magic
[root@localhost conf]# pwd
/etc/httpd/conf
[root@localhost conf]#
[root@localhost conf]# vi httpd.conf
#
# This is the main Apache server configuration file. It contains the
# configuration directives that give the server its instructions.
# See <URL:http://httpd.apache.org/docs/2.2/> for detailed information.
# In particular, see
# <URL:http://httpd.apache.org/docs/2.2/mod/directives.html>
# for a discussion of each configuration directive.
#
#
# Do NOT simply read the instructions in here without understanding
# what they do. They're here only as hints or reminders. If you are unsure
# consult the online docs. You have been warned.
#
# The configuration directives are grouped into three basic sections:
# 1. Directives that control the operation of the Apache server process as a
# whole (the 'global environment').
# 2. Directives that define the parameters of the 'main' or 'default' server,
# which responds to requests that aren't handled by a virtual host.
# These directives also provide default values for the settings
# of all virtual hosts.
# 3. Settings for virtual hosts, which allow Web requests to be sent to
# different IP addresses or hostnames and have them handled by the
# same Apache server process.
#
# Configuration and logfile names: If the filenames you specify for many
# of the server's control files begin with "/" (or "drive:/" for Win32), the
# server will use that explicit path. If the filenames do *not* begin
# with "/", the value of ServerRoot is prepended -- so "logs/foo.log"
# with ServerRoot set to "/etc/httpd" will be interpreted by the
# server as "/etc/httpd/logs/foo.log".
#
### Section 1: Global Environment
#
# The directives in this section affect the overall operation of Apache,
# such as the number of concurrent requests it can handle or where it
# can find its configuration files.
#
#
# Don't give away too much information about all the subcomponents
# we are running. Comment out this line if you don't mind remote sites
# finding out what major optional modules you are running
ServerTokens OS
#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# NOTE! If you intend to place this on an NFS (or otherwise network)
# mounted filesystem then please read the LockFile documentation
# (available at <URL:http://httpd.apache.org/docs/2.2/mod/mpm_common.html#lockfile>);
# you will save yourself a lot of trouble.
#
# Do NOT add a slash at the end of the directory path.
#
ServerRoot "/etc/httpd" # 服务器的根目录,服务器的工作目录,不到万不得已不要随便改,除非你知道你自己在做什么,因为很多的其它路径都是相对于这个路径而言的
#
# PidFile: The file in which the server should record its process
# identification number when it starts.
#
PidFile run/httpd.pid #每一个进程都有一个pid号,尤其是服务类的软件,它运行起来 pid 号 还会保存在一个以进程命名的文件当中,文件在 run/httpd.pid,
run 是相对于 ServerRoot的路径(相对路径),所以上面的 ServerRoot 一改的话,牵一发而动全身
#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 120 #超时时间
# 用户通地三次握手建立连接,发起请求了,(TCP第一次握手发起来了,等它第二次确认,它就不来了,我们就等 120秒 (在这120秒内维持状态),超时就断开),跟TCP协议相关的
http://httpd.apache.org/docs/2.2/mod/quickreference.html#T
主要由 mod_cgi mod_ext_filter mod_proxy 三个模块来进行处理,跟TCP的报文读取(从缓冲中读取一个报文请求)有关,现在对这个不用特别关心
#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
#KeepAlive Off # 是否使用长连接,一般情况下,如果服务器的访问量不是特别的大,应该打开长连接,
KeepAlive On #把长连接打开,可能会极大的提高性能的,因为不打开长连接,每一个请求都要三次握手的 四次挥手
#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100 # 开启长连接后,不能让用户一直处于长连接状态,开启长连接后,最多一次只能请求100个资源, 打开长连接后,一直没有超时,一直在请求,不能无限的给你这样的优先权力,于是100个,当你的请求达到100个以后.断开,重新排队,可以自己定义多少个,设定为0表示无限制,只要用户自己不断开,就永远不断开
#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 15 #只是请求了一个资源,也没断开,不能让人一直在这里占用这个资源,所以15秒后断开,KeepAliveTimeout 与 上面的Timeout 是两回事,KeepAliveTimeout 是长连接的断开时长,,15秒其实己经够长了,对于一个比较繁忙的服务器,既想打开长连接,又不想让它占用过长时间的话,(很多用户请求在1秒钟之内就完成了,比如1秒钟内请求10个资源,一请求就断开了,这样子的话可以把 KeepAliveTimeout 降低一点 ,比如降低到5秒钟 ,对于非常繁忙的服务器,既能够帮助一个用户的多次请求,又能够尽可能的降低由于因为连接空闲而导致的资源浪费,可以降低到3秒 或 5秒,这实际上是需要调整的 ,, 没有放之四海而皆准的值 ,对不同的服务器我们需要去测试, ),(使用ab命令或 loadRunner (惠普公司的一个著名的专业级的测试工具,这个测试工具可以模拟你的应用程序的真实场景,而对服务器作接近于真实的测试的,使用ab命令其实是测不出来真实的结果,只能模拟出来结果,但是loadRunner 可以接近于真实的方式来进行测试,没办法讲这个工具的使用了,因为这个工具本身就有个认证,想使用它很困难,三两节课没法讲楚其简单的应用的,可以尝试自学一下)测一下)
##
## Server-Pool Size Regulation (MPM specific)
##
# prefork MPM # multi path modules,multi-processing modules 多处理模块 多道处理模块
# 它其实就是用于定义当多个用户同时访问的时候,我们的 web 服务器怎么响应
# 有多进程的 有一个进程响应多个请求的 多道处理模块就是定义apache响应多个用户请求时所工作的模型的
# mpm_winnt windows NT上专用的,因为windows本身是原生支持线程的,所以它是在windows上所使用的一种特殊的线程处理机制,
# prefork linux上支持的 (一个请求用一个进程响应)pre 预先的意思 prefork 就是预先生成进程
# worker linux上支持的 (一个请求用一个线程响应,因为linux是非真正意义上的线程,本来用线程性能其实更好的,但现实很不好)基于线程来工作的,一个进程响应多个用户请求,但是一个进程下使用多个线程来响应用户请求(首先它会生成两个工作进程,线程是进程的子单位,因此线程就会处于多个子进程当中,在worker下,我们的web服务器会生成进程,但进程不是响应用户请求的,每一个进程还会生成多个线程,用一个线程响应用户请求,)(一个请求用一个线程响应,web服务器启动起来以后,启动多个(一般是两个吧,将来请求越多,进程越多)进程,每个进程生成多个线程,每一个请求用一个线程来响应)(对于thread而言,由于多个线程共享同一个进程的资源,所以如果一个线程访问了某文件而且已打开的话,第二个线程访问同一个资源的时候就不用再次打开了,直接访问就可以了,所以效率比较高,但是多个线程在共享资源的时候,如果要写一个资源的话,会导致资源争用的,所以为了避免资源竞争,我们必须要实现加锁,因此如果我们不能良好的解决锁竞争的话,事实上线程倒底是不是比进程的效率更高,这个很难说,尤其是linux又不是原生态支持线程的,所以worker模型经测试发现,在linux上,还不如perfork模型的性能好,这也就是为什么默认使用prefork进程,而不使用worker进程)
# event linux上支持的 (一个进程响应多个请求,基于事件驱动模型来实现的)基于事件的驱动,一个进程处理同时多个用户请求,但是不是使用线程来响应的, 好像apache2.2的时候,对event并不支持?在2.4的时候才能支持event模型,并且默认好像是使用event,只要你的系统库支持(或者你的io支持),因为event模型是最强大的,nginx就是默认使用event模型,或者说运用了这种机制,(但是在红帽上的2.2的httpd当中,默认使用的是prefork的模型,一个请求用一个进程响应,稳定可靠,任何一个进程崩溃了,不会影响其它的进程请求,但是性能比较差,尤其是多个用户请求并发量非常大的时候,性能很差,因为它对资源消耗量比较多,而且有大量的进程切换 )
# http://httpd.apache.org/docs/2.2
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
# man httpd
# httpd -l 可以列出来当前服务器,你的进程编译的时候所支持的模型(所支持的模块)
# [root@localhost ~]# httpd -l
# Compiled in modules:
# core.c #支持核心 不仅仅包含http,还包含反向代理等各种额外的功能,如缓存等
# prefork.c #支持prefork
# http_core.c #支持http的核心,也就是core核心的补充
# mod_so.c #支持动态模块的加载
# 看它 没有worker模型
#
#[root@localhost ~]# rpm -ql httpd | grep bin
#/usr/bin/ab
#/usr/bin/htdbm
#/usr/bin/htdigest
#/usr/bin/htpasswd
#/usr/bin/logresolve
#/usr/sbin/apachectl
#/usr/sbin/htcacheclean
#/usr/sbin/httpd # 默认是运行,它默认运行的是 prefork
#/usr/sbin/httpd.event #有event
#/usr/sbin/httpd.worker #有worker 意味着将来想使用worker模型的服务的话, 运行 /usr/sbin/httpd.worker 而不是 /usr/sbin/httpd (想使用worker模型的服务的话, 把 /usr/sbin/httpd.worker 当作服务器执行就可以了 )
#/usr/sbin/httxt2dbm
#/usr/sbin/rotatelogs
#/usr/sbin/suexec
#/var/www/cgi-bin
#/var/www/icons/binary.gif
#/var/www/icons/binary.png
#/var/www/icons/binhex.gif
#/var/www/icons/binhex.png
#/var/www/icons/small/binary.gif
#/var/www/icons/small/binary.png
#/var/www/icons/small/binhex.gif
#/var/www/icons/small/binhex.png
#[root@localhost ~]# httpd.worker -l
#Compiled in modules:
# core.c
# worker.c # 其它的跟httpd -l 一样,只不过这里是 worker.c (而 httpd -l 是prefork.c)
# http_core.c
# mod_so.c
#
#
# [root@vas2 ~]# httpd -V 查看Apache当前的MPM模式(好像不行,不行,它只是默认的httpd 即prefork模式下的结果)
# [root@localhost ~]# vim /etc/sysconfig/httpd
# httpd 默认的是没有写的,说明有脚本当中己经定义好了是使用/usr/bin/httpd(也就是prefork模型)
# 如果 #HTTPD=/usr/sbin/httpd.worker 去掉注释的话,就是启动了worker模型,它就不会使用默认值/usr/bin/httpd 了,
# 就是使用 worker 模型,很显然,要使用event模型的话, 就是改成 HTTPD=/usr/sbin/httpd.event 就是没改,还是使用默认的
# [root@localhost ~]# httpd.event -l
# Compiled in modules:
# core.c
# event.c # 这里显示支持event,在2.2中event是测试模型,2.2中不建议使用的 2.4以后event才成熟起来并成为一个独立的MPM,所以2.2这里虽然有,不建议使用,它是一个测试,中间可能有很多不完善的地方,这就是2.2当中不使用event的原因
# http_core.c
# mod_so.c
# [root@localhost ~]#
# 给大家说明白了在红帽上怎么切换使用不同的MPM的对应可执行程序的,
# 这个可执行程序,一旦编译好了之后,它支持哪一种MPM,事实上已经确定了,再想换就不可以了,所以红帽就编译了三个,而且叫不同的名字,想使用哪个,就调用哪个,通过这种方式来实现在三个之间进行来回切换的
<IfModule prefork.c> # <IfModule 是apache中重要的一种使用机制, (IfModule 如果某个模块配置的话,如果启用了) 如果prefork模块启用的话,只对下面几行的内容生效(下面这一片),<IfModule 可以理解成是一个容器,这个容器中所有的配置属性,只对这个容器中所定义的对应的对象生效
StartServers 8 # 服务器 刚一启动,就启动8个空闲进程
MinSpareServers 5 #最少(最小)空闲进程,如果有4个请求进程的话,还剩下4个空闲进程,此时又要启动一个空闲进程了,随时保证最少有5个空闲进程随时接受用户的请求的
MaxSpareServers 20 #最多(最大)空闲进程,500个用户请求进程,退出450个请求,450个进程都空闲了,为了不浪费资源,所以要杀死( kill )空闲的多余的进程,最多只保留到20个
ServerLimit 256 #当前这个服务器启动起来以后,MaxClients是可以调整的,但是最大不能超过 ServerLimit 的值, 所以 ServerLimit 的目的是为了给MaxClients指定一个上限值的,指定硬限制的 ,
MaxClients 256 #最多只允许多少个请求同时连进来,如果再有多的,后面等待,要想调大,必须顺应 ServerLimit 调大,(所以 MaxClients 想调大,要事先关掉web服务器, 把整个进程给它kill掉,把 ServerLimit 调大,把MaxClients调大 ,然后再启动才可以 (不能说调大后一重启就生效了,这是不支持重启调大的) (服务器性能足够好,可以调大一点,不过可以计算一下,同时最大并发在线数256个请求,如果一个请求在0.5秒内完成,意味着1秒钟可以响应512个请求,一小时是多少个,一天是多少个,256这个数值,一天所能够接受的用户的访问数量是非常大的,除非你的服务器性能更强,或者经过测试,(不建议盲目的调,可以调一下测一下,哪一个最符合需要)(必须要自己调,没有放之四海而皆准的应用,,不同的应用模型,每天客户访问量,访问的页面,而且访问最多的页面,就是资源密集程度的位置,你的访问数据的热区都不一样,所以哪怕两个网站一模一样,但是由于客户端来源不同,数据热区不同,它所需要调整的参数也是不一样的.))(看文档的话,最好看些方法类的东西,而不要看告诉你结果类的东西,结果是没有意义的)
MaxRequestsPerChild 4000 # 刚才说过可以生成很多个服务器进程,这个进程接受用户请求,用户请求结束了,进程就空闲了,空闲之后,可能没把它杀死,因为可能又有新的用户请求过来了,所以直接就能响应了,最多响应4000次的请求(每一个子进程最多响应4000次的请求,一旦达到这么多次,无论如何把它kill掉,再生成一个新的进程重新响应)
</IfModule>
# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c> # worker是一个线程响应用户请求的
StartServers 2 #默认启动几个进程,这是进程数,刚开始启动的进程数 (默认情况下,启动2个server进程,最小空闲的线程数是25,意味看每一个进程里面启动十几个线程就好了,每一个里面启动25个线程,就满足50个的需要了) (很显然,当线程需要的越多,用户的客户端越多,启动的线程数就越多,最是我们限定了,最多150个,,所以需要6个进程(150/25), 而默认是启动2个,数值还需要测试,哪个数据的模型是最适合的模型,)
MaxClients 150 # 最多允许多少个用户请求连进来(与 prefork 中的 MaxClients一样,,比 prefork 中 的值要小,刚说过 prefork 性能更好一点)
MinSpareThreads 25 #最小空闲线程数,是总体里的,所有进程里的线程加起来的线程数,可不是单个进程的线程数
MaxSpareThreads 75 #最大空闲线程,是总体里的,所有进程里的线程加起来的线程数,可不是单个进程的线程数
ThreadsPerChild 25 #每一个进程,最多可以生成多少线程 150个请求(150个线程) 需要6个进程吧
MaxRequestsPerChild 0 #每一个进程最多显示多少个请求,事实上是由线程来显示请求的(一个请求里的线程可能有多有少?一个进程里面的线程可能有多有少?也可能并不是每个线程都在接受请求的),所以这里进程没法限定了, 0 表示不做限定的
</IfModule>
#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, in addition to the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
#
#Listen 12.34.56.78:80
Listen 80 #监听,指定监听的地址和端口的,只不过地址是可以省略的,如果不带ip地址,表示是监听本机所有地址上的80端口,而且可以监听多个端口,listen指令可以监听多次的
Listen 8080 #可以同时监听多个端口
Listen 172.16.100.1:8080 #它只能表示只监听哪个地址的哪个端口
#
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need
# to be loaded here.
#
# Example:
# LoadModule foo_module modules/mod_foo.so
# LoadModule 关键字 模块名称 模块路径(是相对路径,相对于/etc/httpd,相对于apache的根而言)
# 哪个模块不想装载,注释掉就OK了
# apache是模块化的, LoadModule 表示指定apache在启动的时候,装载的模块
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_alias_module modules/mod_authn_alias.so
LoadModule authn_anon_module modules/mod_authn_anon.so
LoadModule authn_dbm_module modules/mod_authn_dbm.so
LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_owner_module modules/mod_authz_owner.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_dbm_module modules/mod_authz_dbm.so
LoadModule authz_default_module modules/mod_authz_default.so
LoadModule ldap_module modules/mod_ldap.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule logio_module modules/mod_logio.so
LoadModule env_module modules/mod_env.so
LoadModule ext_filter_module modules/mod_ext_filter.so
LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
LoadModule usertrack_module modules/mod_usertrack.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
LoadModule dav_module modules/mod_dav.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule info_module modules/mod_info.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
LoadModule actions_module modules/mod_actions.so
LoadModule speling_module modules/mod_speling.so
LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule cache_module modules/mod_cache.so
LoadModule suexec_module modules/mod_suexec.so
LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule file_cache_module modules/mod_file_cache.so
LoadModule mem_cache_module modules/mod_mem_cache.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule version_module modules/mod_version.so
#
# The following modules are not loaded by default:
#
#LoadModule cern_meta_module modules/mod_cern_meta.so
#LoadModule asis_module modules/mod_asis.so
#
# Load config files from the config directory "/etc/httpd/conf.d".
#
Include conf.d/*.conf # conf.d/*.conf 都是主配置文件的组成部分,就是因为使用Include包含进来了
#
# ExtendedStatus controls whether Apache will generate "full" status
# information (ExtendedStatus On) or just basic information (ExtendedStatus
# Off) when the "server-status" handler is called. The default is Off.
#
#ExtendedStatus On
#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.
#
# User/Group: The name (or #number) of the user/group to run httpd as.
# . On SCO (ODT 3) use "User nouser" and "Group nogroup".
# . On HPUX you may not be able to use shared memory as nobody, and the
# suggested workaround is to create a user www and use that user.
# NOTE that some kernels refuse to setgid(Group) or semctl(IPC_SET)
# when the value of (unsigned)Group is above 60000;
# don't use Group #-1 on these systems!
#
User apache # apache的work进程(工作进程) 都要使用普通用户运行的,这里指定了普通用户的用户名
Group apache #这里指定了普通用户的组
................
................
上面讲的是apache的全局指令, 事实 apache 的全局指令还有很多,可以查看文档指令参考列表,或者将来用到的话,再回过头来解释.